Norwegian Haaland has now scored seven times in the league this season while taking his total tally to an impressive 68 goals in 67 games in all competitions for Dortmund.
- Don't have ESPN? Get instant access
- ESPN+ viewers' guide: LaLiga, Bundesliga, MLS, FA Cup, more
The visitors had the first good chance in the first minute but Dortmund quickly took control with Raphael Guerreiro firing them in front after a lightning-quick passing move that left the Union defence frozen in the 10th minute.
With Dortmund's Donyell Malen wreaking havoc with his speed down the wing, it was only a matter of time until they added to their score line. But it was Union who did it for them when defender Marvin Friedrich's clumsy clearance of a Marco Reus cutback landed in his own net in the 52nd.
"We made it today again unnecessarily difficult for us," said Dortmund captain Reus. "We are 3-0 up, concede a silly goal then one from a set piece. The fourth or fifth time this season.
"You invest an enormous amount and we just can't gift away goals like that. We have to quickly start working on that. But we are happy to have won the game."
Max Kruse's penalty five minutes later cut the deficit and Andreas Voglsammer's 81st minute header gave Union hope briefly before Haaland latched onto a deep Mat Hummels cross, saw keeper Andreas Luthe off his line and lobbed the ball high over him to restore order with a remarkable finish.