Jude Bellingham’s close-range header early in the second half looked like it could be the difference on a generally frustrating night for Pep Guardiola’s men.
But Stones’ unstoppable drive with ten to play, followed by a phenomenal acrobatic finish from Haaland, turned the game on its head in the space of four second half minutes.
It means City have now equalled the record for the longest unbeaten home run by an English side in the Champions League, with our 21st match without defeat seeing us move three points clear at the top of Group G.
Two sides famed for their free-flowing attacking football initially cancelled each other out under the Etihad Stadium lights.
The first half-chance fell to a familiar face after 15 minutes, but Haaland wasn’t able to make contact with Riyad Mahrez’s inviting ball to the far post after a timely header away from Niklas Sule on the Dortmund line.
It was the visitors’ turn to go close soon after with Salih Ozcan’s curling effort from the edge of the City area perhaps a little closer to breaking the deadlock than Ederson’s typically impressive save suggested.
By our usual standards, it was a slow start from Pep Guardiola’s men, with Haaland unable to sort his feet out in time to pull the trigger after Kevin De Bruyne had scampered away from the attentions of Sule in our only other sight of goal in the first half.
For all of City’s possession, we were unable to register a shot on target before the break, with Dortmund also looking lively on the counter.
And Edin Terzic’s men almost broke the deadlock five minutes after the restart through Marco Reus.
The German international did well to evade the attentions of Akanji down the left after latching on to Bellingham’s pass, but his effort back across goal fell inches wide of the far post.
But our opponents weren’t to be denied a second time when Reus and Bellingham combined once again before the hour, with the former’s volley towards goal following a corner nodded home by the England midfielder from close-range.
But it was Haaland who was closest to breaking Dortmund’s stubborn resistance, with the striker firing wide from a tight angle after being released by De Bruyne.
An impressive last-ditch challenge from Mats Hummels denied the Norwegian a tap-in from Foden’s ball in behind as the clock ticked over the 70-minute mark, with City continuing to press forward in search of the elusive equaliser.
And it arrived in spectacular fashion soon after, but from an unlikely source.
With Guardiola’s men finally getting ourselves on the scoresheet, a second seemed inevitable, and it came when Haaland proved once again why he is one of the most highly rated centre-forwards in world football.
The Norwegian shrugged off the attentions of substitute Nico Schlotterbeck to meet Joao Cancelo’s trivela cross with an incredible acrobatic finish.
Despite the quality of the finish, the striker’s celebrations remained muted out of respect for a side he scored 86 times for in just 88 appearances before joining City this summer.
We were well and truly back to our best, and a third almost arrived through Alvarez as stoppage time approached.
However, we were forced to settle for two with the Argentine’s volley saved by the feet of Meyer.
150 not out
Until our dramatic late turnaround, it looked like Pep Guardiola's 150th Champions League match would end in defeat at the Etihad Stadium.
However, the boss' inspired second half substitutions demonstrated once again why he is one of football's finest tacticians.
While the Catalan is always keen to credit his players for their role in our recent success, Guardiola's managerial nous was crucial in securing his 95th Champions League victory.
The turning point
Stones' equaliser was just the 13th time he has found the net in 201 appearances for City, but while this was unquestionably the most spectacular of his goals in sky blue, it was also perhaps one of the most influential.
The centre-half was deployed at right-back in the absence of Kyle Walker, and marked his return from a minor injury in the best possible fashion.
Guardiola's men had been frustrated by Dortmund in a clash between two of Europe's heavyweights until the defender delivered his knockout blow.
A memorable return to action for the England international.
What it means
Victory for City means we maintain our 100% record in the Champions League after two matches.
We remain top of Group G, three points clear of second-placed Dortmund with six points from two matches.
- Aged 22 years and 55 days, Haaland is the youngest player in Champions League history to score for and against the same side in the competition (Borussia Dortmund), surpassing Álvaro Morata for/against Real Madrid (22y 194d).
- The Norwegian has scored 26 goals in 21 Champions League appearances, scoring every 62 minutes on average.
- City have equalled the longest unbeaten home run by an English side in UEFA Champions League history. Our 21st match without defeat at the Etihad Stadium matches Chelsea's record set between September 2006 and December 2009.
- Only Carlo Ancelotti (99/179) and Sir Alex Ferguson (102/190) have won more UEFA Champions League matches than Pep Guardiola (95/150).
Subs: Ortega Moreno, Carson, Dias, Gomez, Palmer, Lewis, Wilson Esbrand
Dortmund XI: Meyer, Meunier, Sule, Hummels, Gueirrero, Ozcan (Adeyemi 88'), Can, Bellingham, Reus (Moukoko 88'), Modeste (Schlotterbeck 78'), Reyna (Malen 62')
Subs: Brandt, Coulibaly, Hazard, Passlack, Rothe, Unbehaun, Wolf
City are back in Premier League action in Saturday’s lunchtime kick-off.
Pep Guardiola’s men lock horns with Wolverhampton Wanderers at Molineux, with kick-off scheduled for 12:30 (UK).
It represents our final match before the September international break, with our next encounter after Wolves being the first Manchester Derby of the new campaign.
News about Man City v Borussia Dortmund"
Pep points to City's staying power
Pep Guardiola pointed to the staying power of City after we staged another stunning late fightback to overcome Borussia Dortmund 2-1 in the Champions League. Watch more
Watch: Recovery session after defeat of Dortmund
Pep Guardiola's City squad were back at the CFA on Thursday morning for a wind down session just a few hours after the UEFA Champions League victory over Borussia Dortmund. Watch more
Pitcam highlights: City v Borussia Dortmund
Watch our dramatic Champions League victory over Borussia Dortmund from a unique angle. Watch more
City 2-1 Dortmund: Brief Highlights
The best of the action as City snatched a dramatic late victory in the UEFA Champions League. Watch more
Guardiola: 'Haaland winner reminded me of Cruyff goal'
Pep Guardiola praised John Stones and Erling Haaland for their late goals as City came from behind to beat Borussia Dortmund 2-1 Read more
Goater: 'Haaland amazes and surprises us every single time!'
Shaun Goater sound a special salute to Erling Haaland’s latest memorable City exploits, declaring that the Norwegian striker never ceases to ‘surprise and amaze us all.’ Read more
City trio up for Champions League awards
John Stones and Erling Haaland have both been shortlisted for the Champions League Goal of the Week award while Kevin De Bruyne is up for the Player of the Week prize after City’s 2-1 win against Borussia Dortmund on Wednesday. Read more
Haaland strike wins Champions League Goal of the Week
Erling Haaland's late winner over Borussia Dortmund has been named as the UEFA Champions League Goal of the Week. Read more
Haaland: Dortmund strike one of my best goals ever!
Erling Haaland has revealed that he ranks his spectacular Champions League winner against Borussia Dortmund as one of the best goals in his career to date. Read more
Full-match replay: City v Borussia Dortmund
Enjoy the full 90 minutes of City's dramatic Champions League clash with Borussia Dortmund on CITY+ and Recast. Watch more
City 2-1 Borussia Dortmund: Stats of the match
Erling Haaland was again the difference maker for City on Wednesday night, this time in the UEFA Champions League meeting with his old club Borussia Dortmund. Read more