Another fitful performance, another soulless defeat. This was the season when Manchester City wanted to make a statement in the Champions League; finishing with the lowest points tally of any English team in history was not what they had in mind.
Still, as defeats go, this at least has its compensations. Finishing bottom of Group D ensures that they escape being parachuted into the Europa League. No trips to Russia and Ukraine, Greece or Romania. Potentially nine fewer matches. And no wearying Sunday-Thursday-Sunday-Thursday carousel. It may help their prospects of retaining the league title, however outlandish that statement seems after such an ineffectual display.
"We are the champions, the champions of England," sang the City fans, defiant to the last. In the end, one goal – a 57th-minute tap-in from Julian Schieber – settled the match. But on a freezing night in Dortmund the gap between the Premier League winners and the elite teams in Europe looked as deep as a chasm.
This was not the Dortmund side that sliced and diced City's defences at the Etihad. Only five of that team started, with the captain, Sebastian Kehl, defender Sven Bender and Mario Götze injured and the Polish trio of Lukasz Piszczek, Jakub Blaszczykowski and Robert Lewandowski named as substitutes.
True, with Yaya Touré suspended and David Silva injured, City were missing their engine and their engineer. But this was probably as close to a first team as Roberto Mancini could be expected to pick, with only Sergio Agüero and Pablo Zabaleta left on the bench with Sunday's derby against Manchester United in mind. Scott Sinclair made his Champions League debut for the club alongside Carlos Tevez and Samir Nasri in City's attacking three, with Edin Dzeko leading the line. Nasri and Tevez showed flashes of their best form, but no more, while Sinclair and Dzeko disappointed and were substituted. But they were not the only members of Mancini's side who failed to step up.
The first half was a slow-burner, the first 10 minutes a training ground exercise in keep-ball, with Dortmund's players searching for familiar runs from unfamiliar team-mates and City content to prod and wait. It took 12 minutes for the first attempt on goal, although Oliver Kirch's gentle lob from 20 yards was easily saved by Joe Hart.
City were hardly in danger but they were not threatening much either, especially with Javier García misplacing passes in midfield, although Tevez looked dangerous when he came deep looking for the ball before seeking out the runs of Nasri on the right.
Gradually the game began to open up and Dortmund nearly went ahead when Moritz Leitner, Dortmund's exciting 19-year-old playmaker, only just missed the head of Schieber with a cross.
With the stadium scoreboard alerting the crowd that Cristiano Ronaldo and José María Callejón had put Real Madrid 2-0 up against Ajax before the half-hour, City knew that a win would open the door to a Europa League place. Briefly they upped the tempo and Dzeko's 20-yard shot forced the first decent save of the match from Roman Weidenfeller.
But as the first-half drew to a close Dortmund were pressing with greater intensity and venom and Hart had to be at his best to deny Marco Reus, who drifted in unchallenged from the right to a more central position before seeing his shot tipped on to the post.
From the restart, City could have gone ahead when Nasri's cross found Dzeko, but his header from six yards lacked force or direction. It was to prove their last chance to get their foot in front. Dortmund soon reasserted their dominance and never let up.
A battery of chances came and went: Mats Hummels, no more than three yards from goal, made a minimal connection from Marcel Schmelzer's inswinging free-kick. Hart palmed over Perisic's volley from Ilkay Gundogan's deep cross, before, a minute later, making an even better stop, getting a late wrist to Kevin Grosskreutz's drive from close range.
Just before the hour City brought on Agüero for Sinclair in search of a goal. It came, seconds later, only in the wrong net as Blaszczykowski skinned Matija Nastasic down the right before sending in a low cross that was tapped home by Schieber.
No sooner had Schieber wounded City than he failed to kill them off. Faced with a one-on-one with Hart, he seemed to have one eye on his YouTube highlight reel as well as the scoreboard, and his dink was saved at full stretch.
By now Dortmund were starting to toy with City, and the home supporters were humming along to Jingle Bells. The jovial pre-Christmas mood was interrupted when Mario Balotelli replaced Dzeko. The Italian was greeted with shrieking whistles – the legacy perhaps of his late equaliser at the Etihad – which only eased when the Italian trod on the ball with his first touch.
The boos continued but they briefly seemed to spark a City side that lacked devil or bite, with Tevez's jinking run ending with a fine block from Weidenfeller.
There was to be no late reprieve as Dortmund saw the game out with minimal distress. Indeed, they should have added to their lead. The unmarked Leitner passed his shot wide from 10 yards before Hart – who was excellent throughout – smothered substitute Robert Lewandowski's shot.
The margin of the defeat flattered City as much as the 1-1 draw at the Etihad. And Balotelli's injury-time booking for dissent made the victory for Dortmund's fans all the sweeter.