The novel opens with its first-person narrator, Hannah Wilson, bound to a chair in a nondescript room, preparing to die at the hands of a man she fell in love with despite knowing he was an accused serial killer. The narrative then shifts backward to trace how she arrived at this moment.
Hannah works in communications at a nonprofit in Minneapolis, stuck in a dead-end career she took as a stepping stone after graduating during the recession. She spends her days scrolling social media, keeps a perpetually blank document open for a novel she intends to write, and dates emotionally unavailable men. After her latest romantic interest, Max Yulipsky, ghosts her, Hannah redirects her emotional energy into an online true crime forum.
A young law school graduate named Anna Leigh has disappeared in Georgia after leaving the law firm where she interns. Her strangled, stabbed body is found in a ravine, followed by those of two more women: Kimberly, a gas station employee, and Jill, a fitness influencer. Forum members obtain Jill's client list and divide it for investigation. Hannah's portion includes the name William Thompson, a lawyer she dismisses as harmless. When a fourth victim, Emma, is found after a dating app date with William, he is arrested. Hannah becomes fixated on his composed demeanor during the perp walk.
On impulse, Hannah writes William an angry letter. He writes back with warmth and curiosity, asking personal questions while neither admitting nor denying guilt. Over weeks, their correspondence deepens. William shares details about his unhappy childhood, his domineering father, Mark Thompson, and his competitive brother, Bentley. Hannah shares her frustrations about her stalled career and loneliness. When her best friend Meghan announces an engagement, Hannah feels further isolated. William calls her beautiful and asks her to be his girlfriend. His letter arrives the same day she is fired for neglecting her duties, making his proposal the only bright spot in her collapsing life.
Hannah drives to Georgia for William's trial, letting her apartment lease expire and putting her belongings in storage. At the courthouse, she meets Dotty, a married mother from Nashville who has separated from her husband over her fixation on William. She also meets Lauren, a 19-year-old who previously fell in love with a different convicted killer. The three form a trio of supporters at the trial. When William enters the courtroom, Hannah catches his eye briefly and interprets his slight smile as confirmation of their connection.
The prosecution establishes William's connections to all four victims. Meanwhile, Hannah independently investigates the Thompson family, following Mark to each location tied to the murders. Mark eventually approaches Hannah to thank her for supporting his son, drawing her into the family's orbit. At a post-prosecution gathering, she meets Bentley, who warns her that William is dangerous, describing a childhood in which William chased him with a knife, broke his arm, and hid a dead rabbit under his bed. He advises Hannah to go home, then abruptly pins her against a wall and kisses her before disappearing without explanation.
The defense presents character witnesses who describe William as kind and nonviolent. The case is thrown into chaos when a fifth body, that of bartender Kelsey Jenkins, is discovered in the same ravine while William is still in jail. The jury returns a verdict of not guilty on all counts, and the victims' families are devastated.
That evening, William appears at Hannah's hotel room with flowers. They have sex for the first time, Hannah's body heightened by the fear of death. William proposes without a ring, and Hannah says yes. They move into a house in his hometown owned by his parents. While William works, Hannah searches the home and finds a locked box containing a gun, a gym card from Jill's gym, a hair tie, a pack of cigarettes containing a green matchbook with a Celtic logo, and a worn bookmark. She photographs everything, interpreting the items as possible murder souvenirs. At a coffee shop, she discovers the matchbook matches those visible in a photo from the bar where Kelsey worked, implying a connection to Kelsey's murder even though William was in jail at the time.
At a Thompson family party celebrating William's release, William publicly announces their engagement. Hannah corners his longtime friend Alexis Hutchinson, who reveals that William once broke off a potential romance with her, crying and saying he was afraid he would hurt her. Alexis also admits that Mark pressured her to testify favorably at the trial. Hannah invites Bentley to the bar where Kelsey worked. A regular greets Bentley by name, though Bentley claims the man is mistaken. The outing turns hostile, and Hannah storms out.
The next morning, Bentley arrives at the house with a fast-food meal laced with a sedative. Hannah loses consciousness and awakens tied to a chair in the room from the novel's opening, revealed to be a wing of the Thompson family law office. Bentley confesses to killing all five women. Anna Leigh was having an affair with both brothers; after Bentley strangled her during a rough encounter, he realized the act gave him power over William. He killed Kimberly because she recognized him near William's condo and he impulsively told her about the first murder. He killed Jill and Emma to further implicate his brother.
Bentley's deeper motive traces to adolescence. His high school girlfriend, Gracie, died at a party after taking tainted cocaine with William. William watched her die rather than call for help, and Mark covered up the evidence. Bentley killed Kelsey during the trial to cast doubt on William's guilt and confirms he was at the ravine the same night Hannah visited, having considered killing her then.
Hannah offers to sleep with Bentley in exchange for her life. He unties her, and they have sex as she accepts what she believes is her imminent death. William bursts in, having discovered Hannah's absence and her investigative notebook. He arrives with the gun from his desk, beats Bentley, and holds him at gunpoint. Instead of killing him, William orders Bentley to leave the country permanently. Bentley agrees and leaves.
William drives Hannah home and reveals he knew Bentley was the killer but could not turn in his own brother, partly out of guilt over Gracie's death. He explains that the items in his desk were planted by Bentley, who had a lifelong habit of hiding incriminating objects in William's belongings. William tells Hannah he loves her but cannot trust her after finding her notebook weighing his guilt and innocence. He breaks up with her. They have sex one final time, and Hannah reflects that William may never have been the person she truly wanted.
Hannah moves back to Minnesota, takes a job as a barista, and goes on unremarkable dates. She writes William unanswered letters and considers reporting Bentley but has no evidence. She admits to a small thrill at knowing Bentley is still free. In the final scene, Max and his girlfriend Reese come into the coffee shop. Max notices Hannah's visibly pregnant belly. She does not know whether the father is William or Bentley, since both share a gene pool. She reflects that the child will reveal who he is when he arrives, and she will know whom to blame if bodies start to pile up again.