Jurgen Klopp's men fell behind early on in the contest, but fought back to claim the three points with a spirited display of attacking football in Gelsenkirchen
Jefferson Farfan stunned the visitors with a powerful shot, which deflected off Shinji Kagawa before flying into the right corner. Lukasz Piszczek levelled matters just before half-time with an equally-stunning strike, and Sebastian Kehl netted the winner after the break to seal the win.
Dortmund had the chance to take an early lead as Sven Bender was released by Robert Lewandowski, but the Germany international could only shoot straight at Lars Unnerstall.
Schalke recovered from the early shock and soon started creating chances of their own. In the ninth minute, following a poorly-cleared corner, Farfan let fly with a glorious volley, which met the head of Kagawa before nesting in the net.
Dortmund answered almost instantly as Lewandowski was released in a one-on-one with Unnerstall, but could only shoot wide. Just before the 20-minute mark, Piszczek showed his fellow Poland international how it is done with a fine long-range strike, which ended in the right corner.
The tempo dropped in the following minutes, but just before half-time Klaas-Jan Huntelaar missed a glorious opportunity, sending a header just wide, following a free kick by Christian Fuchs.
The duo once again bypassed Dortmund's defence shortly after the restart, but the Dutchman failed to find the net for a second time. Raul also went close to scoring near the hour mark, but a brave block by Mats Hummels prevented a second strike by Schalke.
Dortmund soon turned the heat up on the Royal Blues, however, as they started pinning the hosts in their own half. They then took the lead in the 63rd minute, when a mistake by Christoph Metzelder allowed captain Kehl to poke home from close range.
Schalke and BVB traded chances in the remaining minutes, but neither team created a clear-cut opportunity.
Following today's result, BVB are first in the standings with 72 points, while Schalke are third with 57. Dortmund's next game is at home against Borussia Monchengladbach on April 21, while Schalke travel to Augsburg the next day.