Dortmund’s home win leaves them just one point behind arch-rivals Schalke, who are second in the Bundesliga table despite Saturday’s shock 3-2 defeat at Hamburg, ahead of next Sunday’s Ruhr derby in Gelsenkirchen.
Pulisic, 19, gave Dortmund the lead against mid-table Stuttgart at a sun-soaked Signal Iduna Park.
His cross dipped over Stuttgart goalkeeper Ron-Robert Zieler to crash in off the post on 38 minutes.
Pulisic’s fortuitous effort was the highlight of a below-par performance from Peter Stoeger’s Dortmund who were lucky to lead at the break.
It was a totally different story after half-time as the hosts took the game by the scruff of the neck.
Belgium striker Michy Batshuayi, on loan from Chelsea until the end of the season, made it 2-0 just three minutes into the second half as Dortmund flew out of the blocks.
Batshuayi delicately flicked the ball into the path of Nuri Sahin, who returned the pass to the Belgian in the box for a simple tap-in from close range to leave Stuttgart on the ropes.
— Bundesliga English (@Bundesliga_EN) April 8, 2018
Dortmund finished the visitors off when Pulisic headed back to Maximilian Philipp, whose first effort was parried by Zieler, but the winger tucked home the rebound with an hour played.
It was Philipp’s first goal since November, when he also scored in a 2-1 defeat at Stuttgart.
Batshuayi, who has now scored seven goals in nine league games since arriving in January, could have added another soon after when he fired wide.
Stuttgart striker Mario Gomez threatened the Dortmund goal when he clipped the crossbar five minutes before the final whistle.
On Saturday, Bayern Munich were confirmed as Bundesliga champions for the sixth straight year as their 4-1 win at Augsburg left them 20 points clear with only five games left.
Bayern Munich were crowned Bundesliga champions for the sixth consecutive season on Saturday as James Rodriguez helped turn the game in their 4-1 comeback victory at Augsburg.
The result means Bayern are German league champions for the 28th time in their history, and it was the sixth year in a row they have won the Bundesliga since their treble-winning season in 2013.
Augsburg took a shock lead through an own goal by Niklas Suele, but the Bavarians roared back as Corentin Tolisso, James — who then assisted Arjen Robben — and Sandro Wagner all scored.
The result leaves Bayern 20 points clear with five league games left and underlined their absolute dominance of the Bundesliga.
“It’s always good (to win a title) — we knew it was going to happen, but we still had to confirm it,” said Robben, who has now won the Bundesliga title seven times since joining Bayern in 2009. “Nothing is given away in the Bundesliga.”
Bayern were five points adrift when Carlo Ancelotti was sacked as head coach last September, but 72-year-old Jupp Heynckes who replaced him credited the players with turning Bayern’s fortunes around.
“The coach is responsible for the big picture, but first and foremost the players are the protagonists, they have done an outstanding job,” said Heynckes.
With one eye on Wednesday’s Champions League quarter-final second leg against Sevilla, in which Bayern hold a slender 2-1 lead, Heynckes gambled by resting his stars.
Top scorer Robert Lewandowski, plus Thomas Mueller, Thiago Alcantara, Mats Hummels and Javi Martinez all started on the bench in Augsburg.
Sevilla would have been encouraged by the comedy of errors in Bayern’s defence that led to Augsburg’s opening goal.
Jerome Boateng lingered over a back pass and Colombian forward Sergio Cordova robbed him of possession, sending Boateng tumbling to the turf.
Cordova’s shot was blocked by Bayern goalkeeper Sven Ulreich, but the ball ricocheted up into Suele’s face and into Bayern’s goal to stun the visitors on 18 minutes.
However Munich hit back to lead 2-1 by half-time. Joshua Kimmich picked out the unmarked Tolisso to head them level on 32 minutes and Bayern then laid on a top-class goal to take the lead at the WWK Arena.
Kimmich was again involved, firing a pass across goal after combining with Robben for Juan Bernat, who backheeled the ball which James fired home seven minutes before the break.
The Colombian then ensured the title was heading to Munich, hooking the ball back into play at the far post for Robben to drill his shot inside the near post on 62 minutes.
Ribery celebrated his 35th birthday with a cameo appearance for the final eight minutes before Wagner headed in Bayern’s fourth.
4️⃣ titles playing for Gladbach.— Bundesliga English (@Bundesliga_EN) April 7, 2018
4️⃣ titles managing Bayern.
1️⃣ Bundesliga legend. pic.twitter.com/DJ0Ks4926P
The Bavarian giants will formally lift the Bundesliga shield after the final matches on May 12.
Elsewhere, second-from-bottom Cologne suffered a blow to their survival hopes as they were held to a 1-1 draw by Mainz.
An early goal by Cologne’s Germany defender Jonas Hector was cancelled out as Pablo De Blasis headed an equaliser for Mainz five minutes into the second half.
With five games left, Cologne are six points behind Mainz, who are 16th, the position which carries a relegation play-off berth against the third-best team in the second tier at the end of the season.
Wolfsburg won 2-0 at Freiburg in a match between two sides just above the bottom three and fighting to stay up.
With just two minutes gone at the Schwarzwald Stadion, Wolves striker Daniel Didavi held off his marker and fired past despairing Freiburg goalkeeper Alexander Schwolow. Didavi added a second with seven minutes remaining.
Thorgan Hazard, the younger brother of Chelsea’s Eden, came off the bench to score twice as Borussia Moenchengladbach climbed to eighth with a 2-1 win at home to Hertha Berlin.
Salomon Kalou gave Hertha an early lead, but Hazard came on to score on 75 minutes, then net a late penalty.
Second-placed Schalke are now 14 points behind Bayern, meaning the league leaders cannot wrap up a sixth consecutive Bundesliga title when they face Borussia Dortmund later.
Caligiuri put Schalke ahead from the penalty spot on 63 minutes, before Freiburg striker Nils Petersen saw a second yellow card for dissent. With both their striker and their coach Christian Streich sent off, Freiburg capitulated, and Burgstaller secured victory 17 minutes from time.
Elsewhere, RB Leipzig survived a late scare in Hanover, battling to a 3-2 victory to break back into the top four.
Leipzig drew first blood on 16 minutes, as Timo Werner broke down the right flank to provide Emil Forsberg with the easiest of tap-ins.
Willi Orban doubled the lead early in the second half, sending a powerful header past Philipp Tschauner. Salif Sane quickly pulled one back for Hanover, before Yussuf Poulsen appeared to secure victory for Leipzig in the 76th minute.
Schalke made it six wins on the spin this afternoon 🌀
— FC Schalke 04 (@s04_en) March 31, 2018
Niclas Fuellkrug fired Hanover back into the game with a flying header, and appeared to complete a dramatic comeback when he found the net again minutes later, only to see his equaliser disallowed for offside through VAR.
“The three points are hugely important for us and we are happy that we got the reward for our hard work,” said Leipzig coach Ralph Hasenhuettl. “But we need to regain stability at the back.”
Leipzig leapfrog Bayer Leverkusen into fourth, as the latter were held to a turgid 0-0 draw by Augsburg.
At the other end of the table, Hamburg dropped more points as they drew 1-1 in Stuttgart. Lewis Holtby scored his first league goal since August to fire Hamburg into the lead on 18 minutes, but Daniel Ginczek equalised against the run of play for Stuttgart just before half-time.
Hamburg remain bottom, a point behind fellow strugglers Cologne, who were subjected to a 6-0 thrashing at Hoffenheim.
Serge Gnabry scored two brilliant goals to kick-start the rout. Having danced around several defenders to fire in a net-busting opener in the first half, Gnabry grabbed a second just after half-time, picking out the bottom corner from the edge of the box.
Cologne-born forward Mark Uth grabbed a brace, as he and Lukas Rupp scored three goals in the space of 10 minutes. Uth then set up Steven Zuber to prod home Hoffenheim’s sixth.