The movie begins with Katey (Romola Garai) narrating on how she ended up in Havana to a montage of postcards and Havana sights. Her father, mother, and sister are riding in the car with her to a fancy hotel. Katey explains that Castro is leading a revolution against the current government of Cuba, but everyone at the hotel seems at ease. At the hotel pool Katey finds her sister sitting with some other Americans, including James (Jonathan Jackson), who introduces himself as the son of her father's boss. At this point the waiter, Javier (Diego Luna), arrives with the drinks and Katey accidentally knocks the tray over. One of the girls calls him a derogatory name and tells him to get more drinks. Katey feels bad and tries to talk to Javier, but he is not interested.
Katey watches a movie of her mother and father dancing and wishes she was as good as they were. She and her father dance a bit. The next day in class Katey is asked to read aloud from The Odyssey and it is a passage about love and passion (foreshadowing!). After class James asks Katey to a party at the country club and she agrees. While walking home from school she sees Javier dancing at a street party and he offers to walk her home. They stop to listen to a street band and police show up, stopping Javier while Katey runs away.
The next day Katey tries some of the dance moves she saw. Javier sees her and asks her to come see the real dancers Saturday night, but she says she is already going to the country club. Javier gets upset and leaves.
Katey wears one of her maid's sexy dresses to the party and impresses James. Katey convinces him to take her to the Cuban club where Javier is dancing with the ladies. Javier dances with Katey while James sits at the bar. Soon he is accosted by Javier's brother, who tells him that they will eventually kick the Americans out of Cuba. Javier comes over and argues with his brother. James takes Katey back to the car and tries to seduce her, she refuses and runs away. Katey goes back to the club and Javier agrees to walk her home.
The next day Katey walks by a dance class in progress and sees Patrick Swayze (gasp!) teaching it. He asks if anyone wants to enter the big dance contest and then dances with Katey for a bit. She grabs a flyer for the dance. While walking to the pool, James apologizes to her and then tells her that Katey's sister saw Javier with her and got him fired. Katey argues with her sister and goes to find Javier. He is now working at a chop shop with his brother. She asks him to enter the dance contest with her, but he refuses. Meanwhile, it is becoming apparent that Javier's brother is helping the revolutionaries.
The next day Javier shows up at Katey's school and agrees to enter the dance contest with her. They start teaching each other dance moves and Javier convinces her to "feel the music". They practice all the time, Katey dances some more with Patrick Swayze (gasp!), until it is the night of the dance. They dance with the other couples on the floor and are chosen to go on to the next round. Katey's parents, however, disapprove of her relationship with Javier but Katey reconciles with them. On the night of the final round of the contest, while Katey and Javier are on the dance floor, Javier sees his brother and some revolutionaries disguised as waiters and the police soon try to arrest them. The contest stops as everyone flees the club and Javier has to save his brother from the police. Javier and his brother talk about how they miss they dad, then they hear that Batista has fled the country and join the celebration.
Later, Javier comes to the hotel and finds Katey. He takes her to the beach and they do the horizontal mambo. The next day Katey's parents tell her they are leaving Cuba and she has one last night with Javier. They go to the Cuban club where they first danced and the floor is theirs. Katey's family is there to see her and Katey narrates that she doesn't know when she will see Javier again, but this will not be their last time to dance together.