The film follows Helen Quilley (Gwyneth Paltrow), a young Englishwoman living in London who has just been fired from her public relations job. The plot splits into two parallel universes, based on the two paths her life could take depending on whether she catches a London Underground train or not.
In the timeline in which she makes the train, she meets James (John Hannah) on the underground and they strike up a conversation. She gets home in time to catch her boyfriend Gerry (John Lynch) in bed with his American ex-girlfriend Lydia (Jeanne Tripplehorn); she dumps him and moves in with her friend Anna (Zara Turner). James continues to serendipitously pop into Helen's life, cheering her up and encouraging her to start her own public relations firm. Helen gets a new makeover by cutting her hair short and dying it blond. She and James fall in love despite Helen's reservations about beginning another relationship so soon after her ugly breakup with Gerry.
In the timeline in which she misses the train, she then hails a taxi instead but gets mugged when a man snatches her handbag. Helen hits her head in the scuffle and goes to hospital. She arrives home late, giving Lydia time to leave. Helen carries on with her life oblivious of Gerry's infidelity, and begins working part-time jobs to pay bills. Gerry conceals his infidelity and juggles the two women in his life; Lydia even interacts with Helen on several occasions. Helen has a number of conflicts with Gerry, then discovers she's pregnant with his baby, but delays telling him.
In the first timeline, Helen discovers she's pregnant, believing it is with James' child, and goes to see him at his office. She is stunned to learn from James' secretary that he is married. Upset, she disappears. James finds her on a bridge and explains that he was married but is now separated and planning to divorce. He and his soon-to-be ex-wife maintain a cordial relationship for the sake of his sick mother. After she and James declare their love for another, Helen walks out into the road and is hit by a car.
In the second timeline, Helen tells Gerry she has a job interview with an international PR firm. Thinking Helen is at the interview, Gerry sees Lydia, who is also pregnant with his child. While there, the doorbell rings and Lydia tells Gerry to answer it. Helen is there, and is stunned when Lydia tells her she can't do the interview because she's "deciding whether or not to keep your boyfriend's baby." Distraught over finally catching her two-timing boyfriend's infidelity, Helen runs and falls down Lydia's staircase.
In both timelines, after her accident (hit by a car in the first timeline, and falling down the stairs in the second) Helen goes to hospital and happens to end up in the very same emergency room in both timelines, and loses her baby. In the timeline in which she caught the train, she dies from internal bleeding in the arms of her newfound love. In the timeline in which she didn't, she recovers and tells Gerry to leave for good. Before waking up, she sees flashes of the other Helen's life.
In the final scene (now taking place solely in the "missed the train" universe), James is leaving the hospital after visiting his mother, and Helen is leaving after ending her relationship with Gerry. Helen drops an earring in the elevator and it is picked up by James. This mirrors the start of the film, where James picks up Helen's earring on the elevator after Helen is fired from her job. Before the doors close, James tells Helen to cheer up, and repeats his line, "You know what the Monty Python boys say..." Helen (who, in the beginning of the film, assumed the rejoinder to be "always look on the bright side of life.") says, " Nobody expects the Spanish Inquisition." She and James stare at one another, each surprised by her response. The doors close and the audience is left to wonder what will become next.