Dortmund led 1-0 at the break and looked set to capitalise on league leaders Union Berlin's first loss of the year at Eintracht Frankfurt, but conceded two goals in two minutes early in the second half for their third loss of the season.
Dortmund led at half-time thanks to a Julian Brandt goal, set up by English teenager Jude Bellingham, who was named captain for the first time due to Mats Hummels' late withdrawal.
The visitors dominated the opening half and looked in full control of the game, until Florian Kainz equalised in the 53rd minute.
Former Dortmund striker Steffen Tigges took advantage of poor defending from a Dortmund corner just two minutes later, climbing above the defence to head home.
A suddenly unorganised Dortmund continued to defend poorly, giving midfielder Dejan Ljubicic far too much time in the 71st minute, allowing the midfielder to guide in a long-distance shot to put the game beyond doubt.
Dortmund pulled one goal back through a lucky deflection in the 78th minute, but Cologne held on for a deserved victory.
First loss for Union
Elsewhere, an early goal from Mario Goetze followed by an individual effort from Jesper Lindstroem guided Frankfurt to a comfortable 2-0 win over Union at home.
Frankfurt lost striker Randal Kolo Muani to a second yellow in the 68th minute, but the home side held firm to beat the previously unbeaten Berliners.
The season's other surprise package alongside Union, Freiburg, moved up to second after a dominant 2-1 win at home against Mainz.
Freiburg sprinted to a 2-0 half-time lead thanks to goals from Michael Gregoritsch and Daniel-Kofi Kyereh, but should have been further ahead and endured some nervy moments late after Mainz's Aaron Caricol scored in the second half.
A brace from Timo Werner and a penalty from Christopher Nkunku helped Leipzig to a 4-0 win over struggling Bochum, who are still winless after eight games this season.
In Wolfsburg, an injury-time goal from Yannick Gerhardt helped the home side to a 3-2 win over Stuttgart, just their second victory of the season.
Union's loss at Frankfurt - the Eagles' first home win of the season - combined with Dortmund's horror second-half will be music to the ears of Bayern Munich, who won their first game in five matches with a dominant 4-0 win over Leverkusen at home on Friday.
In Saturday's late game, Werder Bremen host Borussia Moenchengladbach.