Purdy completed 25 of 36 passes for 353 yards, two touchdowns and no interceptions. He and the 49ers’ offense got a boost from the return of running back Christian McCaffrey, the reigning NFL Offensive Player of the Year who was making his 2024 debut. The Buccaneers’ defense mainly bottled up McCaffrey and the league’s second-ranked rushing attack on the ground, as McCaffrey gained 39 yards on 13 carries and the 49ers finished with 75 rushing yards and 3.4 yards per tote. However, McCaffrey also caught six passes for 68 yards while Purdy threw touchdown tosses to Pearsall and tight end George Kittle.

S Jordan Whitehead led the Bucs’ defense with 12 tackles, while defensive lineman Calijah Kancey continued his recent hot streak with five tackles, a sack, two tackles for loss and a forced fumble. OLB Joe Tryon-Shoyinka and DL Greg Gaines had Tampa Bay’s other two sacks of Purdy.

For the first time all season, the Buccaneers failed to score a touchdown in the first half. They trailed 10-3 at the intermission and had been outgained in total yardage, 200-100. The visitors scored the only touchdown of the first half on a 46-yard catch and run by WR Ricky Pearsall, the rookie’s first NFL score. However, a muffed punt by the 49ers early in the third quarter set Mayfield up for his game-tying eight-yard touchdown pass to White, and Irving’s 12-yard scoring run in the fourth quarter gave Tampa Bay its first lead of the game.

The 49ers got the ball to start the game, starting at their own 30 after a touchback. McCaffrey made an instant impact, slicing over left tackle for a gain of five. On second down, the Bucs’ pass rush collapsed the pocket quickly but Purdy escaped up the middle to scramble for 11 more. An end-around to Samuel got the ball across midfield and to the Bucs’ 42 for another first down. A quick Christian Izien blitz flushed Purdy again and this time he only got three, and his next two passes were incomplete so the 49ers punted it away and were able to down it at the Bucs’ four-yard line.

White ran into a wall on first down but was able to push forward for four yards and Irving did the same for two on second down. Mayfield had good time to throw on third down and eventually found Otton over the middle for a 15-yard gain and an important first down. However, when the Bucs faced another third-and-four moments later, White’s catch gained only two and a punt followed. Return man Jacob Cowing was swarmed over at the 49ers’ 29.

Purdy dropped back to pass on first down but a group of pass rushers got to him quickly, led by Greg Gaines for a five-yard sack. A pass over the middle to McCaffrey made it third-and-seven, and a defensive holding call on CB Josh Hayes preserved the drive despite another incompletion. Two plays later, McCaffrey took a short pass out to the right and slipped through one tackle to get seven yards and another set of downs at the Niners’ 49. Two plays later, Purdy hit Pearsall on a crossing route and the rookie was able to take it all the way to the front left pylon for the game’s first score.

The 49ers’ first kickoff went into the end zone for a touchback to the 30, and the Bucs opened their second drive with a short pass to Irving that went for 12 yards. Two plays later, an Irving jaunt around left end got five yards to make it third-and-five but Mayfield’s third-down scramble resulted in a one-yard sack and a second punt. The kick was fair caught at the San Francisco 13.

The Niners backed up five yards on a false start before first down but McCaffrey got that plus two back on a first-down carry up the gut. The Bucs stood up a sweep left, only giving up a yard, but Kittle made a juggling catch over the middle on third down for a first down at the 30. That brought the first quarter to an end, and after the teams switched sides McCaffrey caught an eight yard pass on the next play. A pass interference penalty on CB Zyon McCollum moved the ball another 15 yards to the Bucs’ 47. Two runs by Samuel and McCaffrey gained a total of just one yard but Purdy moved the chains again with an 11-yard out to Jauan Jennings. The Niners then faced another third down at the Bucs’ 29, needing three, and Purdy threw to Jennings again down the right numbers for another 18 yards. A McCaffrey run gained just one and Hayes had good coverage on Pearsall on a second-down pass to the end zone, forcing an incompletion. The Bucs’ defense pressured Purdy into a quick pass on third down and it too fell incomplete in the end zone. The 49ers increased their lead to 10-0 on Jake Moody’s 28-yard field goal with nine minutes left in the first half.

After another touchback, Mayfield zipped a quick seam pass to WR Ryan Miller for 11 yards. A run and a catch by Irving amounted to seven yards, and on third down Otton held on to a short pass in heavy traffic for nine yards and a first down. A tight end screen to Otton only worked for two yards due to backside pursuit, and on third-and-seven Mayfield trusted Otton in a crowd again for just enough yards for another first down. Wirfs was injured on the play and had to be helped off the field. Irving found more room to run on his next two carries and ripped off gains of nine and 10 yards down to the 49ers’ 14. An end-around to WR Sterling Shepard was bottled up after a gain of three, and a short pass over the middle to Otton made it third-and-five as the two-minute warning arrived. On third down, the Bucs tried to get it into Irving’s hands out to the right but LB De’Vondre Campbell sniffed it out and spun him down at the 12. Chase McLaughlin came on to put the Bucs on the scoreboard with a 30-yard field goal.

The 49ers started the next drive at their own 31 with 1:08 left in the half. Tackling breakdowns turned a short out pass to Jennings into a 30-yard gain to the Bucs’ 38. Two incompletions followed, the second one broken up by Hayes, and Purdy’s third-down pass to Pearsall got seven. The 49ers sent out Moody again to try a 49-yard field goal but he pulled it wide to the left with 25 seconds left before halftime.

Mayfield’s first pass was incomplete but he then drilled a hard pass to Jarrett for an apparent 13 yards to the 49ers’ 48. However, the play was reviewed and ruled an incompletion. That made it third-and-10 with 19 seconds left, though it became third-and-nine after the 49ers jumped offside. Otton couldn’t hold on to an on-target out pass and the Bucs punted it away. The ball went out bounds at the San Francisco eight with eight seconds left and Purdy kneeled to bring on halftime.