Hoffenheim striker Andrej Kramaric hit the woodwork with a third-minute shot and his team mate Oliver Baumann pulled off a great save to deny Dortmund’s Giovanni Reyna as the game started at a frantic pace.
It was a sign of things to come as Dortmund withstood a barrage of crosses early in the second half before mounting an attack down the left that ended with Reyna firing home the opening goal with a bouncing shot to Baumann’s left.
Hoffenheim kept up the pressure and drew level in the 61st minute when Dennis Geiger found Christoph Baumgartner with a great ball in behind the defence, and the winger drove his shot across the keeper and into the net.
Undeterred, Dortmund went ahead again eight minutes later as Jude Bellingham controlled a loose clearance on his thigh just inside the box before lashing the ball into the bottom left-hand corner to make it 2-1.
Munas Dabbur thought he had snatched a point for Hoffenheim with a goal in the final minute of normal time, but Haaland smashed a loose ball into the top corner a minute later to send the home crowd into raptures.
Dortmund held on until the referee blew the final whistle in the 98th minute to go top the table on six points, ahead of Wolfsburg on goal difference having played one more game.