Julian Scheiber struck to condemn Manchester City's dismal Champions League campaign to a suitably sorry end in Dortmund.
The Premier League champions already knew they could not progress from Group D but had been looking to secure a consolation place in the Europa League.
With Ajax losing at Real Madrid that possibility was open to them, but it proved beyond Roberto Mancini's men as Schieber hit the only goal of a subdued affair at the Westfalenstadion just before the hour.
In time, they may find the lack of European action assists them in their title defence but they must get the disappointment out of the system quickly before Sunday's derby against Manchester United.
The result left City bottom of their group with just three points and without a win, one of the worst performances by an English side at this stage of the competition.
It was a win Dortmund - already confirmed as group winners - achieved without dynamic midfielder Mario Gotze and, for the most part, prolific striker and reported Manchester United target Robert Lewandowski.
With specialist left-backs Aleksandar Kolarov and Gael Clichy injured, Matija Nastasic returned to the side to fill that role and looked composed throughout a quiet first half.
Carlos Tevez and Edin Dzeko showed some early signs of linking well together but, that aside, it was a while before the game warmed up.
Scott Sinclair, starting for the first time since September, was given some opportunities on the ball as City controlled possession but little came of it.
Dortmund had the first attack of note when they countered after 11 minutes but Marco Reus' shot was comfortably claimed by Joe Hart.
Reus made another break but Joleon Lescott came across to rob the ball.
It was not until midway through the half that City produced anything meaningful with their possession as Samir Nasri slipped in Dzeko but his cross for Tevez was cut out by Marcel Schmelzer.
Schmelzer brought Dortmund forward but Julian Schieber was unable to control his pass on the edge of the box.
City's best chance of their first half came when they finally got in a shot on goal just after the half hour.
A controlled move created the opportunity for Dzeko but the Bosnian's low effort was tipped around the post by Roman Weidenfeller.
That finally sparked the game into life and Reus ran across the edge of the City box before shooting narrowly wide.
Tevez brought a good save out of Weidenfeller with a firm header from a Maicon cross but a flag had already been raised for offside.
Dortmund broke again but Ivan Perisic was wasteful with his cross.
Perisic demonstrated greater ability when he fired in a shot from 18 yards just before the break but Hart saved.
City made a positive start to the second period with Nasri finding room on the left and crossing deeply into the box for Dzeko but Weidenfeller kept out his header.
Dortmund upped their tempo and started to worry City with Perisic testing Hart with a fierce left-foot volley.
Hart was in action again moments later, saving low to his right after good work by Kevin Grosskreutz.
Dortmund claimed the lead soon after as substitute Jakub Blaszczykowski beat Nastasic out wide and crossed low for Scheiber to tap in.
Gareth Barry and Lescott argued with the referee, presumably over something in the build-up, but the former earned a yellow card for his protestations.
Having already sent on Sergio Aguero, City boss Roberto Mancini tried to enliven his attack further by introducing Mario Balotelli - and the Italian was met by loud boos from the home fans.
That may have had something to do with the controversial late penalty Balotelli scored when the sides met at the Etihad Stadium - which was awarded for handball - and he was given no let-up.
Tevez tried to lead a recovery with a strong run through the heart of the Dortmund defence but Weidenfeller dealt with his shot.
Dortmund pieced together another good move but Moritz Leitner shot wide from close range.
Leitner was presented another chance after a poor clearance by Maicon but screwed an effort well off-target.
Lewandowski, introduced 12 minutes from time, went through on goal but Hart stood up to him to block.
Aguero threatened an equaliser five minutes from time but could only pick out Weidenfeller.
It appeared it was just not going to happen for City and the crowd lapped up an act of petulance from a frustrated Balotelli after a decision went against him in injury time.
– Man City keeper Joe Hart.
We wanted a win and we've let ourselves down. We wanted to do it and if that meant Europa League then great… We've only got ourselves to blame.