A goal from Kai Havertz just before the break was enough to give the London side a 1-0 in Porto.
What happened?
It was a nervy start for City who gave away possession repeatedly in the opening exchanges as well as getting caught on the counter-attack several times.
Yet the first opportunity came from a long Ederson ball that sent Raheem Sterling clear, but his first touch allowed Reece James to get a foot in and the chance fizzled away,
Chelsea then created two guilt-edged chances within the space of four minutes – both fluffed by Timo Werner – and we were fortunate not to fall at least a goal behind.
Whether it was the occasion that was getting to the players or Chelsea’s high press and defensive formation that was the issue was hard to tell – but it wasn’t the usual easy-on-the-eye City style.
Then, given a glimpse of a gap, Kevin De Bruyne played in Phil Foden who just had Edouard Mendy to beat - but Antonio Rudiger saved his side with a fine last-ditch tackle.
It would be our best chance of the game.
Chelsea’s threat on the break finally led to the opening goal when Mason Mount played Kai Havertz clear through the middle and the German rounded the onrushing Ederson before rolling the ball into the empty net.
It was a hammer blow but the warning signs had been there.
As the teams went in at the break, it was the Chelsea fans singing and waving their flags – City needed to rediscover their swagger and had 45 minutes to do it.
City were better after the break without really dominating, but when Rudiger clattered into De Bruyne just before the hour-mark, it was the Belgian who came off far worse, with his eye swelling up immediately.
He left the pitch in tears, utterly devastated.
Gabriel Jesus, followed by Fernandinho then came on for De Bruyne and Bernardo as Pep Guardiola shuffled his pack – but the clock was ticking against us.
City just couldn’t penetrate the Chelsea defence or the defensive midfield wall in front of it, with N’Golo Kante outstanding.
And Chelsea were mighty close to doubling that lead as Havertz put Pulisic in on goal but the American dinked his shot inches wide on 73 minutes.
That was enough for Pep who sent on Sergio Aguero for Sterling with 15 minutes left.
But apart from one Ruben Dias ball across the box that wasn’t converted and a last-minute Riyad Mahrez effort that floated inches over the crossbar, it just wasn’t our night.
City will come again
City will learn from this crushing disappointment.
To reach the Champions League final is a magnificent achievement and one we have waited many years for.
There can only be one winner in these contests and one side has to go home feeling crushed.
But the hoodoo and psychological barriers that may have been there previously for the players will have dissipated – and as frustrating as tonight was, that can also be the fuel that drives the team on again next season.
We will return and we will win this competition.
Pep reaction
“The decisions I made, the players did everything, the decision is always to try to win the game.
“I think the game was exceptional being the first time we were here. I know the opponents.
“The way we kept going second half, they made one counter attack with Pulisic, the long balls to Havertz were so strong, the second balls they win and they run, they are a really good team but we competed perfectly.
“It was a tight game, in the second half we deserved to score one goal, we couldn’t do it. Congratulations to Chelsea.”
Teams
City: Ederson, Walker, Zinchenko, Dias, Stones, De Bruyne (Jesus 59), Gundogan, Foden, Mahrez, Bernardo (Fernandinho 64), Sterling (Aguero 76)
Subs: Steffen, Rodrigo, Cancelo, Mendy, Laporte, Torres, Ake, Fernandinho, Carson, Garcia
Chelsea: James, Chilwell, Thiago Silva (Christensen 39),, Rüdiger, Azpilicueta, Kanté, Jorginho, Mount (Kovacic 80), Havertz, Werner (Pulisic 66)
Subs: Kepa, Alonso, Caballero, Zouma, Giroud, Hudson-Odoi, Ziyech, Gilmour, Emerson