Jurgen Klopp's side was always in control of the Ruhr derby and rounded off a fine seven days with a comfortable win.
In a game delayed slightly by crowd disturbance, Dortmund atoned for double defeat to its fierce rival last season and maintained pace with Bayer Leverkusen and Bayern Munich at the Bundesliga summit.
Pierre-Emerick Aubameyang turned home in the 14th minute after a typically energetic start from the visitors, who continued to dominate after taking the lead.
However, Schalke was gifted a chance for an equalizer against the run of play on the half-hour mark as Neven Subotic was penalized for a foul on Christian Fuchs in the penalty area.
Kevin-Prince Boateng stepped up from 12 yards, but was denied by Roman Weidenfeller - the Dortmund keeper's fourth penalty save from the last eight he has faced in Bundesliga games.
A stunning strike from Nuri Sahin doubled Dortmund's lead, but it was pegged back by teenage substitute Max Meyer's third goal of the season.
As Schalke pushed on for a winner though, Jakub Blaszczykowski netted on the break with 16 minutes remaining to seal Dortmund's win.
Jurgen Klopp made just one change to the side that beat Arsenal in the Champions League on Tuesday, replacing Blaszczykowski with Aubameyang, while former Dortmund loanee Boateng returned to Schalke's team in one of four changes.
The start of the game was delayed by 10 minutes as sections of the Dortmund support appeared to throw flares onto the pitch and toward nearby home fans.
Once the action did get underway, Dortmund exploded into life with Marco Reus thundering a volley at Timo Hildebrand.
And Dortmund was rewarded in the 14th minute as slick interplay from Kevin Grosskreutz and Henrikh Mkhitaryan gave Reus free space on the right and he cut back for Aubameyang to tap in.
Hildebrand had to be alert to save another Aubameyang effort soon after, but Schalke were handed a way back into the game as Subotic was judged to have fouled Fuchs in the box. However, Weidenfeller was on hand to spring to his right and keep Boateng's penalty out.
The save opened the game up, but Schalke was unable to equalize with Roman Neustadter spurning a good chance from Fuchs' corner late in the half.
And it was made to pay just five minutes after the break, with Sahin receiving the ball 20 yards out and lashing an effort across Hildebrand.
Subotic denied Julian Draxler with a brave block, but Schalke halved the deficit just after the hour mark as Meyer swept home, having been on the pitch less than a minute.
But Klopp will have been happy with a change of his own 10 minutes later, as Blaszczykowski latched onto Mkhitaryan's throughball to slot past Hildebrand and restore the two-goal cushion.
Weidenfeller was forced to tip away Draxler's fierce effort in the closing stages, but Dortmund comfortably held on to take the derby bragging rights.