Sean McGinnis is a film student who moves to Los Angeles to break into the movie business. While looking for work, he passes the time watching rented videos, preferring classic films. He sets out to watch Citizen Kane, but the videotape has accidentally been switched with an adult movie called Citizen Cum. Sean becomes instantly obsessed with the star of Citizen Cum, Johnny Rebel. His interest in Johnny leads Sean to turn down work in the mainstream film industry to become a cameraman for Men of Janus, the production company that has Johnny under exclusive contract. On his first shoot, Sean ends up as a “Fluffer” for Johnny, performing (offscreen) oral sex on him to help him maintain an erection and reach orgasm for the “money shot.” He learns that Johnny’s real name is Mikey, he is “gay-for-pay” and doesn’t perform oral sex on other men or even kiss. Johnny has Sean fluff him on additional productions, and Sean’s infatuation continues to grow. He confides his feelings for Johnny to co-worker Silver, who tells him that the relationship is hopeless because Johnny’s a porn star and straight. Meanwhile, Johnny’s girlfriend Julie, who works as a stripper under her stagename Babylon but who has tried to move into mainstream acting, learns she is pregnant.
Trying to break from Johnny, Sean begins dating an acupuncture student named Brian. However, Brian breaks up with Sean because of his emotional unavailability, the result of his continuing obsession with Johnny, and because Brian had a bad experience with a past boyfriend who could not have sex without watching porn.
Johnny’s crystal meth use spirals out of control. He goes on a five-day binge and misses a scheduled film shoot. The film’s producer Sam Martins forces Sean to fluff Johnny’s replacement for the shoot. Johnny shows up late to the set and is fired. Julie decides to get an abortion since she cannot rely on Johnny to help raise a child. She breaks up with Johnny and changes the locks to her apartment.
At the studio an expensive video camera goes missing and company manager Chad Cox is found dead in his apartment. The police seek Johnny, under his real name Michael Rossini, for questioning. Johnny turns to Sean for help, and together they flee to Mexico. Once in Mexico, Sean sells his car for getaway money, and the two settle into a cheap Mexican motel. Johnny initially denies involvement in Chad’s death but later confesses to Sean that he killed Chad accidentally during a fight over the payoff for stealing the camera for drug money. Stunned, Sean goes out to clear his head, returning later with tequila and snacks. That night, Johnny offers to let Sean service him sexually, but for the first time Sean declines. Sean shares in oblique terms memories of being sexually abused as a child by an adult male neighbor. Johnny starts to cry, saying he can relate because of some of the “fucked up shit” he’s been through and that he was made to do things he didn’t want to do. Sean comforts Johnny and for the first time calls him “Mikey.” They kiss, and then fall asleep.
When Sean wakes the next morning, Johnny is gone along with all of Sean’s money. Sean initially tries to hitchhike back to the United States, but ends up accepting an offer to go further south to St Ignacio, an idyllic location he had previously suggested he and Johnny visit. Babylon packs up her apartment and drives north away from Los Angeles. Mikey survives in Mexico by committing armed robberies, his new gritty reality counterpointed as Sean reads a fan letter written to Johnny, who remains a figure of fantasy. Sean tosses the letter on the side of the road, leaving it – and Johnny – behind.