Raheem Sterling scored for the first time since February when he slid in to take the ball off of Sergio Aguero’s toe.
The Argentine missed a penalty when his Panenka was easily saved by Eduoard Mendy, and Hakim Ziyech struck the equaliser with a half-volley in the second half.
And Marcos Alonso scuffed home the winner late on, with the defeat leaving Manchester City 13 points clear at the top of the Premier League, and Manchester United must win every game to stop Pep Guardiola’s side from winning the title.
As for Chelsea, they are now up to third and move six points clear of West Ham who face Everton on Sunday and are now one point ahead of Leicester City, who drop down to fourth.
Here are five things we learned from the game at the Etihad Stadium.
Oh no, Sergio
If Sergio Aguero was hoping to start in the European final, he definitely miscued his dress rehearsal.
The Argentine first displayed a horrible touch that allowed Raheem Sterling to spare his blushes and bundle in.
Minutes later, Aguero attempted a Panenka-style penalty only for Edouard Mendy to easily smother it.
It was not a vintage outing for Aguero – and you can bet that Guardiola will remember this performance when picking the team in Istanbul.
The Kante revolution continues
Despite a tumultuous start to the season, N’Golo Kante has certainly come into form at the appropriate time for Blues fans.
The Frenchman dominated Toni Kroos and Luka Modric in both legs of the Champions League semi-final, and he controlled the midfield battle against Rodri.
Fernandinho will provide a different test in the final, but Kante will be giving Guardiola sleepless nights come the end of May.
Chelsea missing Mount
While it is understandable that Thomas Tuchel decided to give Mason Mount a deserved rest, Chelsea are a different team without the English midfielder.
Ziyech scored in the second half, but the Blues were clearly lacking a creative presence that could link the midfield and attack – particularly as seamlessly as Mount.
He certainly deserved the game off, but the match highlighted the 22-year-old’s influence on Tuchel’s side.
Both clubs refused to show their hand ahead of Champions League Final
After both Manchester City and Chelsea won their respective European ties, the two clubs refused to show how they will line-up in the Champions League final.
Guardiola deployed both Gabriel Jesus and Sergio Aguero – which is unlikely to say the least in Istanbul – with Ferran Torres in central midfield.
As for the Blues, Tuchel played Billy Gilmour ahead of Jorginho, with Mateo Kovacic still injured, while Mason Mount, Ben Chilwell and Thiago Silva were all rested.
It appears all eyes are on Saturday 29 May.
Do Chelsea need a striker?
Timo Werner has been better, as his work rate and incisive runs have opened up teams recently.
However, his finishing is truly woeful and that trend continued at the Etihad, though he did manage to contribute in the build-up to another Blues goal, pulling the ball back for Alonso’s winner in stoppage time.
The Blues have been linked with Sergio Aguero, but the Argentine didn’t exactly light it up on Saturday.
Chelsea’s top scorer in the Premier League this season has six goals – they need a goalscorer if they are going to challenge for the title.