Match ends, Rotherham United 2, Shrewsbury Town 1.
Rotherham skipper Richard Wood scored twice in the League One play-off final as they beat Shrewsbury in extra time to win promotion to the Championship.
Millers forward David Ball missed a first-half penalty, given for a foul by Omar Beckles, before defender Wood headed Rotherham in front at Wembley.
Alex Rodman levelled with a well-worked second-half equaliser for Shrewsbury.
But Wood stole in unmarked to meet another Joe Newell cross and steer home a 103rd-minute winner off the post.
Rotherham, relegated from the Championship just 13 months ago, had the better of the chances and were worthy winners.
And it was only a fantastic stop from Town's on-loan Manchester United keeper Dean Henderson to deny Ryan Williams, on top of his first-half penalty save, that took the game to an extra half-hour.
Shrewsbury have now been to Wembley five times - most recently seven weeks previously, when they were beaten by Lincoln City in the EFL Trophy final - and they have lost on each occasion.
Beckles struggles at set-pieces
Before Rotherham scored, Shrewsbury had already had one big escape when defender Beckles wrapped his arms round Wood's neck to give away a ninth-minute penalty.
Henderson dived to his right, a couple of yards off his line, to parry Ball's spot-kick.
But, having got away with a similar set-piece offence on Wood, Beckles was then found wanting again.
The Town defender allowed his man a run on Newell's right-wing corner, and the Millers captain got there first, heading down for the ball to bounce up into the top left corner, beyond the despairing Henderson.
Shrewsbury tried to respond and, from Jon Nolan's left-wing cross, a flicked header flew just wide from Carlton Morris, who then flashed a dangerous low right-wing delivery across the face at the start of the second half.
The signs of hope finally materialised into an equaliser on 58 minutes when Town levelled with a glorious training ground routine.
Shaun Whalley played a low free-kick into Mat Sadler, who zigzagged a first-time pass back across to Rodman - and the big winger got enough on the ball to bundle it over the line for his ninth goal of the season.
Rotherham still looked the more likely winners when Caolan Lavery twice got in behind, only to waste both openings, Michael Smith was too clumsy trying to dance round Henderson and the Town keeper brilliantly turned aside the dribbling Williams' right-foot curler.
In extra time, Paul Warne's side were the stronger and Wood, who had also scored in the semi-final win over Scunthorpe, stole in at the back unattended to turn in his seventh and most important goal of the season.
Low crowd at Wembley
One big disappointment was the size of the crowd at Wembley.
The 26,218 crowd made it comfortably the lowest third-tier final attendance since the first one between Tranmere Rovers and Notts County in 1990, when there were 29,252 at the old national stadium.
In the 27 finals that followed, none had ever previously dipped below an attendance of 30,000.
Just seven weeks on from losing to League Two side Lincoln, in front of fewer travelling fans, Shrewsbury's supporters can be forgiven for feeling a sense of disillusionment.
And it was a bitter-sweet experience for Town boss Paul Hurst, who won here with Rotherham against Shrewsbury in the 1996 Football League Trophy final - and is still good friends with Millers manager Warne, his former team-mate.
Rotherham manager Paul Warne told BBC Sport:
"I call Richard Wood my human wrecking ball as every time he goes in the box he heads anything and can always do some damage.
"He's my only player over 30 and I love what he does for me on and the pitch.
"I'm disappointed for Hursty. That takes the edge off it a bit. He's got a very good side who work as hard as mine do.
"Even if we hadn't won, it has still been a great season and I'd have been very proud of my players. But it makes it extra special that my kids are now old enough to appreciate this and my dad's hung in there long enough to enjoy it too.
"This job can be tough at times, especially when you're losing, but my chairman convinced me that I had the attributes to succeed."
Shrewsbury manager Paul Hurst told BBC Radio Shropshire:
"When Dean Henderson saves the penalty, you wonder if it's going to be your day, so I'm just very disappointed. Especially to lose to two set plays.
"We didn't perform as well as we could have done in the first half. We were better in the second and having got level, we were the team on top.
"Extra-time was a mess, with people cramping up in the hot conditions, and it's a cruel way to end the season. But I'm still very proud of that group of players over the course of the season."
- 11TaylorSubstituted forWilliamsat 75'minutes
- 10BallSubstituted forLaveryat 71'minutes
- 22NewellSubstituted forFordeat 110'minutes
- 13BoltonBooked at 38minsSubstituted forRileyat 73'minutes
- 5SadlerBooked at 103mins
- 7WhalleyBooked at 27mins
- 16MorrisSubstituted forPayneat 56'minutes
- 9MorrisSubstituted forJohn-Lewisat 66'minutes
- Robert Jones
- Shots on Target
Second Half Extra Time ends, Rotherham United 2, Shrewsbury Town 1.
Foul by Ben Godfrey (Shrewsbury Town).
Will Vaulks (Rotherham United) wins a free kick on the right wing.
Foul by Lenell John-Lewis (Shrewsbury Town).
Joe Mattock (Rotherham United) wins a free kick in the defensive half.
Stefan Payne (Shrewsbury Town) wins a free kick on the left wing.
Foul by Semi Ajayi (Rotherham United).
Delay over. They are ready to continue.
Delay in match Alex Rodman (Shrewsbury Town) because of an injury.
Hand ball by Lenell John-Lewis (Shrewsbury Town).
Mat Sadler (Shrewsbury Town) wins a free kick in the defensive half.
Foul by Michael Smith (Rotherham United).
Substitution, Rotherham United. Anthony Forde replaces Joe Newell.
Offside, Shrewsbury Town. Jon Nolan tries a through ball, but Alex Rodman is caught offside.
Second Half Extra Time begins Rotherham United 2, Shrewsbury Town 1.
First Half Extra Time ends, Rotherham United 2, Shrewsbury Town 1.
Hand ball by Lenell John-Lewis (Shrewsbury Town).
Attempt blocked. Stefan Payne (Shrewsbury Town) header from the centre of the box is blocked. Assisted by Shaun Whalley with a cross.
Foul by Joe Riley (Shrewsbury Town).