The 49ers did what they had to do in Arizona and dropped the Cardinals 45-29 to earn their 11th win of the year and clinch a second consecutive NFC West title.
It wasn’t a perfect showing and San Francisco’s injury problems on defense were apparent, but their offense is humming at such a high level that it didn’t ultimately matter.
Here’s what we saw from each quarter:
First quarter
– Not a great start defensively with an offsides, then a broken coverage that allowed a 38-yard gain. The 49ers look disinterested defensively to start.
– First-and-goal at the 49ers’ 5 after a Kyler Murray scramble. The DL lost contain on the edge and let the QB get outside. They were really good in this area against the Eagles and QB Jalen Hurts.
– Easy TD for the Cardinals to open the game with James Conner plowing in from two yards out. It’s 7-0, Arizona and the 49ers defense may not have many answers today with Arik Armstead and Javon Hargrave out.
– Two runs in a row go to the right side where backup Jon Feliciano is starting at right guard. Christian McCaffrey found 13 yards for a first down on a third-and-1.
– Brock Purdy dropped a dime to Brandon Aiyuk on a deep shot, but it was a touch underthrown which allowed the CB to get a hand in and affect the play.
– Now it’s McCaffrey to the left side for 26 yards. A sick combo block by George Kittle and Charlie Woerner sprung him around the corner.
– There’s the 49ers’ response. Hard play action right allowed Samuel to sneak out on a wheel route to the left and Purdy found him all alone for a walk-in touchdown. It’s just impossible to keep track of all the 49ers’ weapons on offense. 7-7 after an eight-play, 75-yard scoring drive.
– Good pressure from Chase Young forces a throwaway. Ambry Thomas had excellent coverage down the field on Marquis Brown.
– Another explosive play off a ball tipped up by Dre Greenlaw. Unbelievable luck for Arizona after the LB batted a throw away from one TE, and another TE was standing in the area and grabbed the ball for a 26-yard gain.
– Looks like Greenlaw is pretty fired up. It wouldn’t be a shock if he picks up a personal foul at some point.
– Wow! Arizona goes for it on a fourth-and-3 and Charvarius Ward steps in for a pick-six on a throw down the middle. He just jumped the route and went untouched to the end zone. That was an incredible play by Ward, who nearly didn’t play because of a groin injury.
– The Cardinals are taking full advantage of the 49ers’ injuries on the defensive line. They’re cooking on the ground with 63 yards on 11 carries.
– Arizona tried throwing and Murray took a sack. Javon Kinlaw got a push in the middle to collapse the pocket and hit the QB first. Nick Bosa was also in on it. Good work from the reserve DT.
End of first quarter: 49ers 14, Cardinals 7
Second quarter
– That sack by Kinlaw and Bosa was big because it halted the Cardinals momentum in the run game. They wound up in third-and-forever and had to settle for a 58-yard field goal by kicker Matt Prater. He drilled it to make it 14-10, 49ers.
– Sheesh, Purdy nearly threw a pick-six of his own on a dangerous throw to Samuel in the middle. Samuel didn’t create much separation. Purdy probably shouldn’t throw that ball.
– Three-and-out for the 49ers to open their second quarter possessions. Incompletion, negative run, checkdown on third-and-long. That’s not the kind of series this group can have against a defense as bad as Arizona’s.
– QB keeper by Murray goes for 12 yards to open their series. The 49ers had no idea he faked the handoff, but that’s part of the problem with missing their DTs because more bodies are committing to stop the run inside.
– The 49ers’ inability to tackle is killing them. They’ve had so many short throws sniffed out but allowed them to go for positive yards because they’re missing tackles.
– This is so easy on the ground for the Cardinals. 97 yards on 18 carries.
– There’s Bosa again with a strip sack. The 49ers couldn’t recover, but it puts Arizona in a third-and-10 on the San Francisco 31.
– Another field goal for Arizona makes it 14-13. Good work from the 49ers’ defense to stiffen up on the last couple drives. It looks like Arizona is going to move the ball all day though so San Francisco’s offense has to be better.
– Their offense will get the ball with 6:14 left in the half though — which means they have a prime opportunity to get two possessions in a row.
– What a sick throw on a deep out by Purdy. He threw it in the only spot where Aiyuk could get it without the CB picking it off for a TD.
– Whew, creativity from Purdy gets nine yards on a play that should’ve gone for a loss. He found Kyle Juszczyk for an easy, unconventional completion. Purdy also took a big shot to the head from Cardinals DE Dennis Gardeck. That did not look good.
– Purdy is in the medical tent.
– McCaffrey also had some work done on his knee. He’s in, but yikes.
– Woof. A drop from Kittle on a good throw from Sam Darnold. That’s one the TE will want back.
– Purdy is back. The TV broadcast said it was a left shoulder stinger.
– Well, the 49ers didn’t eat all of the six minutes, but they did shave off 5:00 on a 10-play, 75-yard touchdown drive. Purdy drilled a throw in to McCaffrey for a five-yard TD pass.
– Two quick incompletions for the Cardinals could make this an opportunity for the 49ers to get the ball back with some time on the clock.
– Arizona runs on third-and-10 and the 49ers stop them with 1:03 left. Good work by the 49ers defense to force a quick three-and-out.
– Ronnie Bell narrowly avoids disaster. He fumbled and had it returned for a Cardinals touchdown, but replay review showed he was down. That’s extremely lucky for the rookie punt returner.
– Jauan Jennings would be so good as a No. 2 receiver somewhere. He’s an excellent player buried in an excellent receiving corps.
– Half ends on a failed Hail Mary. What a strange first 30 minutes.
Halftime score: 49ers 21, Cardinals 13
Third quarter
– Sweet throw from Purdy to Kittle on a third-and-11. Arizona brought a blitz and Purdy drilled a throw in to the TE who rumbled ahead for 36 yards.
– Now a touchdown on maybe the most broken coverage of the year. Purdy rolled left and found McCaffrey all alone up the left sideline. McCaffrey fell down on the play and still had time to get up and run in for a 41-yard TD. It’s 28-13, 49ers after a 75-yard drive that only needed four plays.
– Murray went down after Clelin Ferrell got in for a QB hit. It’s unclear what the issue is.
– Woof. Purdy just missed Aiyuk on a deep shot. The WR got open and Purdy floated it a tick too far toward the sideline for Aiyuk to make the catch. That’s a play we’re accustomed to seeing Purdy make.
– This 49ers run defense is an abomination. James Conner ripped off a 44-yard run to get into the red zone. Arizona is up to 160 rushing yards on 24 carries.
– Now Nick Bosa is hurt because Randy Gregory threw a blocker into Bosa’s legs after the play. An unforgivable mistake from Gregory.
– Wow. T.Y. McGill just got inside so fast that he disrupted the exchange on a handoff and forced a fumble. Arizona has put the ball on the ground a lot and the 49ers haven’t been able to take advantage.
– Bosa is back.
– Weird. The Cardinals settle for a field goal with 4:20 left in the third. That makes it 28-16, 49ers.
– The 49ers’ offensive front is dominating this game. McCaffrey is up to 87 yards on 14 attempts.
– There’s McCaffrey’s third touchdown of the game. He plowed in from a couple yards out to make it 35-16. This is the kind of performance San Francisco needed from its offense given all their injuries on defense.
– Nice job by Ambry Thomas to trip up TE Trey McBride when he tried to hurdle the CB.
End of third quarter: 49ers 35, Cardinals 16
Fourth quarter
– Outstanding screen recognition by Kevin Givens forces a loss of seven. Nice work from the reserve DT who’s been put in a big spot with Arik Armstead and Javon Hargrave out.
– Now the 49ers surrender a 49-yard rushing TD thanks to some bad tackling near the line of scrimmage. 212 yards on 27 carries is embarrassing regardless of personnel.
– Tashaun Gipson intercepts the two-point try. Good coverage by the safety. It’s 35-22, 49ers after the score.
– The first non-McCaffrey run of the day is Jordan Mason with about 8:30 left in the game. He ripped off 17 yards on the tote.
– What a freaking DIME. Purdy hit Deebo Samuel for a 19-yard TD at the front pylon on a back shoulder throw. That stretches the lead to 42-22, 49ers and gives Purdy four TD passes.
– Bosa just got flattened on a block and then laid on the ground while the lineman kept a hand on him. That was funny. Eventually the DE scrambled up as Murray left the pocket.
– Now Bosa gets home to force a bad throw.
– Second interception of the game for Ward puts this one on ice.
– Sam Darnold is in, along with Mason. Trent Williams has also been removed from the left tackle spot. Jaylon Moore is there.
– Hey, Jake Moody! He made a 43-yard field goal on his first attempt since Week 12. That’s also his first make from 40-49 yards since the season opener. It’s his first make from beyond 40 since Week 7. That makes it 45-22.
– Kyler Murray is still running for some reason.
– Rookie CB Darrell Luter Jr. is in the game and doing a nice job in his first run on defense as a pro.
– Rookie DE Robert Beal Jr. is also debuting today and playing his first NFL snaps.
– Oof. Speaking of rookies, safety Ji’Ayir Brown just got cooked for a late TD. It’s 45-29 after the TD.
Final score: 49ers 45, Cardinals 29