The 49ers left State Farm Stadium with a seemingly lopsided 41-22 win over the Arizona Cardinals on Sunday, but their PFF grades show how much the home team was able to move the ball. 

The most obvious assist for the 49ers was the Cardinals’ franchise record-setting 17 penalties for 130 yards, which negated a 200-plus-yard differential between the two teams. The 49ers moved the ball 281 yards, while the Cardinals racked up 488 yards of offense. 

Defensive coordinator Robert Saleh put together a successful plan to stop the Cardinals’ ground game and allow only 36 rushing yards, but Arizona quarterback Jacoby Brissett completed a whopping 47 of his 57 total pass attempts for 452 yards with two touchdowns, two interceptions and a 96.8 passer rating. 

San Francisco coach Kyle Shanahan told reporters Monday that he was pleased with the defense’s performance, especially considering defensive end Robert Beal left the game after only seven defensive snaps, and linebacker Tatum Bethune missed nearly three quarters of the contest with what was determined after the game to be a high ankle sprain.

“I was really proud of our defense,” Shanahan said via conference call. “I think we played a lot of soft zone, wanted to make them work for it to get down the field. I thought our guys grinded. I thought we kind of wore out big time at the end, but we were playing pretty soft coverages and just trying not to let them get back in the game. 

“The yardage does suck, but sometimes that’s how games play out and with the turnovers they got and how they played throughout that game, I thought the defense was really, really good.”

Coverage 

Dee Winters – allowed completions on all 11 targets for 87 yards 

Upton Stout – allowed six completions on seven targets for 80 yards 

Deommodore Lenoir – allowed four catches on seven targets for 63 yards 

Nick Martin – allowed catches on all four targets for 49 yards 

Malik Mustapha – allowed catches on all three targets for 45 yards 

Jason Pinnock – allowed catches on all five targets for 43 yards and a touchdown 

Curtis Robinson – allowed five catches on seven targets for 28 yards and a touchdown 

Renardo Green – allowed three catches on four targets for 21 yards 

Chase Lucas – allowed catches on both targets for 17 yards 

Ji’Ayir Brown – allowed two catches on three targets for 12 yards 

Tatum Bethune – allowed one catch for 5 yards 

Darrell Luter – allowed one catch for 2 yards 

Stout received the highest grade of his career (72.1). The rookie nickelback allowed six catches on seven targets for 80 yards, but he recorded seven total tackles, two stops, and a forced fumble. 

Lenoir earned the second-highest overall grade of 86.7 and a 90.4 coverage grade, allowing four catches on seven targets for 63 yards with an interception and a pass breakup. 

Missed tackles – 10 total 

Dee Winters – 2

Chase Lucas – 2

Malik Mustapha – 1

CJ West – 1

Marques Sigle – 1

Upton Stout – 1

Darrell Luter – 1

Jason Pinnock – 1 

Curtis Robinson, who came in for Bethune after he left the game with his ankle injury in the second quarter, filled in admirably, registering 11 total tackles, none missed, and four stops. 

The defensive line was without Beal early in the game, which lead to higher snap counts for the remaining members of the group that was only able to manage 13 quarterback pressures over 79 offensive plays. 

The 49ers’ defense currently ranks 32nd in sack rate and 31st in pressure rate, and that is only because the three weeks that Nick Bosa was active has kept them from being in last place. Without Bosa’s statistics, the 49ers are in 32nd place by a large margin. 

13 total quarterback pressures – no sacks 

Kalia Davis – one hit, three hurries 

Bryce Huff – two hits, one hurry 

Sam Okuayinonu – one hit, one hurry 

Keion White – two hurries 

Alfred Collins – one hurry 

Jordan Elliott – one hurry 

Offense

The offense played well with the returns of both quarterback Brock Purdy and wide receiver Ricky Pearsall to the field. While Pearsall only caught one of his targets for zero yards, he added a threat that stretched the field for the offense and opened up underneath routes for Christian McCaffrey. 

Brock Purdy – 61.9 

Purdy was very efficient on plays of 10 yards or more downfield, completing six of his eight passes for 99 yards with two touchdowns. The offensive line kept the signal-caller upright, only allowing seven pressures and giving Purdy an average of 3.14 seconds to throw.  

Purdy also was effective when blitzed, completing eight of his 10 attempts for 74 yards with two touchdowns under pressure.

George Kittle – 87.6 

Kittle received the top grade on offense, catching all six of his targets. Kittle has caught his last 23 targets in a row and has a 93.1-percent catch rate on the 2025 NFL season. Five of his six catches on Sunday resulted in either a first down or touchdown.

Christian McCaffrey – 86.8 

McCaffrey averaged a season high of 4.0 yards per carry after contact. The All-Pro running back had three runs of 10 yards or more, including his first 20-yard run of the season.

Offensive line 

LT Trent Williams – no pressures 

LG Ben Bartch – one hurry 

LG Spencer Burford – one hurry 

C Jake Brendel – two hurries 

RG Dominick Puni – one hurry 

RT Colton McKivitz – one hit, one hurry 

49ers personnel packages:

21 – 51.9 percent 

12 – 25.0 percent 

11 – 21.1 percent (8 of the 11 snaps in 11 were on third down)

22 – 1.9 percent 

Download and follow the 49ers Talk Podcast