Dortmund, who stay third in the table, entered the match having lost three of their last four in the league, and that poor run has been extended after a disappointing night at the Mercedes-Benz Arena.
Stuttgart took the lead in the fifth minute of the contest when a mix-up between Dortmund defender Marc Bartra and his goalkeeper Roman Burki saw Chadrac Akolo walk the ball into the back of the net in the simplest of fashions.
Dortmund, who were without star forward Pierre-Emerick Aubameyang due to 'disciplinary reasons', came close to levelling in the 35th minute when Mario Gotze struck one towards the bottom corner, but Stuttgart goalkeeper Ron-Robert Zieler was on hand to make a smart save.
The visitors had their equaliser in the final stages of the first half, however, when Maximilian Philipp found the top corner with a super finish after Zieler had kept out a penalty from Andre Schurrle, which was awarded after a handball from Benjamin Pavard.
Stuttgart restored their lead in the 51st minute though courtesy of a super strike from half-time substitute Josip Brekalo, who created space inside the Dortmund box before unleashing a powerful effort.
Dortmund thought that they had levelled once again in the 72nd minute when Andriy Yarmolenko found the top corner, but the 28-year-old's effort was chalked off following a handball in the build-up. Zieler then had to keep out a close-range effort from Schurrle as the visitors continued to impress.
Stuttgart had opportunities to put the game to bed in the latter stages, but as it transpired, two goals proved enough to overcome a Dortmund team that stay six points behind league leaders and reigning champions Bayern Munich.