Flashscore followed the events around Germany in one of the tightest-ever endings to a Bundesliga season.
AS IT HAPPENED:
17:35 CET - Well, what drama on the Bundesliga's final day. For the neutral, great fun but for fans of Dortmund, heartbreaking stuff. Congratulations to Bundesliga champions Bayern Munich and their fans!
Wrapping up the other key results of the day - Leipzig defeated Schalke 4-2 and that means Schalke will be sent down to the second division. Union Berlin snatched a 1-0 win over Werder Bremen to secure fourth spot in the league and thus Champions League qualification.
17:29 CET - RESULT - Game over in Dortmund. It finishes 2-2 and Bayern win the Bundesliga.
17:27 CET - GOAL - DORTMUND HAVE EQUALISED! Sule has pulled another goal back for Dortmund. It's 2-2 but they need one more. Can they do it in the last seconds?!
17:27 CET - RESULT - Bayern have beaten Koln 2-1.
17:26 CET - Dortmund's Haller has a goal ruled out for offside. You feel like it's all over now for Dortmund.
17:23 CET - RESULT - Bochum have won 3-0 against 10-man Bayer Leverkusen. That should see them safe from the drop.
17:21 CET - GOAL - Bochum now lead Leverkusen 3-0, Leipzig lead Schalke 4-2 and Eintracht have found a way back against Freiburg, 2-1 there to Frankfurt.
17:19 CET - GOAL - Bayern have retaken the lead! Right at the death, Jamal Musiala has put Bayern ahead against Koln again. That would give them the title if Dortmund can't score another two goals.
17:14 CET - GOAL - Leipzig have scored a third against Schalke. 3-2 there and Schalke look doomed. Elsewhere, Union Berlin have scored to take a 1-0 lead over Werder Bremen, which moves them back into fourth!
17:11 CET - GOAL - Bayern have conceded! Now here's a twist! Bayern have conceded a penalty against Koln and it's 1-1 there. As things stand, that puts Dortmund back on top of the standings by one point!
17:10 CET - GOAL - Stuttgart have pulled one straight back against Hoffenheim! Can they get one more? That would take them above Augsburg and into safety.
17:07 CET - GOAL - Hoffenheim have taken the lead over Stuttgart. It's 1-0 there. That puts the lowly club in big trouble. Stuttgart are facing a relegation playoff as it stands with time running out.
17:04 CET - GOAL - Hertha have another goal! They now lead Wolfsburg 2-1. That means that Leverkusen, despite trailing 2-0 to Bochum, are back into sixth.
16:58 CET - GOAL - Dortmund have one! Raphael Guerreiro has made it 2-1 to give Dortmund some hope. They deserve that goal. Now they need a couple more to claim the title.
16:54 CET - We are past the hour mark now across the fixtures and although the goals have slowed down, the drama hasn't. Dortmund are huffing and puffing but they just cannot breach the Mainz defence. They still have time but it's looking like it might not be their day. Famous last words?
16:48 CET - GOAL - Rock-bottom Hertha Berlin have made it 1-1 against European hopefuls Wolfsburg. Nothing changes in the standings with that goal but now Wolfsburg only lead Leverkusen on goal difference in the race for the Conference League spot.
16:38 CET - GOAL - Schalke have staged a comeback! It's now 2-2 in their clash with Leipzig. It's still not enough for them, though. They need to win and thanks to Bochum's current result and Augburg's superior goal difference, they would still be in the bottom three even if they took the lead. It's not looking good for Schalke but they have to push for the win and hope.
16:36 CET - The second halves have started across the fixtures. The big question is - can Dortmund turn things around against Mainz? Never has the expression 'now or never' felt so apt.
16:25 CET - Here are the first-half stats from Dortmund's match with Mainz:
16:24 CET - Take a look at the first-half stats from the Bayern-Koln match below:
16:21 CET - HALFTIME - It's half-time around the grounds in Germany. As it stands, Bayern would win the league, Freiburg would sneak into the Champions League, Union would drop into the Europa League and Wolfsburg would take the Conference League spot. At the bottom, Schalke would go down and Stuttgart would face a relegation playoff.
16:18 CET - RED CARD - Augsburg have been reduced to 10 men in the dying moments of the first half against Monchengladbach. Thankfully for them, Stuttgart are still keeping them out of the bottom three.
16:17 CET - Bayern's second goal has been ruled out for a handball in the build-up. It's still 1-0 there.
16:15 CET - GOAL - Leroy Sane has doubled Bayern's lead over Koln. Nothing changes with that other than making it all the more vital that Dortmund turn things around and beat Mainz as a draw won't be enough for them.
16:11 CET - GOAL - Monchengladbach now lead Augsburg 2-0. That's not a good sign for the relegation-threatened Bavarian side but they are still sitting outside the bottom three thanks to other results.
16:05 CET - GOAL - Bochum have a second! It's now 2-0 to Bochum against 10-man Leverkusen. If things stay this way, Bochum are safe from the drop.
16:00 CET - GOAL - Schalke have pulled a goal back against Leipzig. It's 2-1 to RB now. Schalke need to come up with more goals to save themselves from the drop, though.
15:55 CET - GOAL - Incredibly, Mainz have scored again against Dortmund. They will surely rue that missed penalty now. As it stands, Bayern win the league.
15:53 CET - GOAL - More trouble for Schalke, they have gone 2-0 down at Leipzig.
15:52 CET - GOAL - Back to the bottom end of the table, Bochum have leapt out of the bottom three as things stand with an opening goal against 10-man Leverkusen.
15:50 CET - PENALTY MISSED - Would you believe it, Haller has missed the penalty for Dortmund! That could be crucial.
15:49 CET - Dortmund have been awarded a penalty and a chance to get right back into their match.
15:46 CET - GOAL - Mainz have scored to take a shock lead in Dortmund! The heat is really on now for Dortmund as Bayern are leading their match.
15:43 CET - RED CARD - Bochum have received a massive boost in their bid for survival as Leverkusen are down to 10 men already! Amine Adli was sent off in the eighth minute. It's a blow for Bayer who need to better Wolfsburg's result to snatch European qualification.
15:40 CET - GOAL - RB Leipzig have scored against Schalke. Leipzig have already sewn up third spot and Champions League football for next season but Schalke desperately need a win to get out of the bottom three.
15:39 CET - GOAL - Bayern have taken the lead against Koln! They didn't need long. That puts them on top of the table on goal difference for now and piles the pressure on Dortmund.
15:34 CET - GOAL - Not to be outdone, Monchengladbach have scored early, too. They lead Augsburg 1-0. The Bavarians could be in trouble if Bochum and Stuttgart both win today.
15:32 CET - GOAL - There's been an early goal in the Wolfsburg - Hertha game. Wolfsburg go 1-0 up against the already relegated Berliners. As it stands, that puts Wolfsburg into the Conference League place.
15:31 CET - Most of the matches are underway now. Nine games is a lot to follow but you can easily see how the league is affected throughout with the LIVE STANDINGS.
15:25 CET - The sun is shining, the fans are singing and they are about to kick off around the grounds in Germany!
15:00 CET - Welcome to our live coverage of the Bundesliga's last day. There is plenty on the line with the championship and relegation places yet to be fully decided.
We will be posting live updates from the key matches to keep you informed as the drama unfolds.