Edin Terzic's side created several good opportunities in the first half, only to find themselves repeatedly thwarted by the Mainz goalkeeper or the woodwork.
Instead, it was Mainz who took a 57th minute lead through Levin Oztunali. Thomas Meunier levelled at 1-1 with 17 minutes to go, but Marco Reus' penalty miss moments later denied the hosts victory.
VAR denies Haaland
The ball was in the back of the Mainz net within 83 seconds. An early opener might have afforded the home side some breathing space, but the goal was ruled out after a lengthy VAR check. Meunier was deemed to be offside when Jadon Sancho played him through. The Belgian had then crossed towards Reus, who teed up Erling Haaland who fired home.
After being denied early on, it took Dortmund a little while to apply some constant pressure on the visitors' goal. Brandt won the ball back high up the pitch and played a one-two with Haaland before going for goal, but Robin Zentner made a strong save.
Minutes later, Emre Can regained possession and played a great ball into the path of Reus, but Zentner did well to save as the Dortmund skipper looked to dink the ball over the advancing keeper.
On the half hour mark, the hosts went even closer when Haaland picked out Bellingham in the middle, but his shot from inside the area rebounded back off the post.
Mainz only threatened on one occasion in the opening half, although Roman Burki was on hand to stop Robin Quaison's shot from the edge of the area. The hosts kept trying to create openings, but the Red and Whites kept their discipline, with every player involved in their structured defensive set up.
And when they spotted opportunities to break forwards, they did, and they broke the deadlock just before the hour mark. After doing well to win the ball in midfield, Danny Latza played a neat ball through to Oztunali. After beating two defenders, he fired a left footed strike from outside the area that flew into the top right corner, giving Burki little chance.
Terzic reacted immediately, bringing on Youssoufa Moukoko as a second striker to replace Bellingham. However, the visitors almost doubled their lead shortly afterwards, with Alexander Hack latching on to a free kick and heading the ball against the bar.
The Black & Yellows took a while to find their feet after the setback, but they responded and drew level after 73 minutes. The lively Moukoko got the better of Moussa Niakhate and cut the ball back from the byline. Philipp Mwene's clearance fell to the feet of Meunier, who arrowed a low shot into the bottom corner from just inside the area.
The chance to turn the game on its head came just 60 seconds later. Meunier was hauled down by Hack inside the area and Dortmund were awarded a penalty. Reus stepped up, but the skipper fired wide of the target from the spot.
As the game became stretched late on, it was Mainz who went closest to a winning goal when Oztunali struck the post before Niakhate ran the length of the pitch before dragging his effort wide as both sides were made to settle for a point.