By Vic Tafur, Matt Barrows, Zach Berman and Brooks Kubena

Christian McCaffrey caught two fourth-quarter touchdowns, including one on a trick play, and the hobbled San Francisco 49ers closed the door on defense in a 23-19 win over the Philadelphia Eagles on Sunday. The win at Lincoln Financial Field sent the defending Super Bowl champion Eagles home in the wild-card round of the NFC playoffs.

The sixth-seeded 49ers will head to Seattle in the divisional round next weekend for their third meeting with the top-seeded Seahawks this season. San Francisco won 17-13 at Seattle in Week 1, then lost 13-3 at home in Week 18 with the NFC’s No. 1 seed on the line. In the NFC’s other matchup, the second-seeded Chicago Bears will host the fifth-seeded Los Angeles Rams. Three of the four remaining teams in the conference are from the NFC West.

The Eagles, who went 11-6 in the regular season, lost in the wild-card round for the third time in five seasons under coach Nick Sirianni.

The underdog and undermanned 49ers, who entered without several key players and then lost tight end George Kittle to a torn Achilles in the second quarter, scored on the first play of the fourth quarter with a double-reverse pass. Quarterback Brock Purdy handed off to Skyy Moore, who flipped the ball to fellow wide receiver Jauan Jennings, who threw up the right sideline to McCaffrey, who made a diving catch for a 29-yard touchdown. The extra point gave San Francisco a 17-16 lead.

The Eagles retook the lead with a 47-yard drive for a 33-yard field goal, set up by cornerback Quinyon Mitchell’s second interception. But Purdy bounced back, marching the Niners 66 yards in 10 plays before hitting McCaffrey for the go-ahead 4-yard touchdown with 2:54 remaining.

After Niners kicker Eddy Piñeiro missed the extra point to keep the lead at 23-19, Jalen Hurts and the Eagles drove to the San Francisco 20 with more than a minute remaining. But Hurts was sacked and then threw three consecutive incompletions, the last broken up by 49ers fill-in linebacker Eric Kendricks on fourth-and-11, to seal Philadelphia’s fate.

The game featured three fourth-quarter lead changes, bringing the total through the first four NFL playoff games to 12. That is already the most in a single postseason in NFL history, according to Opta Stats.

Purdy finished 18 of 31 for 262 yards, two touchdowns and the two picks, while McCaffrey had 114 total yards on 21 touches. Hurts finished 20 of 35 for 168 yards, one touchdown and no interceptions, while Saquon Barkley had 131 total yards on 31 touches.

McCaffrey outshines Barkley

Two of the best running backs in the league were on display, and while Barkley had the most success early, McCaffrey showed off his receiving skills on the biggest play of the game.

McCaffrey had been bottled up, with only 54 yards rushing and receiving through three quarters, but he broke free and hauled in the touchdown pass from receiver Jennings on a trick play, giving the 49ers the lead and leaving the Eagles’ crowd sitting in stunned silence.

The Eagles had success getting the ball to Barkley early, as he had 91 yards on 16 touches in the first half. But their offense lulled itself to sleep, and the 49ers held Barkley to 30 yards on 13 touches in the second half. Purdy’s second interception seemed to give the Eagles and their crowd some life, and they used Barkley and Hurts runs to drive for a go-ahead field goal. Barkley took a big hit from safety Marques Sigle and came off for the last two plays of the possession.

McCaffrey then had an 11-yard catch and 10-yard run before catching his 4-yard touchdown pass to give the 49ers the lead for good. — Vic Tafur, 49ers beat writer

Jennings’ magical pass

Jennings has a perfect passer rating when targeting McCaffrey. The 49ers receiver, who started as a quarterback at the University of Tennessee, hit McCaffrey on a perfectly placed touchdown pass to open the 49ers’ big fourth quarter. Jennings also threw a touchdown to McCaffrey in Super Bowl LVIII, taking a pass behind the line of scrimmage from Purdy on one side of the field before throwing to McCaffrey on the other side.

On Sunday’s score, Moore took a jet sweep handoff from Purdy before pitching the ball to Jennings, who was heading in the opposite direction. That gave McCaffrey an opportunity to escape coverage, and he made a nice over-the-shoulder grab on Jennings’ pass for the score. — Matt Barrows, 49ers beat writer

Robinson gives 49ers a spark

Demarcus Robinson, who never topped 44 receiving yards this season, had 81 at halftime. That included a 61-yard catch and run — the 49ers’ longest play from scrimmage this season — on the second play of the game and a 2-yard touchdown to cap off San Francisco’s opening drive.

Robinson, who started in place of injured Ricky Pearsall, finished with 111 receiving yards. It was his highest total since he had 128 yards as a member of the Baltimore Ravens in Week 11 of the 2022 season. He, Pearsall, Jacob Cowing and Jordan Watkins are the only wide receivers under contract for the 2026 season. — Barrows

49ers’ defense does just enough

The 49ers were last in the league in sacks in the regular season, and though they somehow had the lead late Sunday, the inability to hurry the quarterback almost did them in. The Eagles were down to fourth-and-5 just before the two-minute warning, but Hurts had a lot of time to wait for tight end Dallas Goedert to break free across the middle for a 15-yard completion.

But the 49ers’ defense did not break, and on fourth-and-11, Hurts threw the ball into a crowd of 49ers defenders in the middle of the field, and the ball bounced harmlessly to the ground.

The battered 49ers — who have been without Nick Bosa, Fred Warner and first-round pick Mykel Williams most of the season — had their only sack on that final drive, for a 1-yard loss. Already playing two starting linebackers who weren’t on the roster a month ago, they also lost safety Ji’Ayir Brown to a hamstring injury early. — Tafur

Eagles’ offense underwhelms again

The Eagles’ offense underachieved all season, and it underachieved when it mattered most Sunday. The offense went without a touchdown on its final seven drives, including four punts. Philadelphia could not mount a go-ahead drive in the final three minutes. Hurts, who has what owner Jeffrey Lurie calls “the clutch gene,” came up 21 yards short. A.J. Brown and DeVonta Smith had costly drops. Hurts could not escape for a run. The Eagles burned a timeout after getting out of the huddle late. The problems that plagued the Eagles all year were apparent late in the game, and they’re now left answering for their own failure to fix them. — Zach Berman, Eagles beat writer

Offseason questions loom

The biggest question about the Eagles’ offseason will be what happens at offensive coordinator, with first-year play-caller Kevin Patullo overseeing an offense that had its least-productive and least-efficient season in Sirianni’s five years. If the hope was they could flip a switch in the postseason, it didn’t happen. They mustered only 19 points. It was the ninth time this season the Eagles failed to score in the 20s.

It’s not entirely on Patullo — there were execution issues from players — but the Eagles invested more cash in their offense than any other team in the NFL. The expectation should be more than two touchdowns against an undermanned 49ers defense in the playoffs. There’s something to be said about continuity for Hurts, although the Eagles replaced their coordinators after their last first-round exit in 2023. — Berman

Mitchell’s INTs not enough

So much of the 2025 season for the Eagles has come down to what their defense could do — and couldn’t do. That is also how it ended Sunday. Mitchell supplied two interceptions plus a forced fumble, but the Eagles failed to fully capitalize on the extra possessions.

Meanwhile, the secondary gave up its fair share of explosive plays. Mitchell had a rough start to the game, which included a 61-yard reception and getting beaten inside for a touchdown on the 49ers’ opening drive. San Francisco also scored a touchdown on a double-reverse pass. The Eagles retook the lead, 19-17, but the defense surrendered a 10-play, 66-yard touchdown drive with 2:54 left in the game. — Brooks Kubena, Eagles beat writer