Sergio Aguero missed a penalty as Chelsea came from behind to snatch a 2-1 Premier League win at the Etihad Stadium and delay Manchester City’s title-winning party.
Victory over the side they will face in the Champions League final in three weeks’ time would have seen City confirmed as Premier League champions for the third time in four years on Saturday.
But despite taking a first-half lead through Raheem Sterling, record goalscorer Aguero then embarrassingly fluffed his lines from the spot and Hakim Ziyech levelled for the Londoners after the break.
Marcos Alonso then grabbed the winner deep into injury time from a Timo Werner cross.
Despite the frustrating result, it remains only a matter of time before City are crowned champions again and it could even happen on Sunday if second-placed Manchester United lose to Aston Villa.
As happened before the midweek win over Paris St Germain, hundreds of City fans gathered outside the ground hoping to spur their team on to victory.
As people spilled into the road and blue flares were lit, the coaches carrying the players needed to slow down to get through the crowds as they made their way to the stadium.
With a large police presence to keep order, there were no signs of trouble but there was no obvious social distancing.
Similarities with Tuesday ended there, however, as City boss Pep Guardiola made nine changes to his team and deploying a different formation.
Ederson and Ruben Dias were the only survivors with the latter being one of three centre-backs to play along with Aymeric Laporte and Nathan Ake.
Kevin De Bruyne did not even make the bench as the ‘false nine’ system was shelved for the time being with strikers Aguero and Gabriel Jesus both starting.
That meant Thomas Tuchel was unlikely to glean much if he was hoping for Champions League final clues, but the German himself made five changes to his Chelsea team.
As a result the game lacked intensity but City had the better of the opening exchanges with Ferran Torres shooting well over, Jesus having an effort blocked and Benjamin Mendy driving wide.
Chelsea’s first opportunity came from a set-piece after Sterling was booked for a high challenge on Werner. Reece James fired the ball into the wall.
The game became cagey but there were further opportunities with Ake heading wide from a corner and Sterling shooting at Edouard Mendy after a rebound off N’Golo Kante.
Werner flicked the ball into the net for Chelsea but was flagged offside and later missed the target with a tame effort.
Ziyech connected with a better strike from distance but Ederson saved before Antonio Rudiger blasted over.
Drama followed in the closing two minutes of the opening half as first City took the lead through Sterling.
Jesus shrugged off the attention of Andreas Christensen – who was injured in the process – and burst into the area to square for the inrushing Aguero. The Argentinian spurned a great opportunity with a poor touch but it did not matter as Sterling was on hand to tuck home.
Aguero then missed an even greater chance moments later after Billy Gilmour clumsily bundled Jesus over to concede a penalty while Christensen was off the field.
City’s record goalscorer stepped up but attempted a Panenka-style kick and saw Mendy save with ease.
The tide turned after the break with Ziyech firing another good effort straight at Ederson and Christian Pulisic clearing the crossbar.
The equaliser then came just after the hour. Rodri lost possession on the halfway line and the visitors pieced together a good move down the right.
It ended with Cesar Azpilicueta picking out Ziyech just outside the area and the Moroccan drilling a low shot into the bottom corner.
The finish was frantic with Chelsea having two goals disallowed before Sterling had a penalty appeal turned down and Alonso then grabbed a last-gasp winner.