When David (Liam Neeson) misses his flight home from New York and, as a result, the surprise party his wife Catherine (Julianne Moore) has planned for him, Catherine is forced to swallow her disappointment and any suspicions and return to the waiting guests.
Reading a text message sent to David's phone the following morning from one of his female students, Catherine's fear grows. The successful couple, Catherine, a doctor, and David a professor of music, have a 17-year-old son, Michael (Max Thieriot), and to an outsider, they have everything. But their careers and raising a child have put strains on the marriage; their relationship is suffering greatly from loss of communication and intimacy.
Two weeks after the surprise party, Catherine and David are at dinner with friends when Catherine excuses herself to use the restroom. There she meets an alluring young woman who, in those brief moments, connects with Catherine-it is Chloe (Amanda Seyfried). Returning to the table where they're now playing "spot the hooker", Catherine watches with interest as Chloe approaches an older businessman. On the drive home Catherine finally asks David if he intentionally missed his flight from New York to stay for drinks. When he claims he did not, she knows she has caught him in a lie.
Now more suspicious than ever that David is having an affair, Catherine seeks out Chloe, an escort, hiring her to test David's fidelity. Meeting regularly, Catherine absorbs the explicit details Chloe shares of her encounters with David, igniting Catherine's jealousy and awakening long-dormant sensations.
Soon caught in a web of sexual desire, Catherine finds herself on a journey that places her family in great danger-is it too late to stop Chloe?