
Saturday, July 26: Stage 20, Nantua - Pontarlier, 184 km
Stage 20 map & profile | Stage 20 photos

Kaden Groves wins stage 20. Photo: Billy Lebelge
Les Woodland's book Dirty Feet: How the Great Unwashed Created the Tour de France is available in print, Kindle eBook & audiobook versions. To get your copy, just click on the Amazon link on the right.
Rated ascents:
Weather at the finish city of Pontarlier at 2:15 PM, local time: 19C (67F), mostly cloudy, with the wind from the north at 10 km/hr (6 mph). There is a 24% chance of rain, rising to 57% at 4:00 PM.
Here's the race organizer's forecast: 21ºC, cloudy with sunny spells - it’s good weather for the first few kilometers of the day. Unfortunately, this situation will not last: at Saint-Claude (km 37.6), the first drops of rain are expected to fall on the riders... and from then on, several storms will hit them until the finish in Pontarlier, which should also be drenched. At least the wind will not be a nuisance and temperatures will not drop below 16ºC.
The stage: Tour boss Christian Prudhomme writes: At this stage of the Tour, there’ll still be some in-form riders who haven’t yet managed to claim a victory bouquet. They’ll all be keen to get into the breakaway, but the selection process will be tough, thanks especially to the ascent of the Col de la Croix de la Serra. The hilly profile of the final third of the stage will give the strongest riders the chance to break away and finish solo or in a small group in the capital of absinthe.
The race: "Unfortunately, with just two stages left until the final, Yevgeniy Fedorov is forced to abandon the race due to an intestinal infection", his team XDS Astana reports.
160 riders began stage 20 at 12:17 PM.

Thymen Arensman took this selfie of the start line. It's time to race.
Here's the race organizer's stage 20 report:
Kaden Groves (Alpecin-Deceuninck) is much more than a sprinter, as he has proved time and again in his career - though never before at the Tour de France. Already a winner of seven stages at La Vuelta and two at the Giro d’Italia, the Australian rider came to the French Grand Tour for the first time this year as lead-out man for Jasper Philipsen, who crashed out of the race on day 3.
After Mathieu van der Poel also retired due to illness at the beginning of week 3, Groves made today’s breakaway, displaying his versatility in a stage marked by aggressive racing from Santa to Pontarlier, where he took his maiden Tour stage win. Part of a 13-man breakaway, he covered the final 16 kilometres solo to claim victory ahead of Frank van den Broek (Picnic PostNL) and Pascal Eenkhoorn (Soudal Quick-Step). He is the 114th rider to win stages in all three Grand Tours. Tadej Pogacar (UAE Team Emirates-XRG) leads the overall standings going into the final stage on Sunday in Paris.
The race:
Attackers feel it’s their time to shine with a 184.2-km challenging course from Nantua to Pontarlier. Many riders have been targeting stage 20 of the Tour 2025 for a long time as they envision a great opportunity to change the script and claim victory on the eve of the Champs-Élysées. Yevgeniy Fedorov doesn’t participate in this battle as his team XDS Astana reports he has to retire due to an intestinal infection.
A huge battle for the breakaway
Right from the gun, Kasper Asgreen (EF Education-EasyPost) sets off. The Danish rouleur has found success on these roads before, having pulled off a hard-fought breakaway victory in Bourg-en-Bresse (stage 18, 2023), some 30 kilometres west of Nantua. The Dane goes hard under the rain but he doesn’t succeed in breaking away due to the many attacks and counter-attacks shaking up the bunch.
His EF teammates, and notably Ben Healy, are very active. Harry Sweeny eventually makes a 13-man breakaway formed at km 65, as the Australian rider joins Tim Wellens (UAE Team Emirates-XRG), Matteo Jorgenson (Visma-Lease a Bike) and Ewen Costiou (Arkéa-B&B Hotels) with nine more chasers: Pascal Eenkhoorn (Soudal-Quick Step), Romain Grégoire (Groupama-FDJ), Kaden Groves (Alpecin-Deceuninck), Matteo Trentin (Tudor), Ivan Romeo (Movistar), Simone Velasco (XDS-Astana), Jordan Jegat (Total Energies), Frank van den Broek (Picnic-PostNL) and Jake Stewart (Israel-Premier Tech).

The day's break with 98 km to go. They are 2min 15sec ahead of the peloton.
Sweeny tries his luck
As Jegat threatens Ben O’Connor’s 10th place in the overall standings (4’08’’ of difference between them), Mauro Schmid (Jayco AlUla) is tasked with driving the scattered bunch. Oscar Onley (Picnic PostNL) and Felix Gall (Decathlon AG2R La Mondiale) are momentarily dropped but the situation eventually settles. Despite a crash at km 71, the Swiss national champion controls the gap at 2’30’’ at the bottom of the main climb of the day, Côte de Thésy.
Jegat accelerates on the climb. Sweeny joins him at the summit. And the Australian rider goes solo with 54 kilometres to go to the finish. He opens a gap of 40’’ to his his breakaway rivals before the latter change the script. Ten riders get back together as they hit the bottom of the Côte de Longeville (cat. 4, summit 24.1km away from the finish). Costiou, Wellens and Jorgenson have been distanced.

Harry Sweeny (EF Education-EasyPost) is alone and off the front. With 30 km to go he has an 11sec lead on a five-man group with Pascal Eenkhoorn. The peloton is 5min 27sec back.
A dramatic finale
A group of six riders emerges over the top: Grégoire, Romeo, Velasco, Groves, Stewart and Van den Broek. Grégoire accelerates on the downhill but his rivals follow. Romeo counter-attacks but he slips in a turn with 22 km to go and hits the deck. Grégoire and Velasco are also affected. Groves, Stewart and Van den Broek keep going.
With 16.5 km to go, Stewart and Van den Broek look at each other. Groves doesn’t wait for them and takes off towards victory! At the finish, Van den Broek (+54’’) and Eenkhoorn (+59’’) complete the top 3 while Grégoire has to settle for 5th on his home roads. The peloton cross the line with a gap of over 7 minutes. Jegat takes the 10th place in the overall standings from O’Connor.
Complete results:
184 kilometers raced at an average speed of 44.851 km/hr
| 1 | Kaden Groves | Alpecin-Deceuninck | 4hr 6min 9sec |
| 2 | Frank van den Broek | Team Picnic PostNL | @ 54sec |
| 3 | Pascal Eenkhoorn | Soudal Quick-Step | 0:59 |
| 4 | Simone Velasco | XDS Astana Team | 1:04 |
| 5 | Romain Grégoire | Groupama-FDJ | s.t. |
| 6 | Jake Stewart | Israel-Premier Tech | s.t. |
| 7 | Jordan Jegat | Team TotalEnergies | s.t. |
| 8 | Tim Wellens | UAE Team Emirates-XRG | s.t. |
| 9 | Matteo Jorgenson | Team Visma | Lease a Bike | s.t. |
| 10 | Harry Sweeny | EF Education-EasyPost | s.t. |
| 11 | Matteo Trentin | Tudor Pro Cycling Team | 2:01 |
| 12 | Ewen Costiou | Arkea-B&B Hotels | 3:45 |
| 13 | Davide Ballerini | XDS Astana Team | 7:04 |
| 14 | Mike Teunissen | XDS Astana Team | s.t. |
| 15 | Jonas Abrahamsen | Uno-X Mobility | s.t. |
| 16 | Anthony Turgis | Team TotalEnergies | s.t. |
| 17 | Louis Barré | Intermarché-Wanty | s.t. |
| 18 | Xandro Meurisse | Alpecin-Deceuninck | s.t. |
| 19 | Thomas Gachignard | Team TotalEnergies | s.t. |
| 20 | Mathis Le Berre | Arkea-B&B Hotels | s.t. |
| 21 | Matis Louvel | Israel-Premier Tech | s.t. |
| 22 | Laurence Pithie | Red Bull-BORA-hansgrohe | s.t. |
| 23 | Florian Lipowitz | Red Bull-BORA-hansgrohe | s.t. |
| 24 | Tobias Halland Johannessen | Uno-X Mobility | s.t. |
| 25 | Kévin Vauquelin | Arkea-B&B Hotels | s.t. |
| 26 | Markus Hoelgaard | Uno-X Mobility | s.t. |
| 27 | Neilson Powless | EF Education-EasyPost | s.t. |
| 28 | Ben Healy | EF Education-EasyPost | s.t. |
| 29 | Max Schachmann | Soudal Quick-Step | s.t. |
| 30 | Jenno Berckmoes | Lotto | s.t. |
| 31 | Wout van Aert | Team Visma | Lease a Bike | s.t. |
| 32 | Tadej Pogacar | UAE Team Emirates-XRG | s.t. |
| 33 | Mick van Dijke | Red Bull-BORA-hansgrohe | s.t. |
| 34 | Jonas Vingegaard | Team Visma | Lease a Bike | s.t. |
| 35 | Primoz Roglic | Red Bull-BORA-hansgrohe | s.t. |
| 36 | Simon Yates | Team Visma | Lease a Bike | s.t. |
| 37 | Cristian Rodriguez | Arkea-B&B Hotels | s.t. |
| 38 | Ion Izagirre | Cofidis | s.t. |
| 39 | Raúl García | Arkea-B&B Hotels | s.t. |
| 40 | Ilan Van Wilder | Soudal Quick-Step | s.t. |
| 41 | Kasper Asgreen | EF Education-EasyPost | s.t. |
| 42 | Sergio Higuita | XDS Astana Team | s.t. |
| 43 | Valentin Madouas | Groupama-FDJ | s.t. |
| 44 | Oscar Onley | Team Picnic PostNL | s.t. |
| 45 | Oliver Naesen | Decathlon AG2R La Mondiale | s.t. |
| 46 | Bastien Tronchon | Decathlon AG2R La Mondiale | s.t. |
| 47 | Felix Gall | Decathlon AG2R La Mondiale | s.t. |
| 48 | Valentin Paret-Peintre | Soudal Quick-Step | s.t. |
| 49 | Dylan Teuns | Cofidis | s.t. |
| 50 | Andreas Leknessund | Uno-X Mobility | s.t. |
| 51 | Alexandre Delettre | Team TotalEnergies | s.t. |
| 52 | Marius Mayrhofer | Tudor Pro Cycling Team | s.t. |
| 53 | Marc Hirschi | Tudor Pro Cycling Team | s.t. |
| 54 | Gregor Mühlberger | Movistar Team | s.t. |
| 55 | Tobias Lund Andresen | Team Picnic PostNL | s.t. |
| 56 | Ben O'Connor | Team Jayco-AlUla | s.t. |
| 57 | Thymen Arensman | INEOS Grenadiers | s.t. |
| 58 | Toms Skujins | Lidl-Trek | s.t. |
| 59 | Jasper Stuyven | Lidl-Trek | s.t. |
| 60 | Axel Laurance | INEOS Grenadiers | s.t. |
| 61 | Joe Blackmore | Israel-Premier Tech | s.t. |
| 62 | Nils Politt | UAE Team Emirates-XRG | s.t. |
| 63 | Aurélien Paret-Peintre | Decathlon AG2R La Mondiale | s.t. |
| 64 | Emanuel Buchmann | Cofidis | s.t. |
| 65 | Tobias Foss | INEOS Grenadiers | s.t. |
| 66 | Sam Watson | INEOS Grenadiers | s.t. |
| 67 | Einer Rubio | Movistar Team | s.t. |
| 68 | Michael Storer | Tudor Pro Cycling Team | s.t. |
| 69 | Guillaume Martin-Guyonnet | Groupama-FDJ | s.t. |
| 70 | Michael Woods | Israel-Premier Tech | s.t. |
| 71 | Anders Halland Johannessen | Uno-X Mobility | s.t. |
| 72 | Marc Soler | UAE Team Emirates-XRG | s.t. |
| 73 | Jhonatan Narvaez | UAE Team Emirates-XRG | s.t. |
| 74 | Mauro Schmid | Team Jayco-AlUla | s.t. |
| 75 | Clément Venturini | Arkea-B&B Hotels | s.t. |
| 76 | Damien Touzé | Cofidis | s.t. |
| 77 | Bruno Armirail | Decathlon AG2R La Mondiale | 11:11 |
| 78 | Clément Russo | Groupama-FDJ | 13:17 |
| 79 | Lewis Askey | Groupama-FDJ | s.t. |
| 80 | Alex Baudin | EF Education-EasyPost | s.t. |
| 81 | Tim Naberman | Team Picnic PostNL | s.t. |
| 82 | Warren Barguil | Team Picnic PostNL | s.t. |
| 83 | Alex Aranburu | Cofidis | s.t. |
| 84 | Krists Neilands | Israel-Premier Tech | s.t. |
| 85 | Jarrad Drizners | Lotto | s.t. |
| 86 | Brent Van Moer | Lotto | s.t. |
| 87 | Lenny Martinez | Bahrain Victorious | s.t. |
| 88 | Jonas Rickaert | Alpecin-Deceuninck | 22:17 |
| 89 | Tiesj Benoot | Team Visma | Lease a Bike | s.t. |
| 90 | Clément Berthet | Decathlon AG2R La Mondiale | s.t. |
| 91 | Santiago Buitrago | Bahrain Victorious | s.t. |
| 92 | Harold Tejada | XDS Astana Team | s.t. |
| 93 | Quentin Pacher | Groupama-FDJ | s.t. |
| 94 | Edoardo Affini | Team Visma | Lease a Bike | s.t. |
| 95 | Geraint Thomas | INEOS Grenadiers | s.t. |
| 96 | Victor Campenaerts | Team Visma | Lease a Bike | s.t. |
| 97 | Hugo Page | Intermarché-Wanty | s.t. |
| 98 | Paul Penhoët | Groupama-FDJ | s.t. |
| 99 | Sepp Kuss | Team Visma | Lease a Bike | s.t. |
| 100 | Emiel Verstrynge | Alpecin-Deceuninck | s.t. |
| 101 | Callum Scotson | Decathlon AG2R La Mondiale | s.t. |
| 102 | Adam Yates | UAE Team Emirates-XRG | s.t. |
| 103 | Fred Wright | Bahrain Victorious | s.t. |
| 104 | Michael Valgren | EF Education-EasyPost | s.t. |
| 105 | Alberto Dainese | Tudor Pro Cycling Team | s.t. |
| 106 | Aleksandr Vlasov | Red Bull-BORA-hansgrohe | s.t. |
| 107 | Quinn Simmons | Lidl-Trek | s.t. |
| 108 | William Barta | Movistar Team | s.t. |
| 109 | Gianni Moscon | Red Bull-BORA-hansgrohe | s.t. |
| 110 | Stian Fredheim | Uno-X Mobility | s.t. |
| 111 | Biniam Girmay | Intermarché-Wanty | 22:27 |
| 112 | Magnus Cort | Uno-X Mobility | s.t. |
| 113 | Nelson Oliveira | Movistar Team | s.t. |
| 114 | Mattéo Vercher | Team TotalEnergies | 22:29 |
| 115 | Iván García Cortina | Movistar Team | s.t. |
| 116 | Iván Romeo | Movistar Team | 22:33 |
| 117 | Pablo Castrillo | Movistar Team | s.t. |
| 118 | Thibau Nys | Lidl-Trek | s.t. |
| 119 | Jordi Meeus | Red Bull-BORA-hansgrohe | 24:29 |
| 120 | Clément Champoussin | XDS Astana Team | s.t. |
| 121 | Eduardo Sepulveda | Lotto | 28:49 |
| 122 | Pavel Sivakov | UAE Team Emirates-XRG | s.t. |
| 123 | Jonas Rutsch | Intermarché-Wanty | s.t. |
| 124 | Laurenz Rex | Intermarché-Wanty | s.t. |
| 125 | Matej Mohoric | Bahrain Victorious | s.t. |
| 126 | Lucas Plapp | Team Jayco-AlUla | s.t. |
| 127 | Kamil Gradek | Bahrain Victorious | s.t. |
| 128 | Robert Stannard | Bahrain Victorious | s.t. |
| 129 | Connor Swift | INEOS Grenadiers | s.t. |
| 130 | Sébastien Grignard | Lotto | s.t. |
| 131 | Alexis Renard | Cofidis | s.t. |
| 132 | Silvan Dillier | Alpecin-Deceuninck | s.t. |
| 133 | Elmar Reinders | Team Jayco-AlUla | s.t. |
| 134 | Luke Durbridge | Team Jayco-AlUla | s.t. |
| 135 | Amaury Capiot | Arkea-B&B Hotels | s.t. |
| 136 | Dylan Groenewegen | Team Jayco-AlUla | s.t. |
| 137 | Bert Van Lerberghe | Soudal Quick-Step | s.t. |
| 138 | Arnaud Démare | Arkea-B&B Hotels | s.t. |
| 139 | Guillaume Boivin | Israel-Premier Tech | s.t. |
| 140 | Marco Haller | Tudor Pro Cycling Team | s.t. |
| 141 | Luka Mezgec | Team Jayco-AlUla | s.t. |
| 142 | Fabian Lienhard | Tudor Pro Cycling Team | s.t. |
| 143 | Phil Bauhaus | Bahrain Victorious | s.t. |
| 144 | Sean Flynn | Team Picnic PostNL | s.t. |
| 145 | Tim Merlier | Soudal Quick-Step | s.t. |
| 146 | Pavel Bittner | Team Picnic PostNL | s.t. |
| 147 | Gianni Vermeersch | Alpecin-Deceuninck | s.t. |
| 148 | Mathieu Burgaudeau | Team TotalEnergies | s.t. |
| 149 | Edward Theuns | Lidl-Trek | s.t. |
| 150 | Jonathan Milan | Lidl-Trek | s.t. |
| 151 | Simone Consonni | Lidl-Trek | s.t. |
| 152 | Roel van Sintmaartensdijk | Intermarché-Wanty | s.t. |
| 153 | Vito Braet | Intermarché-Wanty | s.t. |
| 154 | Vincenzo Albanese | EF Education-EasyPost | s.t. |
| 155 | Alexey Lutsenko | Israel-Premier Tech | s.t. |
| 156 | Pascal Ackermann | Israel-Premier Tech | s.t. |
| 157 | Niklas Märkl | Team Picnic PostNL | s.t. |
| 158 | Benjamin Thomas | Cofidis | s.t. |
| 159 | Arnaud De Lie | Lotto | s.t. |
| 160 | Julian Alaphilippe | Tudor Pro Cycling Team | s.t. |
GC after stage 20:
3,166.3 kilometers raced so far at an average speed of 42.834 km/hr
| 1 | Tadej Pogacar | UAE Team Emirates-XRG | 73hr 54min 59sec |
| 2 | Jonas Vingegaard | Team Visma | Lease a Bike | @ 4min 24sec |
| 3 | Florian Lipowitz | Red Bull-BORA-hansgrohe | 11:09 |
| 4 | Oscar Onley | Team Picnic PostNL | 12:12 |
| 5 | Felix Gall | Decathlon AG2R La Mondiale | 17:12 |
| 6 | Tobias Halland Johannessen | Uno-X Mobility | 20:14 |
| 7 | Kévin Vauquelin | Arkea-B&B Hotels | 22:35 |
| 8 | Primoz Roglic | Red Bull-BORA-hansgrohe | 25:30 |
| 9 | Ben Healy | EF Education-EasyPost | 28:02 |
| 10 | Jordan Jegat | Team TotalEnergies | 32:42 |
| 11 | Ben O'Connor | Team Jayco-AlUla | 34:34 |
| 12 | Thymen Arensman | INEOS Grenadiers | 52:41 |
| 13 | Jhonatan Narvaez | UAE Team Emirates-XRG | 1:04:36 |
| 14 | Sergio Higuita | XDS Astana Team | 1:08:19 |
| 15 | Simon Yates | Team Visma | Lease a Bike | 1:17:30 |
| 16 | Guillaume Martin-Guyonnet | Groupama-FDJ | 1:18:07 |
| 17 | Sepp Kuss | Team Visma | Lease a Bike | 1:20:24 |
| 18 | Gregor Mühlberger | Movistar Team | 1:28:17 |
| 19 | Matteo Jorgenson | Team Visma | Lease a Bike | 1:29:28 |
| 20 | Cristian Rodriguez | Arkea-B&B Hotels | 1:36:15 |
| 21 | Valentin Madouas | Groupama-FDJ | 1:39:46 |
| 22 | Xandro Meurisse | Alpecin-Deceuninck | 1:43:46 |
| 23 | Warren Barguil | Team Picnic PostNL | 1:48:09 |
| 24 | Adam Yates | UAE Team Emirates-XRG | 1:48:41 |
| 25 | Aurélien Paret-Peintre | Decathlon AG2R La Mondiale | 2:12:52 |
| 26 | Raúl García | Arkea-B&B Hotels | 2:15:58 |
| 27 | Aleksandr Vlasov | Red Bull-BORA-hansgrohe | 2:16:15 |
| 28 | Victor Campenaerts | Team Visma | Lease a Bike | 2:20:36 |
| 29 | Marc Soler | UAE Team Emirates-XRG | 2:21:01 |
| 30 | Emanuel Buchmann | Cofidis | 2:21:34 |
| 31 | Einer Rubio | Movistar Team | 2:21:56 |
| 32 | Ilan Van Wilder | Soudal Quick-Step | 2:23:14 |
| 33 | Callum Scotson | Decathlon AG2R La Mondiale | 2:25:40 |
| 34 | Romain Grégoire | Groupama-FDJ | 2:25:58 |
| 35 | Harry Sweeny | EF Education-EasyPost | 2:27:58 |
| 36 | Clément Berthet | Decathlon AG2R La Mondiale | 2:32:50 |
| 37 | Tim Wellens | UAE Team Emirates-XRG | 2:38:24 |
| 38 | Simone Velasco | XDS Astana Team | 2:41:31 |
| 39 | Frank van den Broek | Team Picnic PostNL | 2:45:44 |
| 40 | Santiago Buitrago | Bahrain Victorious | 2:45:48 |
| 41 | Valentin Paret-Peintre | Soudal Quick-Step | 2:47:05 |
| 42 | Michael Storer | Tudor Pro Cycling Team | 2:50:51 |
| 43 | Clément Venturini | Arkea-B&B Hotels | 2:52:39 |
| 44 | Harold Tejada | XDS Astana Team | 2:54:34 |
| 45 | Quentin Pacher | Groupama-FDJ | 2:56:00 |
| 46 | Alex Baudin | EF Education-EasyPost | 2:56:15 |
| 47 | Neilson Powless | EF Education-EasyPost | 2:58:52 |
| 48 | Joe Blackmore | Israel-Premier Tech | 2:59:04 |
| 49 | Pascal Eenkhoorn | Soudal Quick-Step | 3:00:25 |
| 50 | Bruno Armirail | Decathlon AG2R La Mondiale | 3:03:12 |
| 51 | Ewen Costiou | Arkea-B&B Hotels | 3:06:35 |
| 52 | Michael Woods | Israel-Premier Tech | 3:06:59 |
| 53 | Axel Laurance | INEOS Grenadiers | 3:10:10 |
| 54 | Tiesj Benoot | Team Visma | Lease a Bike | 3:10:19 |
| 55 | Alexandre Delettre | Team TotalEnergies | 3:12:28 |
| 56 | Julian Alaphilippe | Tudor Pro Cycling Team | 3:13:20 |
| 57 | Andreas Leknessund | Uno-X Mobility | 3:14:44 |
| 58 | Geraint Thomas | INEOS Grenadiers | 3:14:57 |
| 59 | Quinn Simmons | Lidl-Trek | 3:17:45 |
| 60 | Thomas Gachignard | Team TotalEnergies | 3:23:14 |
| 61 | Mathis Le Berre | Arkea-B&B Hotels | 3:25:28 |
| 62 | Jasper Stuyven | Lidl-Trek | 3:26:11 |
| 63 | Mathieu Burgaudeau | Team TotalEnergies | 3:26:18 |
| 64 | Markus Hoelgaard | Uno-X Mobility | 3:26:29 |
| 65 | Emiel Verstrynge | Alpecin-Deceuninck | 3:28:01 |
| 66 | Jenno Berckmoes | Lotto | 3:33:12 |
| 67 | Wout van Aert | Team Visma | Lease a Bike | 3:34:06 |
| 68 | Max Schachmann | Soudal Quick-Step | 3:35:01 |
| 69 | Ion Izagirre | Cofidis | 3:35:02 |
| 70 | Tobias Foss | INEOS Grenadiers | 3:35:15 |
| 71 | Jonas Abrahamsen | Uno-X Mobility | 3:36:21 |
| 72 | Michael Valgren | EF Education-EasyPost | 3:37:01 |
| 73 | Oliver Naesen | Decathlon AG2R La Mondiale | 3:39:28 |
| 74 | Nelson Oliveira | Movistar Team | 3:41:03 |
| 75 | Nils Politt | UAE Team Emirates-XRG | 3:44:45 |
| 76 | Anders Halland Johannessen | Uno-X Mobility | 3:46:02 |
| 77 | Bastien Tronchon | Decathlon AG2R La Mondiale | 3:46:36 |
| 78 | Marc Hirschi | Tudor Pro Cycling Team | 3:48:37 |
| 79 | Lenny Martinez | Bahrain Victorious | 3:49:05 |
| 80 | Mike Teunissen | XDS Astana Team | 3:49:28 |
| 81 | Alex Aranburu | Cofidis | 3:49:29 |
| 82 | Louis Barré | Intermarché-Wanty | 3:51:34 |
| 83 | Marius Mayrhofer | Tudor Pro Cycling Team | 3:53:18 |
| 84 | Brent Van Moer | Lotto | 3:53:19 |
| 85 | Clément Champoussin | XDS Astana Team | 3:53:27 |
| 86 | Kaden Groves | Alpecin-Deceuninck | 3:53:29 |
| 87 | Pavel Sivakov | UAE Team Emirates-XRG | 3:54:19 |
| 88 | Krists Neilands | Israel-Premier Tech | 3:54:25 |
| 89 | Laurence Pithie | Red Bull-BORA-hansgrohe | 3:54:44 |
| 90 | Dylan Teuns | Cofidis | 3:55:48 |
| 91 | Kasper Asgreen | EF Education-EasyPost | 3:58:25 |
| 92 | Alexey Lutsenko | Israel-Premier Tech | 3:59:52 |
| 93 | Clément Russo | Groupama-FDJ | 4:01:44 |
| 94 | Damien Touzé | Cofidis | 4:01:48 |
| 95 | Toms Skujins | Lidl-Trek | 4:04:16 |
| 96 | Tobias Lund Andresen | Team Picnic PostNL | 4:06:51 |
| 97 | Marco Haller | Tudor Pro Cycling Team | 4:09:24 |
| 98 | Jonas Rickaert | Alpecin-Deceuninck | 4:11:17 |
| 99 | Matteo Trentin | Tudor Pro Cycling Team | 4:12:31 |
| 100 | Matis Louvel | Israel-Premier Tech | 4:13:01 |
| 101 | Mauro Schmid | Team Jayco-AlUla | 4:14:00 |
| 102 | William Barta | Movistar Team | 4:20:07 |
| 103 | Gianni Vermeersch | Alpecin-Deceuninck | 4:22:29 |
| 104 | Fred Wright | Bahrain Victorious | 4:22:52 |
| 105 | Gianni Moscon | Red Bull-BORA-hansgrohe | 4:30:56 |
| 106 | Anthony Turgis | Team TotalEnergies | 4:31:58 |
| 107 | Iván Romeo | Movistar Team | 4:33:49 |
| 108 | Jake Stewart | Israel-Premier Tech | 4:36:37 |
| 109 | Connor Swift | INEOS Grenadiers | 4:40:30 |
| 110 | Pablo Castrillo | Movistar Team | 4:42:51 |
| 111 | Paul Penhoët | Groupama-FDJ | 4:44:44 |
| 112 | Niklas Märkl | Team Picnic PostNL | 4:46:23 |
| 113 | Mick van Dijke | Red Bull-BORA-hansgrohe | 4:46:50 |
| 114 | Vincenzo Albanese | EF Education-EasyPost | 4:48:20 |
| 115 | Sam Watson | INEOS Grenadiers | 4:50:14 |
| 116 | Thibau Nys | Lidl-Trek | 4:50:42 |
| 117 | Iván García Cortina | Movistar Team | 4:53:18 |
| 118 | Edoardo Affini | Team Visma | Lease a Bike | 4:54:53 |
| 119 | Alberto Dainese | Tudor Pro Cycling Team | 4:56:31 |
| 120 | Tim Naberman | Team Picnic PostNL | 5:00:03 |
| 121 | Lucas Plapp | Team Jayco-AlUla | 5:02:34 |
| 122 | Eduardo Sepulveda | Lotto | 5:02:54 |
| 123 | Robert Stannard | Bahrain Victorious | 5:03:30 |
| 124 | Mattéo Vercher | Team TotalEnergies | 5:06:33 |
| 125 | Pascal Ackermann | Israel-Premier Tech | 5:09:57 |
| 126 | Matej Mohoric | Bahrain Victorious | 5:10:17 |
| 127 | Lewis Askey | Groupama-FDJ | 5:10:40 |
| 128 | Jonas Rutsch | Intermarché-Wanty | 5:11:07 |
| 129 | Jarrad Drizners | Lotto | 5:11:17 |
| 130 | Magnus Cort | Uno-X Mobility | 5:11:51 |
| 131 | Silvan Dillier | Alpecin-Deceuninck | 5:14:12 |
| 132 | Biniam Girmay | Intermarché-Wanty | 5:14:55 |
| 133 | Pavel Bittner | Team Picnic PostNL | 5:17:44 |
| 134 | Sean Flynn | Team Picnic PostNL | 5:18:13 |
| 135 | Davide Ballerini | XDS Astana Team | 5:20:28 |
| 136 | Amaury Capiot | Arkea-B&B Hotels | 5:22:38 |
| 137 | Luke Durbridge | Team Jayco-AlUla | 5:23:21 |
| 138 | Hugo Page | Intermarché-Wanty | 5:24:23 |
| 139 | Stian Fredheim | Uno-X Mobility | 5:26:41 |
| 140 | Elmar Reinders | Team Jayco-AlUla | 5:28:50 |
| 141 | Laurenz Rex | Intermarché-Wanty | 5:29:16 |
| 142 | Arnaud De Lie | Lotto | 5:29:35 |
| 143 | Vito Braet | Intermarché-Wanty | 5:32:04 |
| 144 | Sébastien Grignard | Lotto | 5:33:48 |
| 145 | Alexis Renard | Cofidis | 5:34:56 |
| 146 | Jonathan Milan | Lidl-Trek | 5:35:35 |
| 147 | Bert Van Lerberghe | Soudal Quick-Step | 5:36:47 |
| 148 | Tim Merlier | Soudal Quick-Step | 5:37:19 |
| 149 | Guillaume Boivin | Israel-Premier Tech | 5:37:44 |
| 150 | Dylan Groenewegen | Team Jayco-AlUla | 5:38:24 |
| 151 | Phil Bauhaus | Bahrain Victorious | 5:39:29 |
| 152 | Luka Mezgec | Team Jayco-AlUla | 5:40:08 |
| 153 | Arnaud Démare | Arkea-B&B Hotels | 5:40:35 |
| 154 | Benjamin Thomas | Cofidis | 5:41:16 |
| 155 | Kamil Gradek | Bahrain Victorious | 5:43:51 |
| 156 | Roel van Sintmaartensdijk | Intermarché-Wanty | 5:44:11 |
| 157 | Fabian Lienhard | Tudor Pro Cycling Team | 5:46:00 |
| 158 | Jordi Meeus | Red Bull-BORA-hansgrohe | 5:48:25 |
| 159 | Edward Theuns | Lidl-Trek | 5:51:25 |
| 160 | Simone Consonni | Lidl-Trek | 5:51:40 |
Stage 20 map & profile:

Stage 20 map

Stage 20 profile
Stage 20 photos by Fotoreporter Sirotti:

Riders presentation ceremony: Guillaume Martin

Tim Merlier & Valentin Paret-Peintre

Team Lotto

The stage gets started. Here's the publicity caravan.

Another shot of the publicity caravan.

Nice work! Kaden Groves solos across the line for a superb stage win.

Second-place Frank van den Broek came in 54 seconds later.

Pascal Eenkhoorn finishes third.

Simone Velasco (on the left) wins the field sprint for fourth.

Stage winner Kaden Groves

One more stage to go. Tadej Pogacar about has the Tour wrapped up.