En bref: Les rapports Shopping et PMax montrent la requête mais cachent le produit. Ajoute un paramètre d'URL, {lpurl}?utm_content={product_id}, et en une semaine GA4 te rend le rapport disparu requête × produit en joignant sessionManualAdContent à sessionGoogleAdsQuery. Sur un compte réel, cette vue a révélé 85 % des dépenses filant dans des paires qui ne convertissaient jamais, pendant qu'une tranche de 0,25 % portait tout le compte à 46,8× de ROAS.
Un client m’a un jour posé une question qui devrait se régler en un clic. Quelqu’un a cherché « aspirateur sans fil moins de 200 », a cliqué sur l’annonce Shopping, et le compte a payé. Sur lequel des 5 000 produits du flux ce clic a-t-il atterri ? J’ai ouvert le rapport de requêtes, puis le rapport produits, et il n’y avait aucun moyen de les relier. Il n’y en a toujours pas. Google te montre la requête, il te montre le produit, mais jamais ensemble.
Il y a des années, la vieille API AdWords te donnait exactement cet appariement. Puis il a discrètement disparu, et aucun réglage, aucun rapport, aucun champ d’API ne le ramène. Pour une boutique en ligne, ce trou n’est pas cosmétique. La liaison requête-produit, c’est là que vit la vraie optimisation. Est-ce que tes titres collent à la vraie demande. Quels produits attirent du trafic poubelle. Pourquoi un produit reçoit des clics mais ne convertit jamais.
Douze ans à coder contre l’API Google Ads m’ont appris une chose, quand Google retire un rapport, il ne revient pas. Alors je l’ai reconstruit moi-même, et la reconstruction est d’une simplicité presque gênante. Un paramètre d’URL. En une semaine, GA4 te rend chaque clic payant apparié en requête × produit, avec sessions, conversions et chiffre d’affaires attachés. Le montage prend quelques minutes ; tout le reste de cet article, c’est ce que tu fais de ce qui revient.
La solution : un paramètre, deux dimensions GA4
Ajoute un modèle de suivi
Mets {lpurl}?utm_content={product_id} sur tes campagnes Shopping et PMax. La variable ValueTrack {product_id} envoie l’ID produit Merchant Center à chaque clic.
GA4 stocke le produit
L’UTM atterrit dans la dimension Contenu d’annonce manuel de la session (sessionManualAdContent).
GA4 connaît déjà la requête
L’auto-tagging (gclid) remplit sessionGoogleAdsQuery sur la même session.
Joins les deux dimensions
Chaque clic payant devient une paire requête × produit, avec sessions, taux de conversion et chiffre d’affaires attachés.
L’auto-tagging et l’UTM manuel ne se battent pas entre eux. Le gclid continue de gérer source, support et campagne ; ton UTM ne porte que l’ID produit.
Sache ce que tu obtiens (et ce que tu n’obtiens pas)
- Uniquement les requêtes cliquées. Ce jeu de données commence au clic. Les requêtes où ton annonce s’est affichée sans que personne ne clique n’atteignent jamais GA4. L’analyse au niveau des impressions reste dans le rapport standard de Google, sans les produits.
- Environ 20 % des clics ne s’apparieront pas. Sessions au consentement refusé, surfaces PMax sans aucune requête (Display, YouTube, Gmail), clics qui n’ont jamais déclenché l’analytics.
- À l’échelle de la session. Une session porte un seul ID produit, celui du clic, même si l’utilisateur en parcourt ensuite dix autres.
Extraire le rapport de GA4
Dans l’interface GA4, ouvre Explorer et monte un tableau au format libre. Les dimensions sont Contenu d’annonce manuel de la session et Requête Google Ads de la session. Les métriques, sessions, événements clés (anciennement conversions) et revenus liés aux achats. Filtre sur source/support de la session égal à google / cpc.
Pour tout usage sérieux, tu voudras la Data API, parce que ce rapport a sa place dans un dashboard ou une jointure BigQuery, pas dans un onglet de navigateur :
from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import (
RunReportRequest, DateRange, Dimension, Metric, FilterExpression, Filter
)
request = RunReportRequest(
property=f"properties/{GA4_PROPERTY_ID}",
dimensions=[
Dimension(name="sessionManualAdContent"), # product ID
Dimension(name="sessionGoogleAdsQuery"), # search term
],
metrics=[
Metric(name="sessions"),
Metric(name="keyEvents"),
Metric(name="purchaseRevenue"),
],
date_ranges=[DateRange(start_date="30daysAgo", end_date="today")],
dimension_filter=FilterExpression(filter=Filter(
field_name="sessionSourceMedium",
string_filter=Filter.StringFilter(value="google / cpc"),
)),
)
Joins sessionManualAdContent à ton flux produits (de l’id au titre, prix, catégorie) et le rapport est complet. Requête, produit, titre et économie dans un seul tableau.
Vérifié, pas théorisé
Nous avons déployé ça sur un compte en production, un détaillant tchèque d’électronique avec 22 campagnes Shopping activées, et j’ai vérifié GA4 sept jours plus tard :
GA4, 7 jours après le déploiement
- Lignes de trafic google/cpc 9 753
- Portaient l'ID produit (utm_content) 96 %
- Portaient la requête de recherche (sessionGoogleAdsQuery) 81 %
- Portaient les deux, un rapport requête × produit opérationnel 78 %
Maintenant la partie amusante : ce que les paires révèlent
1 · Le décalage du titre
Place les requêtes à côté du titre et de la description qu’elles ont déclenchés. Le décalage saute aux yeux :
La feuille de route du flux s’écrit toute seule. J’ai passé ces deux dernières années à construire un outil d’enrichissement de flux par IA, et la faiblesse honnête de toute la catégorie, c’est de prouver l’impact. Ce rapport règle ça. Réécris le titre autour de la demande que tu viens de prouver, puis regarde le CTR et le taux de conversion bouger par requête. L’enrichissement de flux par IA cesse d’être un pari aveugle et devient une boucle mesurable.
2 · Qui d’autre est sur « ta » requête, et avec quel produit
Une chose que tu ne peux pas faire, c’est ajouter des mots clés à exclure par produit. Google ne te donne aucun levier de ce genre en Shopping ou en PMax. Alors quand une paire requête × produit sous-performe, demander comment l’exclure ne mène nulle part. La question productive, c’est pourquoi elle sous-performe.
Prends la requête et scrape la page de résultats en direct. J’utilise DataForSEO, endpoint serp/google/organic/live/advanced. Un POST avec le texte de la requête et le location_code de ton marché renvoie toute la page de résultats en JSON structuré, annonces payantes, blocs shopping avec noms de marchands et prix, organique en dessous. DataForSEO facture au SERP, et un SERP couvre jusqu’à 10 résultats. Au prix de base actuel d’environ 0,002 $ par SERP, vérifier 200 requêtes en profondeur par défaut coûte à peu près 0,40 $, avant les paramètres avancés payants.
Un constat typique. Ton sac de couchage milieu de gamme collecte des clics sur une requête générique, et la même requête affiche trois marques discount de la même catégorie à la moitié de ton prix. Le produit est bon. Le prix perd cette enchère précise.
Tu as maintenant de vraies options. Repositionne le prix. Pousse le différenciateur dans le titre (« garnissage duvet, confort −15 °C »). Déplace le produit vers une campagne dont les enchères collent à sa réalité de marge. Ou accepte la requête comme haut de l’entonnoir et juge-la sur des métriques assistées plutôt que sur le dernier clic.
3 · Décisions de structure et d’enchères
Les produits qui attirent des requêtes à forte intention méritent leurs propres groupes de composants et budgets. Les produits qui ne collectent qu’un trafic générique vont dans des groupes fourre-tout avec des objectifs prudents. Ce rapport donne à la segmentation shopping une base de preuves, et il remplace l’intuition.
4 · Un bilan de santé pour PMax
PMax ne te dit presque rien sur le search. Ce rapport est ce qui se rapproche le plus d’un audit de ce que PMax achète réellement pour toi sur la surface search, par produit.
Regarde-moi parcourir un vrai export, étape par étape
Tout ce qui précède, c’est le pourquoi. Voici à quoi ça ressemble vraiment, chaque étape, ce que tu télécharges, ce que tu fixes du regard, et le vrai chiffre qui revient.
Les données viennent d’un second compte, une boutique en ligne tchèque de taille moyenne dans le segment des bonnes affaires. Ce n’est pas le détaillant d’électronique de l’encadré GA4 ci-dessus ; je l’utilise parce que son catalogue est assez large pour que chaque tendance apparaisse à pleine échelle. J’ai extrait son rapport brut de requêtes Shopping via l’API Google Ads dans une table SQLite locale et lancé les agrégations ci-dessous. Une réserve d’abord. Le rapport brut te donne le groupe d’annonces ou le groupe de produits sous lequel la requête a été diffusée, pas le produit individuel. C’est précisément le trou que l’astuce de l’UTM comble. Mais même au niveau du groupe de produits, les résultats intermédiaires sont assez bruyants pour faire passer le message.
Source de chaque chiffre de cette section : rapport de requêtes Shopping Google Ads, un compte de boutique en ligne tchèque de taille moyenne, ~22,6 M de lignes, données extraites en avril 2026. Montants convertis des CZK à ~25 CZK/EUR.
Étape 1 · Extraire le rapport brut et mesurer le tas
Exporte le rapport de requêtes Shopping via l’API Google Ads (search_term_view) vers n’importe quoi sur quoi tu peux lancer un GROUP BY, SQLite ou BigQuery. Avant de joindre ou de filtrer quoi que ce soit, lance un simple COUNT(*) et quelques SUM. Tu dois sentir à quel point le tas brut est gros et bruyant, parce que ce seul fait recalibre toutes les attentes qui suivent :
Le tas brut, un COUNT et trois SUM
- Lignes du rapport (requête × groupe de produits) 22 640 716
- Requêtes de recherche distinctes 5 370 131
- Groupes de produits sous lesquels elles ont été diffusées 10 393
- Dépenses / revenus (ROAS global 6,8×) 103 k€ / 697 k€
22,6 millions de lignes, 5,4 millions de requêtes uniques. Aucun humain ne lit ça. Le seul rôle de ce chiffre est de t’indiquer le prochain mouvement, agréger le tas selon la dimension qui paie les factures, et de t’avertir que tout tri manuel ligne par ligne est sans espoir.
Étape 2 · Jettes-en 96 % avant d’analyser quoi que ce soit
Compte les lignes à zéro clic, puis filtre-les. Le rapport de requêtes Shopping enregistre chaque requête pour laquelle ton annonce s’est affichée, et la plupart de ces requêtes, personne n’a jamais cliqué dessus. Les lignes purement à impressions ne peuvent ni te coûter ni convertir. C’est du bruit qui rend la table effrayante.
WHERE clicks > 0 réduit la table à 738 444 lignes, une taille avec laquelle tu peux vraiment travailler.
Le déluge d'impressions
- Lignes à zéro clic (impressions pures) 21 902 272 (96,7 %)
- Lignes qui ont fini par coûter de l'argent 738 444 (3,3 %)
96,7 % du chiffre effrayant n’a jamais été autre chose que du bruit. Filtre sur les lignes cliquées avant d’analyser quoi que ce soit, et chaque agrégation ci-dessous tourne sur la partie qui dépense réellement de l’argent.
Étape 3 · Pose la seule question qui recadre le compte
Sur les lignes cliquées, répartis les dépenses entre « a converti au moins une fois » et « n’a jamais converti », puis totalise le coût de chaque camp. C’est le chiffre qui transforme « le compte va bien, le ROAS est de 6,8 » en « la majeure partie du budget ne fait rien ». Calcule-le avant toute idée d’optimisation :
Le poids mort sans conversion
- Lignes du rapport ayant converti zéro fois 99,75 %
- Part des dépenses totales que ces lignes ont absorbée 85,5 %
- Dépenses sans aucune conversion derrière 88 k€
- Parmi les lignes cliquées seules, part sans conversion 92,3 %
85 % du budget a transité par des combinaisons requête × groupe de produits qui n’ont jamais converti une seule fois.
Ce n’est pas une erreur d’arrondi à optimiser plus tard. C’est l’événement principal. Et tu ne pouvais le voir que parce que tu as regroupé la requête sur ce contre quoi elle a été vendue.
Étape 4 · Vérifie si le gaspillage vient de quelques coupables ou de toute la foule
Trie les lignes cliquées par coût, prends le top 1 % et le top 10 %, et regarde quelle part des dépenses totales ils détiennent. Cela décide de ta tactique. Si une poignée de termes brûle le budget, tu les mets en pause et c’est réglé. Si le gaspillage est diffus, mettre des termes en pause est inutile et il te faut des correctifs structurels :
Où se trouve réellement la dépense gaspillée
- Top 1 % des lignes cliquées par coût 10,5 % des dépenses
- Top 10 % des lignes cliquées par coût 29,8 % des dépenses
Le poids mort est longue traîne. Le top 1 % des lignes coûteuses détient à peine un dixième des dépenses, donc mettre en pause 20 mauvais termes ne change rien. Corrige la structure, quels produits dans quelle campagne avec quel objectif, plutôt que de courir après des requêtes individuelles. Et souviens-toi que Google ne te laisse de toute façon même pas ajouter un mot clé à exclure par produit.
Étape 5 · Découvre pourquoi la longue traîne fuit : une requête, plusieurs produits
Pour chaque requête de recherche, compte sous combien de groupes de produits distincts elle a été diffusée. Cela explique mécaniquement le gaspillage. Shopping fait correspondre une requête aux signaux de tout ton flux, pas à la pertinence d’un seul produit. Une seule requête fuit à travers des coins sans rapport de ton catalogue, et tu paies chaque raté.
Un cas concret du compte. La requête « collier anti-aboiement » continuait de brûler du budget, alors j’ai lancé COUNT(DISTINCT ad_group) dessus. Elle avait été diffusée sous 139 groupes d’annonces et de produits différents, pour 39 € et à peu près zéro conversion. « lego technic » en a touché 300.
La pulvérisation des requêtes sur le catalogue
- Termes distincts diffusés sous plus d'un groupe de produits 46,7 %
- Plus grand nombre de groupes de produits atteints par une seule requête 6 661
- « collier anti-aboiement » → groupes / coût / conversions 139 / 39 € / ~0
Près de la moitié des requêtes sont étalées sur plusieurs groupes de produits, et les pires en atteignent des milliers. C’est le moteur du poids mort sans conversion de l’étape 3, et exactement ce que tu peux enfin voir une fois que chaque clic porte son ID produit.
Étape 6 · Regarde les pires décalages à l’œil nu, parce qu’ils sont absurdes
Sors les lignes au coût le plus élevé qui n’ont jamais converti et lis la requête à côté du groupe de produits contre lequel elle a été vendue. Les chiffres agrégés convainquent ton tableur. Ces trois lignes convainquent ton patron :
| Requête de recherche | Diffusée sous le groupe de produits | Clics | Coût | Conv. |
|---|---|---|---|---|
| collier de dressage pour chien | Sacs à main | 97 | 11 € | 0 |
| collier anti-aboiement | Produits pour bébé | 76 | 9,60 € | 0 |
| lego technic | Éclairage | 70 | 6,80 € | 0 |
Une requête de collier de dressage pour chien payée sous le groupe Sacs à main. Un collier anti-aboiement vendu contre des Produits pour bébé. Le groupe de produits n’a rien à voir avec la requête. Google a fait correspondre sur des signaux larges du flux, encaissé le clic et facturé le compte. Avec requête × produit, tu vois ça d’un coup d’œil ; avec le rapport standard de Google, jamais. (Catégories traduites et anonymisées.)
Étape 7 · Maintenant le gain : les 0,25 % qui paient tout le compte
Inverse l’étape 3. Isole uniquement les lignes qui ont converti et totalise leur coût et leur chiffre d’affaires. C’est la raison pour laquelle tout cet exercice compte. Une fois que tu peux séparer les gagnants du poids mort, tu protèges les gagnants et tu affames le reste.
La tranche qui mérite sa place
- Lignes ayant converti (part de toutes les lignes) 57 209 (0,25 %)
- Ce qu'elles ont coûté 14,9 k€
- Ce qu'elles ont rapporté 697 k€
- ROAS sur cette tranche 46,8×
Un quart de pour cent des lignes tourne à 46,8× de ROAS et porte effectivement le compte. Les 99,75 % restants tirent le chiffre global vers le bas, à 6,8×. Trouver cette tranche, protéger son budget et structurer tout le reste à l’écart d’elle, c’est tout le travail. Et rien de tout ça n’est possible tant que chaque ligne ne porte pas le produit contre lequel elle a été vendue. C’est ce que t’achète l’UTM à un paramètre du début de cet article.
Télécharge les instructions complètes pour ton IA
Toute la méthode ci-dessus, réécrite en brief que tu peux coller tel quel dans Claude ou dans n'importe quel agent de code capable. Il pose le modèle de suivi, sort le rapport requête × produit de GA4 et lance les agrégations sur ton compte. Le modèle et ses trois pièges sont aussi dedans. Laisse ton e-mail et le fichier est à toi.
One file, one list. I only write when there's something worth reading.
FAQ
Est-ce que ça marche pour Performance Max ?
Oui, pour la surface search et shopping. Les clics Display, YouTube et Gmail portent l’ID produit mais pas de requête, donc attends-toi à voir ces lignes avec une dimension requête vide.
L'UTM va-t-il casser mon attribution GA4 ?
Non. L’auto-tagging (gclid) continue de gérer source, support et campagne ; tu n’ajoutes que le contenu d’annonce. Ce qui casserait tout, c’est un paramètre personnalisé dans utm_campaign, alors n’en mets jamais un là.
Pourquoi seulement 78 % de couverture ?
Le mode consentement, les surfaces PMax sans requête et les bloqueurs analytics grignotent le reste. 78 % suffit largement pour chaque usage ci-dessus, parce que tu lis des tendances, tu n’audites pas au centime.
Je peux voir les requêtes pour lesquelles mon annonce s'est affichée sans clic ?
Non. Ce jeu de données commence au clic. L’analyse au niveau des impressions reste dans le rapport de requêtes standard, sans les produits.
Le procédé fonctionne-t-il hors de Google, disons Bing ou Sklik ?
Oui. Le procédé se transpose à toute plateforme avec un modèle d’URL, une macro produit et une dimension analytics pour la capter. Les macros précises diffèrent selon la plateforme.
Combien de temps avant d'avoir des données exploitables ?
Ça dépend du volume. Notre compte avait un rapport exploitable en 7 jours ; les comptes plus petits devraient en collecter 30.
CTA: Lesquels de tes produits méritent leurs clics, et lesquels ne font que te facturer ? Ajoute le paramètre aujourd’hui, et dans une semaine tu sauras. Ou envoie-moi ton compte et on lit le rapport ensemble.