Vuelta a España standings 2025 – Final general classification after stage 21
Jonas Vingegaard is the winner of the 2025 Vuelta

The final stage of the 2025 Vuelta a España, Stage 21, saw Jonas Vingegaard (Visma–Lease a Bike) locked in as the final overall winner of the race.
In the end, the final stage had to be called off as pro-Palestine protestors, who have disrupted this Vuelta on several occasions, entered the race route in the centre of Madrid and blocked the roads.
That meant that, a little earlier than planned, Vingegaard was confirmed as the winner of the 2025 Vuelta a España.
Though the manner of the events was extraordinary, in reality the general classification was already sorted, with the Madrid finale largely a procession ahead of the laps of the capital, where all Vingegaard needed to do was stay upright.
Vingegaard wins the Vuelta a España at an advantage of 1:16 over the runner-up João Almeida (UAE Team Emirates-XRG). Tom Pidcock (Q36.5 Pro Cycling Team) rounds out the podium at 3:11.
There were no changes anywhere on GC. Jai Hindley (Red Bull–Bora–Hansgrohe) finishes in fourth place at 3:41, with best young rider Matthew Riccitello (Israel-Premier Tech) fifth at 5:55.
Giulio Pellizzari (Red Bull–Bora–Hansgrohe) is sixth 7:23 back, with Sepp Kuss (Visma-Lease a Bike) seventh 7:45 and Felix Gall (Decathlon AG2R La Mondiale) eighth at 7:50.
Rounding out the top 10 are Torstein Træen (Bahrain Victorious) and Matteo Jorgenson (Visma–Lease a Bike), at 9:48 and 12:16, respectively.
Subscribe to Cyclingnews for unlimited access to our 2025 Vuelta a España coverage. Our team of journalists are on the ground from the Gran Salida in Italy through to Madrid, bringing you breaking news, analysis, and more, from every stage of the Grand Tour as it happens. Find out more.
Vuelta a España 2025 GC standings
Position | Rider (Team) | Time Gap |
---|---|---|
1 | Jonas Vingegaard (Team Visma | Lease a Bike) | 72h 53' 57" |
2 | Joao Almeida (UAE Team Emirates-XRG) | + 01' 16" |
3 | Tom Pidcock (Q36.5 Pro Cycling Team) | + 03' 11" |
4 | Jai Hindley (Red Bull–BORA–hansgrohe) | + 03' 41" |
5 | Matthew Riccitello (Israel–Premier Tech) | + 05' 55" |
6 | Giulio Pellizzari (Red Bull–BORA–hansgrohe) | + 07' 23" |
7 | Sepp Kuss (Team Visma | Lease a Bike) | + 07' 45" |
8 | Félix Gall (Decathlon AG2R La Mondiale Team) | + 07' 50" |
9 | Torstein Træen (Bahrain Victorious) | + 09' 48" |
10 | Matteo Jorgenson (Team Visma | Lease a Bike) | + 12' 16" |
11 | Junior Lecerf (Soudal Quick-Step) | + 14' 00" |
12 | Harold Tejada (XDS Astana Team) | + 21' 31" |
13 | Abel Balderstone Roumens (Caja Rural–Seguros RGA) | + 28' 07" |
14 | Jaume Guardeño Roma (Caja Rural–Seguros RGA) | + 30' 30" |
15 | Santiago Buitrago (Bahrain Victorious) | + 45' 38" |
16 | Louis Meintjes (Intermarché–Wanty) | + 45' 39" |
17 | Egan Bernal (Ineos Grenadiers) | + 46' 26" |
18 | Giulio Ciccone (Lidl–Trek) | + 48' 17" |
19 | Bruno Armirail (Decathlon AG2R La Mondiale Team) | + 48' 30" |
20 | Kevin Vermaerke (Team Picnic PostNL) | + 50' 08" |
21 | Edward Dunbar (Team Jayco AlUla) | + 57' 19" |
22 | Harold Martin Lopez Granizo (XDS Astana Team) | + 59' 23" |
23 | Rudy Molard (Groupama–FDJ) | + 01h 00' 51" |
24 | Ben Tulett (Team Visma | Lease a Bike) | + 01h 04' 46" |
25 | Felix Grossschartner (UAE Team Emirates Gen-Z) | + 01h 09' 30" |
26 | Marc Soler (UAE Team Emirates Gen-Z) | + 01h 11' 14" |
27 | Mikel Landa (Soudal Quick-Step) | + 01h 18' 26" |
28 | Damien Craig Howson (Q36.5 Pro Cycling Team) | + 01h 19' 07" |
29 | Xavier Finlay Xavier Pickering (Bahrain Victorious) | + 01h 22' 02" |
30 | Jay Vine (UAE Team Emirates Gen-Z) | + 01h 27' 41" |
31 | Sergio Samitier Samitier (Cofidis) | + 01h 33' 20" |
32 | Marco Frigo (Israel–Premier Tech) | + 01h 34' 17" |
33 | Julien Bernard (Lidl–Trek) | + 01h 39' 06" |
34 | Jefferson Cepeda (Movistar Team) | + 01h 43' 22" |
35 | Clément Braz Afonso (Groupama–FDJ) | + 01h 43' 34" |
36 | Wouter Poels (XDS Astana Team) | + 01h 48' 56" |
37 | Louis Vervaeke (Soudal Quick-Step) | + 01h 50' 12" |
38 | Andrea Bagioli (Lidl–Trek) | + 01h 57' 31" |
39 | Pierre Thierry (Arkéa–B&B Hotels) | + 01h 59' 17" |
40 | Fausto Masnada (XDS Astana Team) | + 02h 01' 00" |
41 | Antonio Tiberi (Bahrain Victorious) | + 02h 01' 24" |
42 | Johannes Staune-Mittet (Decathlon AG2R La Mondiale Team) | + 02h 01' 41" |
43 | Jan Hirt (Israel–Premier Tech) | + 02h 01' 43" |
44 | Bob Jungels (Ineos Grenadiers) | + 02h 04' 14" |
45 | Brieuc Rolland (Groupama–FDJ) | + 02h 04' 21" |
46 | Callum Scotson (Decathlon AG2R La Mondiale Team) | + 02h 09' 37" |
47 | Jose Luis Faura Asensio (Burgos–BH) | + 02h 13' 57" |
48 | Lorenzo Fortunato (XDS Astana Team) | + 02h 15' 02" |
49 | Gijs Leemreize (Team Picnic PostNL) | + 02h 16' 48" |
50 | Markel Beloki (EF Education–EasyPost) | + 02h 21' 45" |
51 | Ben Zwiehoff (Red Bull–BORA–hansgrohe) | + 02h 22' 31" |
52 | Léo Bisiaux (Decathlon AG2R La Mondiale Team) | + 02h 22' 33" |
53 | Christopher Hamilton (Team Picnic PostNL) | + 02h 25' 56" |
54 | Guillermo Juan Martinez Huertas (Team Picnic PostNL) | + 02h 27' 08" |
55 | Carlos Canal Blanco (Movistar Team) | + 02h 28' 38" |
56 | Giovanni Aleotti (Red Bull–BORA–hansgrohe) | + 02h 28' 38" |
57 | Lars Craps (Lotto) | + 02h 29' 14" |
58 | Eduardo Sepulveda (Lotto) | + 02h 30' 57" |
59 | Victor Langellotti (Ineos Grenadiers) | + 02h 32' 10" |
60 | Carlos Verona (Lidl–Trek) | + 02h 32' 57" |
61 | Sander De Pestel (Decathlon AG2R La Mondiale Team) | + 02h 33' 33" |
62 | Wilco Kelderman (Team Visma | Lease a Bike) | + 02h 38' 47" |
63 | Hugo De La Calle Arango (Burgos–BH) | + 02h 42' 30" |
64 | Joan Bou Company (Caja Rural–Seguros RGA) | + 02h 43' 12" |
65 | Magnus Sheffield (Ineos Grenadiers) | + 02h 44' 56" |
66 | James Shaw (EF Education–EasyPost) | + 02h 46' 06" |
67 | David Gonzalez Lopez (Q36.5 Pro Cycling Team) | + 02h 47' 42" |
68 | Juan Ayuso (UAE Team Emirates Gen-Z) | + 02h 47' 57" |
69 | Sergio Geovani Chumil Gonzalez (Burgos–BH) | + 02h 49' 38" |
70 | Alex Molenaar (Caja Rural–Seguros RGA) | + 02h 50' 43" |
71 | Nicola Conci (XDS Astana Team) | + 02h 51' 32" |
72 | Michel Heßmann (Movistar Team) | + 02h 51' 52" |
73 | Mauri Vansevenant (Soudal Quick-Step) | + 02h 53' 37" |
74 | Maximilian Schachmann (Soudal Quick-Step) | + 02h 54' 04" |
75 | Sean Quinn (EF Education–EasyPost) | + 02h 55' 04" |
76 | Stefan Küng (Groupama–FDJ) | + 02h 55' 41" |
77 | Jesus Herrada (Cofidis) | + 02h 56' 36" |
78 | Guillermo Thomas Silva Coussan (Caja Rural–Seguros RGA) | + 02h 58' 10" |
79 | Roman Ermakov (Bahrain Victorious) | + 02h 58' 48" |
80 | Jack Haig (Bahrain Victorious) | + 02h 59' 42" |
81 | Brandon Smith Rivera Vargas (Ineos Grenadiers) | + 03h 01' 23" |
82 | Mathijs Paasschens (Bahrain Victorious) | + 03h 01' 46" |
83 | Michal Kwiatkowski (Ineos Grenadiers) | + 03h 02' 25" |
84 | Finn Fisher-Black (Red Bull–BORA–hansgrohe) | + 03h 05' 04" |
85 | Jordan Labrosse (Decathlon AG2R La Mondiale Team) | + 03h 09' 59" |
86 | Nans Peters (Decathlon AG2R La Mondiale Team) | + 03h 10' 09" |
87 | Nico Denz (Red Bull–BORA–hansgrohe) | + 03h 10' 43" |
88 | Orluis Alberto Aular Sanabria (Movistar Team) | + 03h 11' 02" |
89 | Jonas Wilsly (Lotto) | + 03h 11' 10" |
90 | Jakub Otruba (Caja Rural–Seguros RGA) | + 03h 12' 26" |
91 | Mario Aparicio Muñoz (Burgos–BH) | + 03h 12' 44" |
92 | Bjoern Koerdt (Team Picnic PostNL) | + 03h 13' 49" |
93 | Jardi Christiaan Van Der Lee (EF Education–EasyPost) | + 03h 14' 12" |
94 | Kelland O’Brien (Team Jayco AlUla) | + 03h 14' 30" |
95 | Simone Petilli (Intermarché–Wanty) | + 03h 15' 26" |
96 | Alec Segaert (Lotto) | + 03h 16' 15" |
97 | David Gaudu (Groupama–FDJ) | + 03h 16' 55" |
98 | Emanuel Buchmann (Cofidis) | + 03h 17' 06" |
99 | Louis Rouland (Arkéa–B&B Hotels) | + 03h 17' 20" |
100 | Patrick Gamper (Team Jayco AlUla) | + 03h 18' 44" |
101 | Gal Glivar (Alpecin–Deceuninck) | + 03h 19' 37" |
102 | David De La Cruz (Q36.5 Pro Cycling Team) | + 03h 21' 52" |
103 | Thibaud Gruel (Groupama–FDJ) | + 03h 24' 03" |
104 | Lukas Nerurkar (EF Education–EasyPost) | + 03h 24' 13" |
105 | Nicolya Vinokurov (XDS Astana Team) | + 03h 26' 40" |
106 | Jonas Rickaert (Alpecin–Deceuninck) | + 03h 28' 01" |
107 | Ivan Garcia Cortina (Movistar Team) | + 03h 28' 55" |
108 | Pier-André Côté (Israel–Premier Tech) | + 03h 31' 36" |
109 | Ivo Oliveira (UAE Team Emirates Gen-Z) | + 03h 31' 41" |
110 | Christopher Juul-Jensen (Team Jayco AlUla) | + 03h 32' 28" |
111 | Joel Nicolau Beltran (Caja Rural–Seguros RGA) | + 03h 36' 13" |
112 | Nickolas Zukowsky (Q36.5 Pro Cycling Team) | + 03h 38' 01" |
113 | Alessandro Verre (Arkéa–B&B Hotels) | + 03h 38' 20" |
114 | Marcel Camprubi Pijuan (Q36.5 Pro Cycling Team) | + 03h 39' 36" |
115 | Kamiel Bonneu (Intermarché–Wanty) | + 03h 40' 58" |
116 | Huub Artz (Intermarché–Wanty) | + 03h 42' 02" |
117 | Nicolo' Buratti (Bahrain Victorious) | + 03h 42' 13" |
118 | Luca Van Boven (Intermarché–Wanty) | + 03h 42' 14" |
119 | Edward Planckaert (Alpecin–Deceuninck) | + 03h 44' 23" |
120 | Léandre Lozouet (Arkéa–B&B Hotels) | + 03h 49' 26" |
121 | Victor Guernalec (Arkéa–B&B Hotels) | + 03h 52' 49" |
122 | Matteo Sobrero (Red Bull–BORA–hansgrohe) | + 03h 53' 01" |
123 | Dion Allan Smith (Intermarché–Wanty) | + 03h 53' 08" |
124 | Rémi Cavagna (Groupama–FDJ) | + 03h 55' 18" |
125 | Mads Pedersen (Lidl–Trek) | + 03h 56' 59" |
126 | Madis Mihkels (EF Education–EasyPost) | + 04h 00' 51" |
127 | Ben Turner (Ineos Grenadiers) | + 04h 06' 04" |
128 | Dries De Pooter (Intermarché–Wanty) | + 04h 07' 09" |
129 | Jake Stewart (Israel–Premier Tech) | + 04h 08' 08" |
130 | Dylan Van Baarle (Team Visma | Lease a Bike) | + 04h 08' 16" |
131 | Filippo Ganna (Ineos Grenadiers) | + 04h 08' 59" |
132 | Tobias Bayer (Alpecin–Deceuninck) | + 04h 10' 00" |
133 | Fabio Christen (Q36.5 Pro Cycling Team) | + 04h 11' 52" |
134 | Liam Slock (Lotto) | + 04h 11' 58" |
135 | Amanuel Ghebreigzabhier (Lidl–Trek) | + 04h 13' 29" |
136 | Bryan Coquard (Cofidis) | + 04h 15' 14" |
137 | Timo Roosen (Team Picnic PostNL) | + 04h 20' 23" |
138 | Tim Van Dijke (Red Bull–BORA–hansgrohe) | + 04h 20' 23" |
139 | Mikkel Norsgaard Bjerg (UAE Team Emirates Gen-Z) | + 04h 20' 41" |
140 | Jasper De Buyst (Lotto) | + 04h 21' 15" |
141 | Nadav Raisberg (Israel–Premier Tech) | + 04h 24' 53" |
142 | Ethan Kane Vernon (Israel–Premier Tech) | + 04h 31' 47" |
143 | Jenthe Biermans (Arkéa–B&B Hotels) | + 04h 32' 15" |
144 | Domen Novak (UAE Team Emirates Gen-Z) | + 04h 32' 39" |
145 | Jasper Philipsen (Alpecin–Deceuninck) | + 04h 35' 03" |
146 | Arne Marit (Intermarché–Wanty) | + 04h 36' 51" |
147 | Anders Foldager (Team Jayco AlUla) | + 04h 43' 01" |
148 | Soren Kragh Andersen (Lidl–Trek) | + 04h 43' 07" |
149 | Daan Hoole (Lidl–Trek) | + 04h 44' 12" |
150 | Elia Viviani (Lotto) | + 04h 44' 32" |
151 | Patrick Eddy (Team Picnic PostNL) | + 04h 54' 07" |
152 | Stanislaw Aniolkowski (Cofidis) | + 04h 57' 02" |
153 | Oscar Riesebeek (Alpecin–Deceuninck) | + 05h 08' 37" |
Vuelta a España 2025 Classifications
Here's a rundown of all of the classifications at the Vuelta a España.
Maillot Rojo/Red Jersey –The red jersey is worn by the overall race leader on the general classification who has completed the stages so far in the lowest accumulated time.
Winner: Jonas Vingegaard (Visma-Lease a Bike)
Maillot Verde/Green Jersey – The green jersey is the points classification. Points are awarded to riders at the intermediate sprints and stage finishes. The rider with the most points leads the ranking.
Winner: Mads Pedersen (LIdl-Trek)
Maillot de Lunares/Polka Dot Jersey – The blue and white polka dot jersey is the mountains classification. Points are awarded to the first riders over certain hills and climbs during the stage, with the hardest mountains giving the most points. Once again, the rider with the most points leads the ranking.
Winner: Jay Vine (UAE Team Emirates-XRG)
Maillot Blanco/White Jersey – The white jersey is the youth classification. It works the same way as the yellow jersey, but only riders aged 25 or under are eligible to win.
Winner: Matthew Riccitello (Israel-Premier Tech).

Peter Stuart has been the editor of Cyclingnews since March 2022, overseeing editorial output across all of Cyclingnews' digital touchpoints.
Before joining Cyclingnews, Peter was the digital editor of Rouleur magazine. Starting life as a freelance feature writer, with bylines in The Times and The Telegraph, he first entered cycling journalism in 2012, joining Cyclist magazine as staff writer. Peter has a background as an international rower, representing Great Britain at Under-23 level and at the Junior Rowing World Championships.
You must confirm your public display name before commenting
Please logout and then login again, you will then be prompted to enter your display name.