Match ends, Rotherham United 3, Preston North End 1.
Rotherham will play Leyton Orient in the League One play-off final after coming from behind to beat Preston.
Following a 1-1 draw in the first leg, Paul Gallagher's free-kick gave the visitors the lead, but headers from Wes Thomas and Lee Frecklington put the Millers in front at the break.
The excellent Ben Pringle hit the bar for the hosts before Kieran Agard sealed it from close range.
Rotherham now have the chance to achieve back-to-back promotions.
The tie was evenly poised following the first meeting at Deepdale but Simon Grayson's side took the lead for the first time in the 16th minute when Gallagher's free-kick from the left was missed by everyone and bounced high into the roof of the Rotherham net.
The Millers came close to an immediate reply but Lilywhites keeper Declan Rudd reacted brilliantly to keep out Kari Arnason's header from Pringle's whipped set piece.
It was from another Pringle free-kick that the home side equalised. Scott Wiseman pushed Alex Revell to the ground needlessly and the former Derby man's powerful delivery was met on the run by Thomas to give Rudd no chance.
Pringle was at the heart of much of the home side's play and he picked up his second assist of the night when his centre was superbly headed home by Frecklington from just inside the penalty area with 34 minutes gone.
Despite ending an enthralling half comfortably on top, Rotherham could still have gone in only level at the break.
Home keeper Adam Collin spilled John Welsh's long-range shot just wide of a post and, from the resultant corner, Joe Garner's glancing header went across the face of goal.
Rotherham ended the regular league season having scored just two goals fewer than champions Wolves and they came close to a third of the night when Pringle's half-volley came back off the crossbar.
Preston spurned chances when Garner blasted over from a Gallagher cross and the winger headed wide when well placed, before former Everton forward Agard effectively ended the game as a contest.
Frecklington played a well-weighted chipped pass down the line for James Tavernier and the Newcastle loanee showed excellent control and poise before rolling a ball inside for Agard to convert his 26th goal of the season.
The deflated visitors pushed on in search of a route back into the game and both Jack King and Garner saw deflected efforts from outside the area hit a post.
But Steve Evans' side saw out six minutes of injury time to consign the Lancashire side to a fourth consecutive season in the third tier.
Preston boss Simon Grayson: "Football is about fine margins and things have not gone our way today.
"We've hit the post twice and both times it has gone out to one of their players. We didn't have much luck but we've lost to a fine team.
"The lads can be proud because they've had an excellent season. The football club is progressing and there is no doubt about that."
Rotherham boss Steve Evans: "It feels wonderful because we were many peoples' favourite to go back down at the start of the season.
"I think over the two legs we deserved to win the tie. It's my job to make sure we enjoy this tonight but tomorrow our focus will turn to Leyton Orient.
"We go to Wembley as the underdogs because they led the table for many months."
- 21CollinBooked at 70mins
- 8FrecklingtonSubstituted forMilsomat 90+2'minutes
- 22AgardSubstituted forO'Connorat 90+5'minutes
- 26ThomasBooked at 70minsSubstituted forVuckicat 87'minutes
- 32WisemanSubstituted forHumphreyat 53'minutes
- 6WrightBooked at 11mins
- 19WelshSubstituted forBrownhillat 68'minutes
- 9DaviesBooked at 46mins
- 12GallagherBooked at 71minsSubstituted forBeavonat 77'minutes
- Keith Stroud
- Shots on Target
Second Half ends, Rotherham United 3, Preston North End 1.
Foul by Bailey Wright (Preston North End).
Alex Revell (Rotherham United) wins a free kick in the attacking half.
Delay over. They are ready to continue.
Delay in match (Preston North End).
Attempt missed. David Buchanan (Preston North End) left footed shot from outside the box is close, but misses the top left corner.
Substitution, Rotherham United. Michael O'Connor replaces Kieran Agard.
Attempt saved. Alex Revell (Rotherham United) right footed shot from the right side of the box is saved in the centre of the goal. Assisted by Robert Milsom.
Attempt blocked. Stuart Beavon (Preston North End) left footed shot from outside the box is blocked. Assisted by Kevin Davies with a headed pass.
Jack King (Preston North End) wins a free kick in the attacking half.
Foul by Kári Arnason (Rotherham United).
Substitution, Rotherham United. Robert Milsom replaces Lee Frecklington.
Attempt missed. Josh Brownhill (Preston North End) right footed shot from outside the box is too high from a direct free kick.
Neil Kilkenny (Preston North End) wins a free kick in the attacking half.
Foul by Ben Pringle (Rotherham United).
Attempt missed. Bailey Wright (Preston North End) left footed shot from outside the box is too high. Assisted by Josh Brownhill.
Substitution, Rotherham United. Haris Vuckic replaces Wes Thomas.
Neil Kilkenny (Preston North End) wins a free kick on the left wing.
Foul by Kieran Agard (Rotherham United).