On a day when little went right for the champions and, as has happened on a number of occasions this season, VAR decisions didn’t go in our favour, the visitors scored two first half goals and defended in numbers thereafter.
Nicolas Otamendi pulled a goal back five minutes from time, but there wasn’t enough time to find an equaliser.
City started brightly without ever making David de Gea work too hard.
There were a couple of appeals for handball – one in particular against Scott McTominay that looked worthy of a VAR check – but nothing was given.
United looked dangerous every time they attacked and Ederson was proving the busier of the two keepers with a number of fine reflex saves.
But on 21 minutes, VAR did become involved as Bernardo collided with Marcus Rashford and the decision was a penalty.
Rashford converted from the spot and he could have had a second a couple of minutes later as he curled a shot inches wide from the edge of the box.
Then the England forward struck the crossbar from 18 yards as City struggled to cope with the pace of the Reds’ attack.
When Anthony Martial squeezed a low shot past Ederson just before the half-hour mark, it looked like it might not be City’s day.
Frustration grew as the half wore on and the City fans were up in arms – literally - with almost the last action of the first half as Kevin De Bruyne’s low cross struck Fred’s arm, but whatever the rule is for handball these days, it didn’t apply in this instance as a the VAR review resulted in a corner, not a penalty.
To say Pep Guardiola wasn’t impressed is an understatement.
City tried to build up a head of steam and fin a way back into the game and on 55 minutes, De Bruyne looked set to halve the deficit as he broke free in the box, but Victor Lindelöf’s desperate lunch defected the ball out for a corner.
The champions kept going and Raheem Sterling’s mazy run was scrambled clear and Rodri saw his pile driver turned over by David de Gea on 63.
And the near-misses continued, until sub Otamendi headed home De Bruyne’s corner with five minutes left.
But though City came close at least twice in the time that remained, but couldn't find the equaliser in a frantic finish.
What it means…
City remain third behind Leicester and some 14 points off leaders Liverpool.
City travel to Dinamo Zagreb on Wednesday to play the final match of the group stage.
Pep Guardiola’s men have already qualified for the Round of 16.
Then, next Sunday, Arsenal host the champions at the Emirates Stadium – with a 4.30pm kick-off.