Kyle Kingson (Alex Pettyfer) is the arrogant and vain son of wealthy and equally as arrogant and vain news anchor Rob Kingston (Peter Krause). When he wins student body president, he bullies the eccentric Kendra Hilferty (Mary-Kate Olsen) for being ugly and strange at the after-party. Disgusted, Kendra magically transforms Kyle into a bald, tattooed and scarred shell of his once-handsome self. Kendra says Kyle has until the next spring to find someone who loves him or he stays this way forever. Rob takes Kyle to live in a private condo with their maid, Zola (Lisa Gay Hamilton), and Kyle's blind tutor, Will Fratalli (Neil Patrick Harris). Rob initially promises to support his son, but gradually neglects his son over time and stops visiting him after work altogether. Angry and hurt, Kyle finds sympathy from Will and Zola.
As spring draws closer, Kyle finds himself infatuated with Lindy Taylor (Vanessa Hudgens), a girl from his former school who he had initially been as distant to as he was to Kendra. When Lindy and her father are about to be mugged by two brothers on the street, Lindy's father shoots one of the brothers, the surviving one vowing vengeance by taking Lindy's life. Kyle saves Lindy and her father, and arranges for Lindy to move in with him for her own safety. Initially, Lindy is furious about hiding, since she was to go to Machu Picchu on a field trip - but after she claims she's seen worse when Kyle reveals himself to her (now calling himself "Hunter" around her), they warm up to each other. Kyle writes a letter to Lindy professing his love to her, but he never plans to give it to her, in fear of Lindy not feeling the same way. Will and Zola continue to help Kyle win her over, as the two begin to fall in love. In time, he completely wins her over when they read Frank O'Hara's poem "Having a Coke with You" together out loud. Closer to spring, Kyle makes a deal with Kendra that if he succeeds in winning Lindy's heart, she will restore Will's vision and grant citizenship to Zola's three children in Jamaica.
Lindy receives a text message from her father that the criminal who threatened her life is in jail. She and Kyle spend an afternoon at one of Rob's private cottages on a lake. As they are about to kiss, Lindy receives a call notifying her that her father overdosed and is in a hospital. She leaves to see her father, and Kyle gives her his letter, but regrets doing so when she tells him he's a good friend before leaving. Heartbroken, Kyle does not answer Lindy's phone calls, after she reads his letter. Inspired by Will and Zola, Kyle goes to meet Lindy one last time before she leaves for Machu Picchu, and explains he did not answer her calls because he thought she only liked him as a friend. Lindy professes her love, and departs for Machu Picchu. Kyle's normal, handsome self is restored with Kendra's spell broken, but Lindy decides against leaving and tries to find "Hunter" again. She initially ignores Kyle while searching for Hunter, only for Kyle's phone to ring when she calls "Hunter". Realizing Hunter was Kyle, the two share a kiss in the street.
Will wakes up one morning and to his delight can see again. Zola finds three green cards for her children in the mail from the government. Kendra is also seen approaching Rob Kingson's office as a new intern, implying that Kendra will likely do the same thing to Rob as she did to Kyle. In the credits, a series of photographs show that Kyle and Lindy went around the world together - including Machu Picchu.