Match ends, Paris Saint Germain 0, Borussia Dortmund 1.
Borussia Dortmund produced a fine away performance to beat Paris St-Germain and reach their first Champions League final since 2013.
Dortmund held a 1-0 advantage following the first leg of the semi-final and doubled their lead when Mats Hummels was left unmarked five yards out to head in from Julian Brandt's left-wing corner.
That goal came just after PSG's Warren Zaire-Emery wasted a glorious chance as he volleyed against the post from close range early in the second half.
PSG hit the upright twice in the opening match in Germany and, after falling 2-0 behind on aggregate, again struck the post through Nuno Mendes.
The hosts thought they had been given a penalty and a potential lifeline when Italian referee Daniele Orsato pointed to the spot, only to instantly change his mind and rule that Hummels' foul on Ousmane Dembele had been just outside the area.
PSG have never been European champions, losing in the 2020 final, and Dortmund produced an excellent defensive display to frustrate the French title winners.
Kylian Mbappe, in his last European match for PSG before joining Real Madrid in the summer, had an effort deflected on to the crossbar, before Vitinha fired against the bar too - the sixth time overall his side had hit the frame of the goal in the tie.
The final will be at Wembley on Saturday, 1 June (20:00 BST) and could be an all-German affair, just as it was in May 2013 when Bayern Munich beat Dortmund 2-1 in London.
Bayern and Real are in the second 2024 semi-final and the first leg ended 2-2 in Germany, with the second leg in Spain on Wednesday (20:00 BST).
Dortmund are aiming to become European champions for the second time in their history after they defeated Juventus 3-1 in the 1997 final.
Superb Sancho and Dortmund frustrate Mbappe and PSG
Dortmund have had a disappointing season domestically as they sit fifth, 24 points behind champions Bayer Leverkusen with two Bundesliga matches remaining.
At the start of the European campaign, no-one could have expected Dortmund to be in the final after they were drawn in a tough group that consisted of PSG, AC Milan and Newcastle.
But Edin Terzic's side finished top, before they got past PSV Eindhoven in the last 16 and then eliminated Atletico Madrid in the quarter-finals.
And even after an excellent 1-0 home win over PSG on 1 May, thanks to Niclas Fullkrug's goal, many people expected the French side to overpower them in the second leg.
However, Dortmund's side, which included hard-working England winger Jadon Sancho, on loan from Manchester United after being frozen out by boss Erik ten Hag, produced a superb team effort at Parc des Princes.
In a wonderful, boisterous atmosphere, Dortmund were excellent in stopping the dangerous Mbappe scoring - the forward often up against two or three opponents - with the central defensive partnership of Hummels and Nico Schlotterbeck in fine form.
Mbappe had a volley saved by goalkeeper Gregor Kobel and only a superb sliding challenge from Hummels stopped Mbappe from finishing from Fabian Ruiz's pull-back.
PSG hit the woodwork four times in the second half but despite sustained late pressure, with Mbappe having a shot saved and Marquinhos heading narrowly wide, could not find the breakthrough as Dortmund reached the final.
Player of the match
SabitzerMarcel Sabitzer
Paris Saint Germain
Avg
- Squad number9Player nameGonçalo RamosAverage rating
5.05
- Squad number99Player nameG DonnarummaAverage rating
4.97
- Squad number2Player nameHakimiAverage rating
4.92
- Squad number5Player nameMarquinhosAverage rating
4.78
- Squad number17Player nameVitinhaAverage rating
4.66
- Squad number10Player nameDembéléAverage rating
4.64
- Squad number19Player nameLee Kang-inAverage rating
4.51
- Squad number25Player nameNuno MendesAverage rating
4.44
- Squad number35Player nameBeraldoAverage rating
4.39
- Squad number29Player nameBarcolaAverage rating
4.30
- Squad number33Player nameZaïre-EmeryAverage rating
4.29
- Squad number8Player nameRuizAverage rating
4.22
- Squad number11Player nameAsensioAverage rating
4.13
- Squad number7Player nameMbappéAverage rating
4.04
Borussia Dortmund
Avg
- Squad number20Player nameSabitzerAverage rating
7.97
- Squad number15Player nameHummelsAverage rating
7.92
- Squad number10Player nameSanchoAverage rating
7.88
- Squad number4Player nameSchlotterbeckAverage rating
7.77
- Squad number27Player nameAdeyemiAverage rating
7.73
- Squad number19Player nameBrandtAverage rating
7.72
- Squad number22Player nameMaatsenAverage rating
7.70
- Squad number11Player nameReusAverage rating
7.58
- Squad number14Player nameFüllkrugAverage rating
7.56
- Squad number26Player nameRyersonAverage rating
7.51
- Squad number1Player nameKobelAverage rating
7.49
- Squad number23Player nameCanAverage rating
7.43
- Squad number25Player nameSüleAverage rating
7.15
- Squad number8Player nameNmechaAverage rating
7.08
Line-ups
PSG
Formation 4-3-3
- 99G Donnarumma
- 2HakimiBooked at 84mins
- 5Marquinhos
- 35Lopes Beraldo
- 25Nuno Mendes
- 33Zaïre-EmerySubstituted forLee Kang-inat 76'minutes
- 17Vitinha
- 8RuizSubstituted forAsensioat 63'minutes
- 10DembéléBooked at 75mins
- 9Gonçalo RamosSubstituted forBarcolaat 63'minutes
- 7Mbappé
Substitutes
- 1Navas
- 4Ugarte
- 11Asensio
- 15Danilo
- 19Lee Kang-in
- 23Kolo Muani
- 26Mukiele
- 28Soler
- 29Barcola
- 37Skriniar
- 42Zague
- 80Tenas
B Dortmund
Formation 4-2-3-1
- 1Kobel
- 26Ryerson
- 15HummelsBooked at 65mins
- 4Schlotterbeck
- 22Maatsen
- 20SabitzerBooked at 64mins
- 23Can
- 10SanchoSubstituted forSüleat 67'minutes
- 19BrandtSubstituted forNmechaat 85'minutes
- 27AdeyemiSubstituted forReusat 56'minutes
- 14Füllkrug
Substitutes
- 6Özcan
- 8Nmecha
- 9Haller
- 11Reus
- 17Wolf
- 18Moukoko
- 21Malen
- 25Süle
- 33Meyer
- 35Lotka
- 38Wätjen
- 43Bynoe-Gittens
- Referee:
- Daniele Orsato
- Attendance:
- 46,435
Match Stats
- Possession
- Home70%
- Away30%
- Shots
- Home30
- Away7
- Shots on Target
- Home5
- Away3
- Corners
- Home12
- Away4
- Fouls
- Home8
- Away6
Live Text
Post update
Full Time
Second Half ends, Paris Saint Germain 0, Borussia Dortmund 1.
Post update
Corner, Paris Saint Germain. Conceded by Mats Hummels.
Post update
Attempt missed. Lee Kang-In (Paris Saint Germain) left footed shot from outside the box is high and wide to the left.
Post update
Attempt blocked. Achraf Hakimi (Paris Saint Germain) right footed shot from the right side of the box is blocked.
Post update
Attempt blocked. Vitinha (Paris Saint Germain) right footed shot from outside the box is blocked. Assisted by Bradley Barcola.
Post update
Vitinha (Paris Saint Germain) hits the bar with a right footed shot from outside the box. Assisted by Ousmane Dembélé.
Post update
Attempt blocked. Vitinha (Paris Saint Germain) right footed shot from outside the box is blocked.
Post update
Corner, Paris Saint Germain. Conceded by Gregor Kobel.
Post update
Attempt saved. Kylian Mbappé (Paris Saint Germain) right footed shot from the centre of the box is saved in the top centre of the goal. Assisted by Achraf Hakimi.
Post update
Attempt missed. Nuno Mendes (Paris Saint Germain) header from the left side of the six yard box misses to the right. Assisted by Ousmane Dembélé with a cross.
Substitution
Substitution, Borussia Dortmund. Felix Nmecha replaces Julian Brandt.
Booking
Achraf Hakimi (Paris Saint Germain) is shown the yellow card.
Post update
Beraldo (Paris Saint Germain) wins a free kick in the defensive half.
Post update
Foul by Niclas Füllkrug (Borussia Dortmund).
Post update
Attempt missed. Marquinhos (Paris Saint Germain) header from the centre of the box is close, but misses to the left. Assisted by Lee Kang-In with a cross following a set piece situation.
Post update
Lee Kang-In (Paris Saint Germain) wins a free kick on the right wing.
Post update
Foul by Nico Schlotterbeck (Borussia Dortmund).
Post update
Attempt saved. Kylian Mbappé (Paris Saint Germain) right footed shot from the right side of the box is saved in the bottom right corner. Assisted by Achraf Hakimi.
Post update
Corner, Paris Saint Germain. Conceded by Gregor Kobel.