West Brom clinched promotion to the Premier League thanks to a battling 2-2 draw with QPR on an incredible final day to the Championship season.
The Baggies claimed the second automatic promotion spot behind Leeds as third-placed Brentford slipped up to Barnsley, whose late winner kept them out of the relegation zone.
Hull, Charlton and Wigan ended the season in the bottom three, though the Latics are appealing against their 12-point deduction, while Swansea pipped Nottingham Forest to the last play-off spot on goal difference.
At the Hawthorns, Ryan Manning and Ebere Eze scored for the Rs, but Slaven Bilic’s men secured a top-tier return thanks to strikes from Grady Diangana and Callum Robinson.
Brentford blew the chance to gazump West Brom and swipe automatic promotion, by losing 2-1 at Griffin Park to Barnsley
Clarke Oduor’s added-time goal kept the Tykes up. They had led through Callum Styles, before Josh Dasilva levelled for Thomas Frank’s men.
Fulham also missed the opportunity to sneak into second, drawing 1-1 at Wigan.
Kieffer Moore put the Latics 1-0 up, only for Neeskens Kebano to equalise with a free-kick. Wigan’s 12-point disciplinary penalty will see them relegated, pending any reversal on appeal.
Veteran forward Wayne Routledge bagged an added-time goal to send Swansea into the play-offs, at the expense of Forest.
The Swans thumped 10-man Reading 4-1 to leapfrog Forest on goal difference, with the City Ground club dropping out thanks to a 4-1 home defeat by Stoke.
Former Crystal Palace winger Routledge scored twice, with Liam Cullen and Rhian Brewster also on target for the Swans.
Reading had Yakou Meite send off for violent conduct, with George Puscas scoring a penalty for the Royals.
James McClean scored himself then teed up Lee Gregory to help Stoke condemn Forest to another season in the Championship.
Danny Batth headed Stoke into the lead, with Tobias Figueiredo bringing Forest level.
After McClean’s input, Forest needed a goal buy at the death Nuno Da Costa put through his own net to complete a miserable night for the hosts.
Cardiff sealed their play-off place by thumping Hull 3-0 to confirm the Tigers’ relegation.
Junior Hoilett, Sean Morrison and Danny Ward all found the net as Gary Neil Harris’ Bluebirds ensured they will stay in the promotion hunt.
Champions Leeds had comfortably the most serene evening amid the many madcap finishes elsewhere.
Marcelo Bielsa’s Premier League-bound Leeds thumped Charlton 4-0, to end their campaign on 93 points – but also relegate the Addicks.
Ben White, Stuart Dallas, Tyler Roberts and Jamie Shackleton all scored for the Elland Road men, with Pablo Hernandez laying on two assists.
Lee Bowyer’s Charlton slipped to a seventh consecutive match without a win, and out of the division thanks to Luton’s 3-2 win over Blackburn.
Luton staved off relegation thanks to two own goals from Blackburn in a 3-2 home victory. Hayden Carter and Bradley Johnson both put through their own net, with James Collins netting a penalty.
Adam Armstrong and Sam Gallagher hit the target for Blackburn.
Britt Assombalonga’s late goal sealed Middlesbrough’s survival with a 2-1 win at Sheffield Wednesday.
Jacob Murphy had put Wednesday in front, only for Paddy McNair to equalise.
Birmingham avoided the drop despite a 3-1 home reverse to Derby, in Borussia Dortmund-bound Jude Bellingham’s last game for the Blues.
Graeme Shinnie, Morgan Whittaker and Louie Sibley all netted for the Rams, with Ivan Sunjic on target for the St Andrews men.
Connor Mahoney, Jake Cooper, Jiri Skalak and Jon Dadi Bodvarsson all scored as Millwall thumped Huddersfield 4-1 at The Den, with Karlan Grant on target for the visitors.
Famara Diedhiou’s strike sealed Bristol City a 1-1 home draw with Preston, who had taken the lead through Sean Maguire.