Victime de fractures aux deux bras, consécutives à une chute la veille, l'Espagnol Marc Soler (Movistar) est non-partant[3].
Après plus de dix kilomètres de course, une échappée de quatre coureurs se forme, avec : l'Allemand Jonas Koch (Intermarché-Wanty-Gobert Matériaux), l'Australien Simon Clarke (Qhubeka NextHash), le Belge Edward Theuns (Trek-Segafredo) et le Français Anthony Perez (Cofidis). Après de multiples relances à l'arrière dans le but de sauver son maillot, le peloton autorise le Néerlandais Ide Schelling (Bora-Hansgrohe) à rejoindre les coureurs devant, le Français Jérémy Cabot (TotalEnergies) l'accompagne. Au passage dans Lannion, le natif de la ville, Franck Bonnamour, a la chance de précéder le peloton pour saluer la foule.
La journée est marquée par un duel enragé entre le Français et le Néerlandais, le premier à la recherche du maillot à pois et le second dans le but de le garder. Au sommet de la côte de Sainte-Barbe (900 m à 6,6 %), Anthony Perez passe en tête devant Ide Schelling, avec trois minutes d'avance sur le peloton. Au sprint intermédiaire de Plouha, Edward Theuns passe en tête devant Jonas Koch ; derrière, c'est l'Australien Caleb Ewan (Lotto-Soudal) qui passe devant le Britannique Mark Cavendish (Deceuninck-Quick Step). Au sommet de la côte de Pordic ( 2,1 km à 3,2 %), c'est au tour d'Ide Schelling de devancer Anthony Perez, avec toujours près de deux minutes d'avance sur le peloton.
A l'entrée de Saint-Brieuc, Edward Theuns s'isole à l'avant à la suite de mauvaises ententes entre les différents membres de l'échappée, provoquées notamment par le duel pour le maillot à pois, qui nuit à l'avance de celle-ci sur le peloton. Le Belge passe seul au sommet de la côte de Saint-Brieuc ( 1 km à 8 %), suivi de près par Jérémy Cabot. Le nouveau duo franco-belge compte une minute et trente secondes d'avance sur le peloton, les autres poursuivants ayant été repris. À l'entrée de Guerlédan, Edward Theuns lâche Jérémy Cabot, absorbé par le peloton. Il passe en tête au sommet de la côte du village de Mûr-de-Bretagne ( 1,6 km à 4,1 %), où il est à son tour absorbé.
Au premier passage dans le Mur, Mathieu van der Poel (Alpecin-Fenix) attaque dès le pied ; il passe en tête au sommet et profite des premières bonifications mises à disposition par l'organisation. Derrière, Primož Roglič (Jumbo-Visma), Tadej Pogačar (UAE Emirates), Julian Alaphilippe (Deceuninck-Quick Step) et Richard Carapaz (INEOS Grenadiers) se dévoilent, mais les cinq coureurs arrêtent leur effort et retournent dans le groupe de favoris à l'arrière, histoire de préserver leurs forces avant la seconde ascension. Au pied du second passage dans le Mur, les coureurs de l'équipe britannique INEOS Grenadiers mènent le peloton sur un rythme infernal. Dans les pourcentages les plus difficiles, le Colombien Nairo Quintana (Arkéa-Samsic) lance les festivités, mais il est rapidement repris. Sous la flamme rouge, le champion d'Italie Sonny Colbrelli (Bahrain Victorious) tente sa chance, avant que Mathieu van der Poel réitère en plaçant une attaque foudroyante, que personne n'est en mesure de suivre. Il s'impose sur les hauteurs de Guerlédan avec six secondes d'avance sur Tadej Pogačar, Primož Roglič et Wilco Kelderman (Bora-Hansgrohe) et de huit secondes sur Julian Alaphilippe, qui perd son maillot jaune au profit du Néerlandais.
Mathieu van der Poel hérite du maillot jaune qu'il dédie à son grand-père maternel, Raymond Poulidor, qui n'a jamais eu la chance de le porter malgré sa longue carrière. Le Néerlandais remporte également le maillot à pois ; le maillot vert prend place sur les épaules de Julian Alaphilippe, tandis que Tadej Pogačar conserve son maillot blanc.