| 1st | 2nd | 3rd | 4th | Tot | |
| SF | 7 | 3 | 7 | 9 | 26 |
| CLE | 0 | 8 | 0 | 0 | 8 |
It felt at times like the Browns were trying to hand Sunday's game at Huntington Bank Field in Cleveland to the San Francisco 49ers on a silver platter, and the 49ers were more than happy to take it.
On a cold, blustery day next to the Lake Erie shoreline, where winds were forecast to reach as high as 50 MPH, the Browns fought themselves more than the weather, committing multiple critical special teams errors and two total turnovers in helping the 49ers cruise to a 26-8 win. The errors gave the 49ers multiple opportunities deep in Browns territory, which they took advantage of with four scoring drives of 32 yards or less.
49ers quarterback Brock Purdy finished 16-of-29 for 168 yards with one passing touchdown and one rushing touchdown, while running back Christian McCaffrey added a touchdown while being held to a modest 53 yards on 20 carries. Browns quarterback Shedeur Sanders completed 16-of-25 for 149 yards and one touchdown.
Big punt return helps propel 49ers to halftime lead
After winning the opening coin toss and electing to receive, the 49ers saw their first possession come to a quick end as the Browns forced a punt following a 23-yard completion to fullback Kyle Juszczyk. The Browns followed with a five-play possession that ended in a punt back to the 49ers, which return specialist Skyy Moore turned into the first big play of the game -- a 66-yard return that gave the 49ers the ball at the Browns' 16-yard line.
Skyy Moore with a big punt return of 66 yards ??
SFvsCLE on CBS/Paramount+https://t.co/HkKw7uXVnt pic.twitter.com/w9Hf3MpyOx
— NFL (@NFL) November 30, 2025
The 49ers capitalized on the field position with a six-play possession that ended in a touchdown. A 12-yard completion to McCaffrey on 3rd-and-8 gave the 49ers a 1st-and-Goal at the 2, then McCaffrey got the ball again on third down to get the 49ers on the scoreboard.
Can't go wrong with giving CMC the rock
SFvsCLE on CBS/Paramount+https://t.co/HkKw7uXVnt pic.twitter.com/M4GPdXdVyD
— NFL (@NFL) November 30, 2025
The Browns responded with a 10-play, 49-yard drive that consisted mostly of short gains and moved the ball to the 49ers' 20-yard line. But the 49ers put a stop to the drive when defensive tackle Jordan Elliott and safety Malik Mustapha stuffed running back Quinshon Judkins for a loss on 4th-and-1, giving the 49ers the ball with just under three minutes left in the first quarter.
Watch Jordan Elliott and Malik Mustapha pic.twitter.com/Vgqwxl5HeU
— Coach Yac 🗣 (@Coach_Yac) November 30, 2025
A three-and-out followed the turnover-on-downs, then the Browns took over at their own 39-yard line after a punt. An 18-yard completion to wide receiver Isaiah Bond followed by runs by Dylan Sampson and Judkins got the ball to the 49ers' 31-yard line, and from there the drive moved backwards due to an illegal shift penalty followed by a sack by defensive end Clelin Ferrell for a 13-yard loss. The punt after the sack rolled into the end zone, giving the 49ers the ball at their own 20.
Make way for Cle ??
📺: CBS
— San Francisco 49ers (@49ers) November 30, 2025
NFL+ // https://t.co/KTh0i4nCVJ pic.twitter.com/PBJcLHLi7y
The 49ers moved the ball across midfield before punting back to the Browns on a 4th-and-4 from the 40. The Browns took over at their own 10-yard line with 6:21 left in the half, then ran nine straight running plays to get to the 49ers' 34-yard line (and milk most of the remaining first-half clock in the process). Sanders then took to the air and threw a pass to wide-open tight end Harold Fannin near the 10-yard line, which Fannin caught and then plowed into the end zone for a 34-yard touchdown. A 49ers penalty on the extra point put the Browns in position to go for two, which they converted on a wildcat run by Judkins to take an 8-7 lead.
Shedeur Sanders throws a 34-yard touchdown to Harold Fannin Jr.!
SFvsCLE on CBS/Paramount+https://t.co/HkKw7uXVnt pic.twitter.com/V1WTdsoLm2
— NFL (@NFL) November 30, 2025
A touchback on the ensuing kickoff gave the 49ers the ball at their own 35 with 39 seconds remaining, then a 3rd-and-10 completion for 13 yards to wide receiver Ricky Pearsall, followed by a 12-yard catch by wide receiver Jauan Jennings, moved the ball inside Browns territory to the 40. Purdy followed those completions with a 33-yard completion to tight end George Kittle, which gave the 49ers the ball at the 7-yard line with four seconds remaining. Kicker Matt Gay came on to attempt a 25-yard field goal into the wind, which gave the 49ers a 10-8 lead after ricocheting off the left upright as time expired.
Kevin Harlan: "BOINK!" 😂
SFvsCLE on CBS/Paramount+https://t.co/HkKw7uXVnt pic.twitter.com/Klviup4HTu
— NFL (@NFL) November 30, 2025
The 49ers were outgained 177-134 in the half, including a 94-19 deficit on the ground. But the short drive set up by Moore's punt return, as well as the last-minute scoring drive, were enough to give the 49ers the edge on the scoreboard. Purdy finished the half 9-of-15 for 115 yards, while Sanders completed 8-of-11 passes for 96 yards and a touchdown.
Comedy of Browns' second-half errors seals the deal for 49ers
A five-play drive that ended in a punt started the second half for the Browns, then the 49ers began their first possession of the half at their own 22-yard line. The 49ers answered with a punt of their own, giving the Browns the ball at their own 24 after an 8-play, 19-yard drive. Four plays later, the Browns committed another blunder that gave the 49ers a short field. On a 4th-and-1 from their own 33-yard line, the Browns decided to go for a first down by lining Fannin up under center for a sneak. Fannin fumbled the snap, giving the ball back to the 49ers at the 32.
🚨 FUMBLE ALERT 🚨
📺: CBS
— San Francisco 49ers (@49ers) November 30, 2025
NFL+ // https://t.co/KTh0i4nCVJ pic.twitter.com/2HYEjYKK7g
It took nine plays for the 49ers to turn the fumble into a touchdown, but they got the job done thanks to a clutch play and some fancy footwork from Purdy. A big 14-yard completion on a 3rd-and-9 set the 49ers up with a 1st-and-Goal at the 5, then after two short runs by McCaffrey, Purdy kept the ball himself and maneuvered his way into the end zone for his first rushing touchdown of the season and a 17-8 lead.
Purdy wheels 🛞
📺: CBS
— San Francisco 49ers (@49ers) November 30, 2025
NFL+ // https://t.co/KTh0i4nCVJ pic.twitter.com/yFf0dxVm3J
Another mistake for the Browns followed the touchdown when return man Malachi Corley fielded a kickoff right next to the sideline at the 5 that would have gone out of bounds, then proceeded to step out of bounds himself. The Browns gained no yardage on their possession and punted from their own end zone back to the 49ers, who took over at the Browns' 48-yard line with 28 seconds left in the third quarter. The 49ers punted back to the Browns after a third-down sack by defensive back Myles Garrett, but then the Browns managed to give the ball back to the 49ers again when punt returner Gage Larvadain muffed a punt that was recovered by cornerback Darrell Luter at the 17.
ALL OVER IT 👏
📺: CBS
— San Francisco 49ers (@49ers) November 30, 2025
NFL+ // https://t.co/KTh0i4nCVJ pic.twitter.com/WsV7EXdM62
Two more third-down conversions helped put the ball back into the end zone for the 49ers. A catch-and-run for eight yards on 3rd-and-5 by McCaffrey gave the 49ers a 1st-and-Goal at the 5, then after a two-yard loss and an incompletion, Purdy connected with Jennings for a third down touchdown from seven yards out to give the 49ers a 23-8 lead. The 49ers attempted a two-point conversion after the touchdown but came up short.
We vibin' 🕺#ForTheCelly x @budlight pic.twitter.com/3WZf7aa8Jv
— San Francisco 49ers (@49ers) November 30, 2025
The Browns moved into 49ers territory on their next possession before a holding penalty moved them back across midfield. Eventually, the Browns faced a 4th-and-16, which the 49ers turned into a turnover on downs when Sanders was sacked by defensive end Keion White. The 49ers drove into the red zone after the sack, where they added a 31-yard field goal from Gay to extend their lead to 26-8.
KEION WHITE WITH THE SACK! pic.twitter.com/b1FIfkK1qq
— Coach Yac 🗣 (@Coach_Yac) November 30, 2025
The Browns ended their final possession with another turnover on downs, then the 49ers ran out the clock to seal the win. The 49ers moved to 9-4 on the season with the win and are now a half game off the lead in the NFC West after the Los Angeles Rams were upset by the Carolina Panthers. The Browns fell to 3-9 with the loss.
Game Notes
Sunday's game was the 22nd meeting all-time between the Browns and 49ers, who won in Cleveland for the first time since 1984. The Browns hold a 13-9 edge in the series... The 49ers were 5.5-point favorites heading into the game... Garrett's sack in the third quarter was his 19th of the season and his 16th in seven games. Garrett has five games to break the NFL's single-season sack record of 22.5, held by T.J. Watt and Michael Strahan... The 49ers now enter into a bye week before returning to action on December 14 against the Tennessee Titans. The game will kick off at 4:25 p.m. ET/1:25 p.m. PT at Levi's Stadium in Santa Clara and will air on FOX.
Scoring Summary
- Q1 08:15 — SF 7, CLE 0
C. McCaffrey 1 yd. run (M. Gay kick) (6 plays, 16 yds, 2:10) - Q2 00:47 — SF 7, CLE 8
H. Fannin 34 yd. pass from S. Sanders (Q. Judkins run) (10 plays, 90 yds, 5:42) - Q2 00:04 — SF 10, CLE 8
M. Gay 25 yd. Field Goal (6 plays, 58 yds, 0:39) - Q3 01:33 — SF 17, CLE 8
B. Purdy 2 yd. run (M. Gay kick) (9 plays, 32 yds, 5:36) - Q4 11:09 — SF 23, CLE 8
J. Jennings 7 yd. pass from B. Purdy (pass failed) (6 plays, 18 yds, 2:22) - Q4 04:13 — SF 26, CLE 8
M. Gay 31 yd. Field Goal (9 plays, 29 yds, 3:15)
Game and Player Stats
| SF | Team Stats | CLE |
| 161 | Passing Yards | 115 |
| 91 | Rushing Yards | 138 |
| 252 | Total Yards | 253 |
| 5.6 | Avg Yards per Pass | 5.73 |
| 2.76 | Avg Yards per Run | 4.45 |
| 0 | Fumbles Lost | 2 |
| 0 | Int Thrown | 0 |
| 1 | Sacks Allowed | 3 |
| 00:30:10 | Time of Pos | 00:29:50 |
| 3 | Penalties | 4 |
| 49ers Player Stats | ||||
| Passing | Cmp/Att | Yds | TDs | INTs |
| Brock Purdy | 16/29 | 168 | 1 | 0 |
| Christian McCaffrey | 0/1 | 0 | 0 | 0 |
| Rushing | Att | Yds | Avg | TDs |
| Christian McCaffrey | 20 | 53 | 2.7 | 1 |
| Brian Robinson | 8 | 26 | 3.3 | 0 |
| Demarcus Robinson | 1 | 6 | 6 | 0 |
| Brock Purdy | 2 | 4 | 2 | 1 |
| Mac Jones | 2 | 2 | 1 | 0 |
| Receiving | Rec | Tgt | Yds | TDs |
| George Kittle | 4 | 5 | 67 | 0 |
| Jauan Jennings | 4 | 6 | 39 | 1 |
| Kyle Juszczyk | 2 | 2 | 27 | 0 |
| Christian McCaffrey | 4 | 4 | 21 | 0 |
| Ricky Pearsall | 2 | 3 | 14 | 0 |
| Demarcus Robinson | 0 | 1 | 0 | 0 |
| Kendrick Bourne | 0 | 1 | 0 | 0 |
| Luke Farrell | 0 | 1 | 0 | 0 |
| Kicking | FG | Att | Lg | XP |
| Matt Gay | 2 | 2 | 31 | 2 |
| Punting | No | Avg | I20 | Lg |
| Thomas Morstead | 5 | 35 | 3 | 42 |
| Punt Returns | Att | Avg | TDs | Lg |
| Skyy Moore | 3 | 23 | 0 | 66 |
| Defense | T-A | Sck | INTs | FF |
| Clelin Ferrell | 9-3 | 2 | 0 | 0 |
| Malik Mustapha | 7-2 | 0 | 0 | 0 |
| Upton Stout | 7-2 | 0 | 0 | 0 |
| Curtis Robinson | 6-3 | 0 | 0 | 0 |
| Dee Winters | 6-3 | 0 | 0 | 0 |
| Jordan Elliott | 4-4 | 0 | 0 | 0 |
| Deommodore Lenoir | 4-3 | 0 | 0 | 0 |
| Ji'Ayir Brown | 4-1 | 0 | 0 | 0 |
| Renardo Green | 3-0 | 0 | 0 | 0 |
| Keion White | 3-0 | 1 | 0 | 0 |
| Bryce Huff | 2-1 | 0 | 0 | 0 |
| CJ West | 2-1 | 0 | 0 | 0 |
| Jason Pinnock | 2-0 | 0 | 0 | 0 |
| Kalia Davis | 1-1 | 0 | 0 | 0 |
| Robert Beal | 1-1 | 0 | 0 | 0 |
| Jalen Graham | 1-1 | 0 | 0 | 0 |
| Alfred Collins | 1-1 | 0 | 0 | 0 |
| Browns Player Stats | ||||
| Passing | Cmp/Att | Yds | TDs | INTs |
| Shedeur Sanders | 16/25 | 149 | 1 | 0 |
| Dillon Gabriel | 1/1 | 0 | 0 | 0 |
| Rushing | Att | Yds | Avg | TDs |
| Quinshon Judkins | 23 | 91 | 4 | 0 |
| Dylan Sampson | 4 | 23 | 5.8 | 0 |
| Malachi Corley | 1 | 9 | 9 | 0 |
| Isaiah Bond | 1 | 9 | 9 | 0 |
| Shedeur Sanders | 1 | 6 | 6 | 0 |
| Harold Fannin | 1 | 0 | 0 | 0 |
| Receiving | Rec | Tgt | Yds | TDs |
| Harold Fannin | 3 | 5 | 43 | 1 |
| Jerry Jeudy | 3 | 4 | 26 | 0 |
| Gage Larvadain | 2 | 3 | 23 | 0 |
| Isaiah Bond | 1 | 2 | 18 | 0 |
| Quinshon Judkins | 3 | 3 | 18 | 0 |
| Jerome Ford | 3 | 3 | 17 | 0 |
| David Njoku | 2 | 2 | 4 | 0 |
| Cedric Tillman | 0 | 1 | 0 | 0 |
| Fumbles | Fum | Lost | ||
| Gage Larvadain | 3 | 1 | 0 | 0 |
| Harold Fannin | 1 | 1 | 0 | 0 |
| Punting | No | Avg | I20 | Lg |
| Corey Bojorquez | 4 | 22.3 | 0 | 49 |
| Punt Returns | Att | Avg | TDs | Lg |
| Gage Larvadain | 3 | 1 | 0 | 3 |
| Defense | T-A | Sck | INTs | FF |
| Ronnie Hickman | 8-4 | 0 | 0 | 0 |
| Devin Bush | 7-6 | 0 | 0 | 0 |
| Tyson Campbell | 6-3 | 0 | 0 | 0 |
| Myles Garrett | 5-3 | 1 | 0 | 0 |
| Rayshawn Jenkins | 4-4 | 0 | 0 | 0 |
| Grant Delpit | 4-2 | 0 | 0 | 0 |
| Shelby Harris | 4-1 | 0 | 0 | 0 |
| Mason Graham | 4-1 | 0 | 0 | 0 |
| Mohamoud Diabate | 3-2 | 0 | 0 | 0 |
| Cameron Thomas | 2-2 | 0 | 0 | 0 |
| Jerome Baker | 2-1 | 0 | 0 | 0 |
| Myles Harden | 2-1 | 0 | 0 | 0 |
| Carson Schwesinger | 10-5 | 0 | 0 | 0 |
| Maliek Collins | 1-1 | 0 | 0 | 0 |
| Sam Kamara | 1-1 | 0 | 0 | 0 |
| Isaiah McGuire | 1-1 | 0 | 0 | 0 |
| Mike Hall | 1-1 | 0 | 0 | 0 |
| Denzel Ward | 1-0 | 0 | 0 | 0 |