optimisation core web vitals 7 min

Formats Google Ads : l’impact caché sur vos Core Web Vitals

Les scripts publicitaires Google Ads alourdissent LCP, INP et CLS. Voici comment diagnostiquer et corriger l’impact de chaque format sans sacrifier vos revenus.

Par Julien Morel
Partager

On a vu un site perdre 22 % de ses revenus publicitaires en une semaine, juste après un pic de LCP à 6,2 secondes. La cause n’était pas le serveur. Pas les images produits. Juste trois scripts Google Ads chargés en <head>, sans async, sans defer, sans stratégie de priorité.

L’intégration des formats Google Ads n’a jamais été pensée pour la performance. Elle a été pensée pour maximiser les impressions et le taux de remplissage. Résultat : vos Core Web Vitals encaissent des régressions que Google Search Console vous remonte comme une dégradation de l’expérience utilisateur.

Les trois scripts qui étranglent votre LCP avant le premier pixel

Ouvrez la waterfall d’un site monétisé avec Google Ad Manager. Ce que vous allez voir, c’est une chaîne de dépendances qui fait saigner le Largest Contentful Paint.

Premier coupable : gtag.js. Chargé en synchrone dans le <head>, il bloque le parse HTML jusqu’à ce que le moteur JavaScript ait fini de l’exécuter. Sur une connexion mobile 4G, cela ajoute facilement 800 à 1200 millisecondes avant que le navigateur puisse commencer à afficher quoi que ce soit. Ajoutez à cela le script adsbygoogle.js et un pixel de remarketing, et vous avez trois ressources bloquantes qui repoussent le LCP bien au-delà du seuil des 2,5 secondes.

Le piège, c’est que ces trois fichiers ne sont jamais une fin en soi. gtag.js déclenche une requête vers googletagservices.com, qui en déclenche une vers googleads.g.doubleclick.net, qui charge à son tour le payload de la création. Chaque maillon ajoute un round-trip réseau, et chaque round-trip se paye en LCP sur connexion mobile dégradée. Un seul gtag.js dans le <head> ne coûte donc pas une ressource, mais une cascade entière qui s’allume avant que votre image hero ait eu sa première chance d’être servie.

Dans l’onglet Network des DevTools, filtrez par domaine googlesyndication.com et doubleclick.net. Si ces requêtes apparaissent avant votre contenu principal, vous avez un problème de séquencement. La solution passe par un chargement asynchrone du tag Google, un fetchpriority="low" sur les scripts publicitaires non critiques et l’injection du pixel de remarketing uniquement après l’événement load.

Remarketing et suivi de conversion : le gouffre INP dont personne ne parle

Le score INP mesure la latence de l’interaction. Une page qui répond en 80 ms au clic, c’est propre. La même page avec un tracking de conversion Google Ads et un pixel de remarketing enregistrant chaque mouvement de souris ? Elle peut passer à 400 ms sans crier gare.

La raison est simple : ces scripts attachent des écouteurs d’événements, souvent avec des callbacks synchrones, sur click, scroll et mousemove. Le main thread se retrouve saturé pendant quelques frames critiques. L’utilisateur clique sur un bouton, le navigateur exécute d’abord le code de tracking, puis l’action métier. Ce retard cumulé dégrade l’Interaction to Next Paint.

Pour isoler le phénomène, enregistrez un profil Performance Chrome avec l’option « CPU throttling 4x ». Repérez les tâches longues déclenchées par googletagmanager.com ou googleadservices.com. La parade consiste à déplacer ces pixels vers un worker via Partytown ou à ne les charger que sur engagement explicite de l’utilisateur, ce qui est d’ailleurs parfaitement aligné avec les exigences de consentement RGPD.

Display HTML5 : 2 Mo de JS pour une bannière qui ne capte même pas le regard

⚠️ Attention : Un seul format rich media peut contenir plus de code que l’ensemble de votre bundle applicatif. Vérifiez le poids des créations avant de les accepter.

Les bannières HTML5 livrées par Google Ad Manager embarquent leur propre runtime, des polices web et parfois trois frameworks d’animation redondants. L’iframe parse un fichier de 1 à 2 Mo, et le thread principal reste monopolisé pendant tout ce temps. L’hydratation du contenu interactif autour patiente.

La solution structurelle : charger les annonces display dans des iframes sandboxées avec sandbox="allow-scripts allow-same-origin", et les différer après le contenu éditorial. Si l’ad server le permet, imposez un poids maximal de 200 Ko par création. Les équipes marketing vont grimacer, mais leur CTR n’est pas corrélé au mégaoctet supplémentaire de jQuery embarqué.

Le CLS qui survit à la réservation d’espace, signature des annonces natives

Les formats in-feed ou in-article de Google AdSense et Ad Manager posent un problème de layout shift qui persiste même quand on coche toutes les cases de l’optimisation. La raison ? Le conteneur reçoit d’abord une hauteur implicite de 0 ou d’un placeholder, puis l’annonce injecte dynamiquement un contenu dont la hauteur réelle varie selon la création livrée. Si vous n’avez pas réservé une min-height explicite correspondant à la hauteur de l’encart le plus grand, le décalage visuel est systématique.

Ce bug est documenté dans l’aide Google, mais le paramètre data-ad-format="auto" n’applique pas de contrainte de hauteur statique. Il faut forcer le conteneur parent en CSS avec une hauteur minimale basée sur la mesure de vos inventaires réels. Un min-height: 280px pour un rectangle medium, assoupli par une propriété aspect-ratio, règle la plupart des cas. Vérification possible dans la Search Console, section Core Web Vitals, en filtrant les pages qui embarquent des annonces natives.

La séquence concrète pour repasser sous 2,5 s de LCP sur un gros site média

Trois changements suffisent, sans toucher au volume de demandes d’annonces.

D’abord, déplacer le chargement de gtag.js en fin de <body>, avec un attribut async et un fetchpriority="low". Le script se charge en arrière-plan, il ne bloque plus le rendu critique. Ensuite, encapsuler l’appel à googletag.display() dans un requestIdleCallback avec un timeout de 2000 ms. Les créations display s’affichent une fois que le navigateur a fini de prioriser le contenu éditorial. Enfin, remplacer le pixel de conversion direct par un événement envoyé au data layer, traité côté serveur.

Sur une SPA React avec un state management via Zustand, déclenchez le chargement d’un slot publicitaire après l’hydratation d’un composant clé, plutôt qu’en bloc à l’init. Le thread principal reste libre pendant l’interaction critique.

L’audit qui mesure la taxe pub avant d’ouvrir la Search Console

WebPageTest, profil mobile 3G, sur une page monétisée. Dans la cascade, repérez pagead2.googlesyndication.com, googleads.g.doubleclick.net et adservice.google.com. Lancez un second run avec ces domaines bloqués via l’onglet « Block ». La différence de LCP entre les deux runs : c’est la taxe pub exacte que votre intégration prélève sur l’expérience utilisateur.

La priorité de fetch, option que Google ne documente pas assez

fetchpriority="low" sur le tag Google Ads et les iframes display indique au navigateur de servir d’abord vos images hero, vos polices critiques et le CSS principal. Dans la console Network, les requêtes basses priorité passent en file d’attente une fois les ressources critiques traitées. L’impression pub n’est comptabilisée qu’au rendu de l’élément, donc aucun ad server ne pénalise ce réglage : la page apparaît plus tôt, le CPM reste intact. Le delta sur le LCP est mesurable dès le premier reload, sans avoir à toucher au reste de l’intégration.

Questions fréquentes

Les annonces Google Shopping ont-elles un impact sur les Core Web Vitals de mon site ?

Non. Les formats Shopping sont affichés directement sur les pages de résultats Google, pas sur votre site. Ils sont hébergés et servis par Google, sans script tiers exécuté chez vous. L’impact se mesure sur le taux de clic et le coût par clic, pas sur le LCP ou l’INP de vos pages.

Peut-on continuer à utiliser Google Ad Manager et valider les Core Web Vitals ?

Oui, à condition de ne pas traiter la pub comme une ressource prioritaire. L’enjeu n’est pas de supprimer des revenus, c’est de séquencer le chargement pour que l’utilisateur voie le contenu avant les bannières. Un site qui charge ses annonces après le LCP peut parfaitement passer la barre des 2,5 secondes et conserver son fill rate.

Pourquoi mon agence pub refuse-t-elle de modifier le tag Google ?

Parce que les équipes trafic sont évaluées sur les impressions livrées, pas sur le PageSpeed. Leur script de tracking doit souvent être appelé tôt pour être pris en compte par l’ad server. La solution n’est pas technique, elle est contractuelle : demandez une version asynchrone du pixel, ou imposez un chargement via GTM avec déclenchement sur window.loaded. Cela ne change rien au tracking, mais cela libère le thread principal pour le contenu utile.

Articles similaires

Julien Morel

Julien Morel

Ancien dev front React passé SEO technique après une migration e-commerce qui a fait perdre 60% du trafic organique à son employeur en une nuit (fichier robots.txt oublié en staging). Depuis, il écrit pour que ça n'arrive à personne d'autre et teste sur ses propres side-projects avant de publier quoi que ce soit.

Cet article est publie a titre informatif. Faites vos propres recherches avant toute decision.