Dusseldorf went down 3-0 at Hannover to finish the season second bottom of the table, with their two relegation rivals both ending their campaigns with victories.
Mame Diouf put Hannover ahead in the 36th minute and Didier Ya Konan put the result beyond doubt with a second-half double.
The visitors could not muster any sort of response as their fifth straight defeat, and eighth in 10 league games, condemned them to an immediate return to the second tier.
Hoffenheim, who started the day two points behind Dusseldorf, scored two late goals to win 2-1 at Champions League finalists Borussia Dortmund and make the relegation play-offs.
Things looked bleak for the visitors when Robert Lewandowski put them behind after six minutes, but Sejad Salihovic equalised with a penalty in the 77th minute.
Three minutes later Dortmund goalkeeper Roman Weidenfeller saw red for bringing down Sven Schipplock when he was through on goal and, with no more substitutions left, winger Kevin Grosskreutz went in goal for the resulting penalty.
Salihovic took it again, and scored again, to complete the comeback.
Hoffenheim now face Kaiserslautern, who came third in the second tier, in a two-legged play-off for the right to stay in the Bundesliga.
Augsburg guaranteed their top-flight status with a 3-1 win at home to relegated Greuther Furth, a result which lifted them out of the bottom three for the first time all season.
Tobias Werner put the hosts ahead after 30 minutes after Edgar Prib had seen a penalty saved at the other end, and Jan-Ingwer Callsen-Bracker made it two 10 minutes after the break.
Florian Trinks made things nervous for Augsburg by halving the deficit just after the hour mark, but Ji Dong-won allowed them to breathe easy with a third 15 minutes from time.
Schalke took the fourth and final Champions League place by winning what was effectively a play-off with Freiburg 2-1.
Julian Draxler put the Royal Blues ahead after 20 minutes and, even though Jonathan Schmid levelled in the 54th minute, Julian Schuster's own goal three minutes later handed victory to Schalke.
Eintracht Frankfurt joined Freiburg in the Europa League thanks to a 2-2 draw with Wolfsburg meaning Hamburg missed out as they lost 1-0 to third-placed Bayer Leverkusen.
Things looked worrying for Eintracht when they fell 2-0 down inside 20 minutes thanks to goals from Jan Polak and Diego.
But the Wolves had Makoto Hasebe sent off in the 35th minute and Alexander Meier immediately pulled one back from the spot before Ricardo Rodriguez's last-minute own goal earned them a draw.
Bayer also went down to 10 men before the break, Michal Kadlec seeing red in the 39th minute, but they won it in the last minute thanks to Stefan Kiessling's goal.
Champions Bayern Munich recovered from conceding three times in the opening 10 minutes to win 4-3 at Borussia Monchengladbach, with Franck Ribery scoring twice.
Goals from Martin Stranzl and Mike Hanke had Gladbach two up after five minutes and, even though Javi Martinez pulled one back two minutes later, Havard Nordtveit made it 3-1 with only 10 minutes gone.
Ribery got Bayern's second in the 18th minute and then equalised in the 53rd minute.
And Arjen Robben got the winner six minutes later to earn Bayern victory.
Werder Bremen ended a miserable season which earlier this week cost Thomas Schaaf his job with a 3-2 loss at Nuremberg.
Kevin De Bruyne put Bremen in front after 37 minutes, but goals in the final 30 minutes from Per Nilsson, Sebastian Polter and Tomas Pekhart turned the game around.
De Bruyne got a second in the 89th minute, but it was too little too late.
Stuttgart drew 2-2 at home to Mainz.
Chinedu Ede put Mainz ahead in the 16th minute, but goalkeeper Christian Wetklo's own goal six minutes later made it 1-1.
Arthur Boka then gave Stuttgart the lead just after the half-hour mark, only for Nicolai Muller's goal shortly before half-time to make it 2-2.
Saturday's Bundesliga Results
Borussia Dortmund 1-2 Hoffenheim
Borussia Monchengladbach 3-4 Bayern Munich
Eintracht Frankfurt 2-2 Wolfsburg
Augsburg 3-1 Greuther Furth
Hamburg 0-1 Bayer Leverkusen
Hannover 3-0 Fortuna Dusseldorf
Nuremberg 3-2 Werder Bremen
Freiburg 1-2 Schalke
Stuttgart 2-2 Mainz