In the small, snow-buried fishing town of Rock Bay, an anonymous figure creates a social media meme featuring a frozen red rose on the town's recognizable dock, inviting users to repost with their worst "death fear." The creator uses the handle "Janie Dow" (a play on "Jane Doe") and distributes the meme by friend-requesting Kason Risby, a popular student certain to share it. The meme spreads rapidly through Rock Bay High and St. Mary's, the nearby all-girls private school. In chapters narrated from the creator's perspective, identified only as "Fear," the reader learns this person endured severe childhood abuse that the town ignored. The meme is not a game but a vehicle for revenge.
Isabel "Izzy" Tindall is a reserved senior at Rock Bay High who prefers to stay in the background. Her older sister, Lia, is away at college, and her best friend, Sydney (Syd), is outgoing and socially confident. Izzy nurses a quiet crush on Justin Rae, the hockey team captain. Her cousin Amiyah (Miyah), who attends St. Mary's, rounds out her closest circle. When the meme dominates school conversation, Izzy's fear is suffocation, Syd's is being stabbed, and Miyah's is being dragged by a car. In class, Izzy is partnered on an Edgar Allan Poe project with Axel Gray, a brooding loner who declares that every way to die is equally terrifying.
That evening, the girls attend a party at the mansion of Mariella Whitmore, one of the school's most popular students. Izzy spots Axel outside, unusual since he never socializes, and shortly after he leaves, Debbie, a member of Mariella's clique, storms out in a rage. On the drive home, Izzy discovers Debbie lying dead in her yellow dress near Ruby's café, the back of her skull crushed. As they wait for police, a second body is found in the river: Kason Risby. Debbie's posted fear was falling; Kason's was drowning. Each dies according to their stated fear, and Izzy concludes this is a double murder.
Axel is alive the next morning but furious that police questioned him after Izzy mentioned seeing him at the party. He admits he deeply hated Kason but refuses to explain why, and he has no alibi since he lives alone. Through conversations with classmates and her counselor, Izzy learns about tangled romantic dynamics in the popular group and grows convinced the deaths are linked to the meme.
Izzy meets Tristan Sykes, a friend of Lia's who graduated the year before and now runs his late father's fishing boat. At the docks, they find a torn scrap of fabric in the water that does not match Kason's clothing, suggesting it belongs to the killer. Tristan reveals he is Axel's cousin, though not close, and gives Izzy his number. On multiple occasions, a dark hooded figure watches Izzy from the town square before vanishing.
Justin begins paying Izzy unexpected attention. He suggests that Jessie Gardner, a girl on the fringes of the popular clique, may have a motive: Kason strung her along romantically, and she was obsessively jealous. Before Izzy and Justin can confront Jessie, word breaks that she is missing. Her posted fear was being stabbed, and her body is found in a field the next day. Chapters from the killer's perspective reveal an operation based in a hidden barn on old family property, where the killer practiced on a "Victim Zero" and targets victims whose posted fears mirror punishments the killer endured as a child.
The killer next kidnaps Julia Stone, a St. Mary's student whose posted fear is starving to death. Julia is chloroformed and locked in a room at the barn but manages to escape, staggering to Izzy's house for help. Tristan, who is visiting Izzy at the time, helps bring Julia inside. Tristan also reveals Axel's painful past: Axel's mother overdosed when he was eight, and he moved in with Tristan's family, where both boys experienced abuse. Tristan's mother later died after falling down the stairs while Axel was home alone with her; Axel told police she fell while drunk.
During a severe snowstorm that closes school, someone chases Izzy through the darkened building and shoves her to the ground. She discovers Justin's locker has been broken into. The sheriff warns Izzy she is dangerously involved, and she is grounded. That night, the killer kidnaps Miyah near Izzy's house, ties her to an SUV, and drags her, the death she feared most, deliberately driving past Izzy's home. Justin climbs through Izzy's window and reveals the stolen item from his locker: Kason's burner phone, which contained threatening messages between Kason and Axel and evidence of drug dealing. Justin had withheld it to protect Kason's mother's political aspirations. He and Izzy drive to Axel's apartment to investigate, and upon returning to her block, they discover tire tracks with a bloody trail. Izzy recognizes Miyah's fear and screams. Miyah's body is found near the industrial estate.
Izzy discovers that her pink notebook, in which she had been cataloging victims, suspects, and fears, is missing from her desk. She recalls seeing what looked like a pink notebook in Justin's car. She receives a text from an unknown number luring her out with the promise of truth, assumes the sender is Axel, and sneaks to the docks. There she finds Tristan, who received a similar text supposedly from Axel redirecting them to the barn. At the barn, Tristan goes inside first. Izzy hears screaming and shattering glass.
Rushing in, Izzy stumbles over Justin's body; he has been dead for hours, stabbed. Tristan turns on the light, revealing himself as the killer. Axel is locked in a closet, badly injured, a captive rather than the perpetrator. Tristan confesses that his parents subjected him and Axel to years of abuse, including beatings, starvation, and confinement, while the town turned a blind eye. He chose victims whose posted fears mirrored his childhood punishments. He plans to frame Axel first, then Justin by planting Izzy's stolen notebook in his car, and finally Izzy as Justin's accomplice. Justin found the notebook, confronted Tristan, and was killed.
Izzy pretends to sympathize, buying time. She persuades Tristan to release Axel so Axel can answer Tristan's lingering question about his mother's death. Axel emerges with a head wound and silently confirms the death was not an accident. When the moment comes, Izzy smashes a mug into Tristan's head, and she and Axel flee. Tristan recovers and catches them near the port, revealing he is carrying a gun. Syd arrives in her car, lured there by a text from Tristan. Tristan stabs Syd, but Syd seizes the gun and shoots him in the neck before dying. Axel drives Izzy away in Syd's car but passes the police station without stopping. When Izzy questions him, he locks the doors and smirks. The novel ends with his words: "It's like Tristan said, Izzy. Murder really does run in the family" (339). Having killed Tristan's mother years earlier, Axel now holds Izzy captive; the standalone novel ends with her fate deliberately unresolved.