Atalanta Edges AC Milan 3-2 in Dramatic Serie A Clash
At Stadio Giuseppe Meazza, Atalanta edged AC Milan 3-2 in a dramatic Serie A contest, a result that tightens the race for European places and leaves Milan’s push for a top-three finish under real pressure. Milan’s late rally could not repair the damage of a passive first hour, while Atalanta’s fast start and game management keep them firmly in contention just outside the Champions League spots.
Atalanta struck first in the 7th minute when Éderson drove forward and finished a solo move, an unassisted effort that stunned the home crowd. The visitors doubled their lead on 29 minutes: Davide Zappacosta arrived from the right to score after Nikola Krstović picked him out, Zappacosta’s composed finish making it 2-0 with Krstović credited for the assist.
Frustration began to show for Milan in the 34th minute as Rafael Leão went into the book with a yellow card, reflecting the home side’s growing irritation at being outplayed early on.
Massimiliano Allegri reacted at half-time. In the 46th minute, Christopher Nkunku replaced Ruben Loftus-Cheek, a clear attempt to inject more creativity and vertical threat into Milan’s attack.
Atalanta responded with their own adjustment in the 48th minute when Odilon Kossounou replaced Giorgio Scalvini, a like-for-like defensive change aimed at shoring up the back line. Just three minutes later, the visitors seemingly killed the game: in the 51st minute Giacomo Raspadori made it 3-0, finishing clinically after being set up by Éderson, whose earlier goal and now assist underlined his dominance between the lines.
Raffaele Palladino continued to refresh his side in the 55th minute, with Raoul Bellanova replacing Davide Zappacosta on the flank to add fresh legs against Milan’s wide players.
Milan then made a triple change in the 58th minute to try to flip the momentum. Youssouf Fofana replaced Rafael Leão, Niclas Füllkrug came on for Santiago Giménez, and Zachary Athekame replaced Koni De Winter. The changes rebalanced Milan’s structure, adding physicality up front and energy in the back line and midfield.
Atalanta answered with a double substitution of their own on 63 minutes. Honest Ahanor replaced Odilon Kossounou, while Mario Pašalić came on for Charles De Ketelaere, giving Atalanta fresh defensive cover and an extra runner from midfield to help in transitions.
The intensity rose again on 70 minutes when Isak Hien received a yellow card, a sign of Atalanta increasingly having to foul to disrupt Milan’s renewed pressure.
Allegri used his final substitution in the 80th minute, bringing on Pervis Estupiñán for Davide Bartesaghi to get a more aggressive left-sided presence and extra delivery from wide areas.
Milan finally broke through in the 88th minute. From sustained pressure, Strahinja Pavlović pulled one back, finishing after being set up by Samuele Ricci, whose assist rewarded his persistence in midfield. That goal made it 3-1 and briefly reopened the contest.
Just a minute later, in the 89th minute, Pervis Estupiñán was booked with a yellow card, underlining Milan’s urgency and willingness to take risks higher up the pitch. In the 90th minute, Alexis Saelemaekers also went into the referee’s book, another yellow card as Milan pushed frantically and fouls accumulated.
Deep into stoppage time, Milan’s late surge almost produced an unlikely comeback. In the 90+4 minute, Christopher Nkunku converted from the penalty spot, a composed finish from 12 yards to make it 3-2 and set up a tense finale. Atalanta then managed the remaining moments, but not without further disciplinary issues: in the 90+5 minute Nikola Krstović received a yellow card for unsportsmanlike conduct, and in the 90+6 minute Raoul Bellanova was booked for roughing as Atalanta clung on under sustained late pressure.
Fixture Statistics & Tactical Audit
- xG (Expected Goals): AC Milan 1.94 vs Atalanta 1.08
- Possession: AC Milan 57% vs Atalanta 43%
- Shots on Target: AC Milan 9 vs Atalanta 5
- Goalkeeper Saves: AC Milan 2 vs Atalanta 8
- Blocked Shots: AC Milan 3 vs Atalanta 2
Milan controlled the ball for long stretches and generated the higher xG (1.94 vs 1.08), which suggests they created more and better chances overall. However, Atalanta were far more ruthless in the key phases, scoring three times from five shots on target and outperforming their xG, indicative of clinical finishing (3 goals from 1.08 xG). Milan’s 9 shots on target forced Marco Carnesecchi into 8 saves, reflecting sustained pressure, especially after the hour mark, but their earlier wastefulness and defensive lapses left them chasing a deficit that proved too large. Statistically, a draw might have been a fairer reflection based on xG and territory, but Atalanta’s efficiency in both boxes ultimately justified their narrow win.
Standings Update & Seasonal Impact
For AC Milan, this defeat means they remain on 67 pre-match points plus 0, staying on 67 points. Their goals for rise from 50 to 52, while goals against increase from 32 to 35, moving their goal difference from +18 to +17. They stay 4th in Serie A, and with only two games left, their margin for error in securing Champions League football tightens, leaving them vulnerable to pressure from teams immediately below.
Atalanta, who started on 58 points, climb to 61 after adding 3 points from this win. Their goals for move from 50 to 53, and goals against from 34 to 36, nudging their goal difference from +16 to +17. They remain 7th, but the gap to the top four narrows, keeping them firmly in the hunt for at least a Europa League place and, depending on other results, an outside shot at Champions League qualification.
Lineups & Personnel
AC Milan Actual XI
- GK: Mike Maignan
- DF: Koni De Winter, Matteo Gabbia, Strahinja Pavlović
- MF: Alexis Saelemaekers, Ruben Loftus-Cheek, Samuele Ricci, Adrien Rabiot, Davide Bartesaghi
- FW: Santiago Giménez, Rafael Leão
Atalanta Actual XI
- GK: Marco Carnesecchi
- DF: Giorgio Scalvini, Isak Hien, Sead Kolašinac
- MF: Davide Zappacosta, Marten de Roon, Éderson, Nicola Zalewski
- FW: Charles De Ketelaere, Giacomo Raspadori, Nikola Krstović
Expert's Post-Match Verdict
Allegri’s Milan paid heavily for a lethargic first half and soft defensive structure in transition. The 3-5-2 lacked compactness when Atalanta broke through the middle, allowing Éderson to dominate between the lines and directly contribute to two goals (1 goal, 1 assist) despite Atalanta producing only 1.08 xG. Milan’s late tactical shift, with Nkunku and Füllkrug introduced and Estupiñán pushing high, did change the dynamic and produced a strong attacking output (1.94 xG, 9 shots on target), but it came too late to fully overturn the deficit.
Palladino’s Atalanta delivered a clinical away performance, maximizing their chances with three goals from five shots on target and leaning on Carnesecchi’s excellent shot-stopping (8 saves) to withstand Milan’s late siege, a sign of both clinical finishing and resilient defending (3 goals from 1.08 xG; 8 saves from 9 shots on target faced). The early aggressive press and vertical passing into Raspadori and Krstović exploited Milan’s back three, and the timely substitutions, particularly reinforcing the flanks with Bellanova and adding Pašalić’s work rate, helped Atalanta survive the final onslaught. Overall, Atalanta’s efficiency and game management outstripped Milan’s belated dominance, and that difference in both boxes decided the match.


