Analyse approfondie· Shopping & PMax · 13 min de lecture

Le rapport de requêtes Shopping que Google refuse de vous donner

Les rapports Shopping et PMax montrent la requête, jamais le produit. Reconstruisez le rapport requête × produit avec un paramètre d'URL et deux dimensions GA4.

Illustration pairing a stack of search queries with a single product, the missing link Google's reports hide.
Les faits sont réels — les couvertures d'articles non.

En bref: Les rapports Shopping et PMax montrent la requête mais cachent le produit. Ajoutez un paramètre d'URL — {lpurl}?utm_content={product_id} — et en une semaine GA4 vous rend le rapport requête × produit disparu, en joignant sessionManualAdContent à sessionGoogleAdsQuery. Sur un compte réel, cela a révélé 85 % des dépenses passant par des paires sans conversion et une tranche de 0,25 % portant tout le compte à 46,8× de ROAS.

78 %
des clics appariés requête × produit
22
campagnes mises à jour
1
paramètre d'URL — c'est tout le dispositif
7 jours
jusqu'aux données vérifiées dans GA4

Ajoutez un paramètre d’URL à vos campagnes Shopping et Performance Max et, en une semaine, GA4 vous rend le rapport que Google a discrètement supprimé : chaque clic payant apparié en requête × produit — avec sessions, conversions et chiffre d’affaires attachés. C’est dans cet appariement que se cache l’argent — quels produits attirent un trafic de mauvaise qualité, quels titres ratent la vraie demande, quelles requêtes brûlent du budget sans jamais vendre. La mise en place se résume à ce seul paramètre ; tout le reste de cet article, c’est ce que vous faites de ce qui revient.

Si vous gérez des campagnes Shopping ou Performance Max, vous connaissez le rapport de requêtes. Ce que vous n’avez peut-être pas remarqué — parce que Google ne le souligne jamais — c’est ce qui en est absent : le produit.

Vous voyez que quelqu’un a cherché « aspirateur sans fil moins de 200 ». Vous voyez les clics et le coût. Vous ne voyez pas lequel de vos 5 000 produits cette requête a déclenché, sur lequel elle a atterri, ni lequel elle a vendu.

Il y a quelques années, l’API AdWords vous donnait cet appariement. Aujourd’hui, non. Et pour un compte e-commerce, ce n’est pas une lacune cosmétique — la liaison requête-produit, c’est là que vit la vraie optimisation : si vos titres correspondent à la vraie demande, quels produits attirent un trafic de mauvaise qualité, pourquoi un produit reçoit des clics mais ne convertit jamais.

Avant que vous ne posiez la question : non, il n’existe aucun réglage pour ça. Aucun rapport, aucun champ d’API, aucun script ne le ramène du côté de Google. Vous devez le reconstruire vous-même — et la reconstruction est d’une simplicité presque gênante.

La solution : un paramètre, deux dimensions GA4

Ajoutez un modèle de suivi

Sur vos campagnes Shopping et PMax : {lpurl}?utm_content={product_id}. 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.

Joignez 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 ; votre UTM ne porte que l’ID produit.

Sachez ce que vous obtenez (et ce que vous n’obtenez pas)

  • Uniquement les requêtes cliquées. Ce jeu de données commence au clic. Les requêtes où votre 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).
  • ~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 = un ID produit — celui qui a été cliqué, même si l’utilisateur en parcourt ensuite dix autres.

Extraire le rapport de GA4

Dans l’interface : Explorer → format libre. Dimensions : Contenu d’annonce manuel de la session + Requête Google Ads de la session. Métriques : sessions, conversions, revenus liés aux achats. Filtre : source/support de la session = google / cpc.

Via la Data API — pour tout usage sérieux, cela alimente un dashboard ou une jointure BigQuery :

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="conversions"),
        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"),
    )),
)

Joignez sessionManualAdContent à votre flux de produits (id → titre, prix, catégorie) et le rapport est complet : requête × produit × titre × économie.

Vérifié, pas théorisé

Nous avons déployé ceci sur un compte en production — un détaillant tchèque d’électronique avec 22 campagnes Shopping activées — et 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

Placez les requêtes à côté du titre et de la description qu’elles ont déclenchés. Le décalage saute aux yeux :

What people actually search
aspirateur sans fil poils d'animauxaspirateur pour poils de chien allergieanimaux aspirateur silencieuxmeilleur aspirateur poils d'animaux 2026
What the title says
Aspirateur X300 Turbo 2000W — EAN 8595…
Description : « Aspirateur de haute qualité au design moderne et aux accessoires riches. »
The gap: Le titre vend une puissance que personne ne cherche et rate le cas d'usage poils d'animaux que tout le monde cherche. (Exemple illustratif.)

La feuille de route du flux s’écrit toute seule. Et c’est là que l’enrichissement du flux par l’AI cesse d’être un pari aveugle pour devenir une boucle mesurable : réécrivez le titre autour de la demande que vous venez de prouver, puis observez le CTR et le taux de conversion par requête évoluer.

2 · Qui d’autre se trouve sur « votre » requête — et avec quel produit

Une chose que vous ne pouvez pas faire : ajouter des mots clés à exclure par produit. Google ne vous donne aucun levier de ce genre en Shopping ou PMax. Donc quand une paire requête × produit sous-performe, la question n’est pas « comment l’exclure » — c’est « pourquoi sous-performe-t-elle ».

Prenez la requête et scrapez la page de résultats en direct pour celle-ci. Concrètement : DataForSEO, endpoint serp/google/organic/live/advanced — un POST avec le texte de la requête et le location_code de votre marché, et vous récupérez toute la page de résultats en JSON structuré : annonces payantes, blocs shopping avec noms de marchands et prix, organique en dessous. À ~0,0035 $ par requête, vérifier 200 requêtes coûte environ 0,70 $.

Un constat typique : votre sac de couchage de 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 votre prix. Votre produit n’est pas mauvais ; il est surclassé sur le prix dans cette enchère précise.

Vous avez maintenant de vraies options : repositionner le prix ; pousser le différenciateur dans le titre (« garnissage duvet, confort −15 °C ») ; déplacer le produit vers une campagne dont les enchères correspondent à sa réalité de marge ; ou accepter la requête comme étant en haut de l’entonnoir et la juger 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 appartiennent à des groupes fourre-tout avec des objectifs prudents. Ce rapport est la base de preuves pour la segmentation shopping — pas une intuition.

4 · Un bilan de santé pour PMax

PMax ne vous 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 vous sur la surface search — par produit.

Regardez-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 vous téléchargez, ce que vous fixez du regard, et le vrai chiffre qui revient.

Les données proviennent d’un second compte : un autre e-shop tchèque de taille moyenne (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 exécuté les agrégations ci-dessous. Une réserve d’abord : ce rapport brut vous donne le groupe d’annonces / groupe de produits sous lequel la requête a été diffusée, pas le produit individuel. C’est précisément la lacune 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 d’e-shop tchèque de taille moyenne, ~22,6 M de lignes, données extraites en avril 2026.

Étape 1 · Extraire le rapport brut et mesurer le tas

Ce que vous faites : exportez le rapport de requêtes Shopping via l’API Google Ads (search_term_view) dans une table locale — SQLite ou BigQuery, n’importe quoi sur quoi vous pouvez lancer un GROUP BY. Pourquoi en premier : avant de joindre quoi que ce soit, vous devez sentir à quel point le tas brut est gros et bruyant. Ce seul fait recalibre toutes les attentes qui suivent.

Lancez un simple COUNT(*) et quelques SUM, et voici ce qui tombe :

Le tas brut — un COUNT, 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×) 2,57 M / 17,4 M CZK

Ce que vous obtenez : 22,6 millions de lignes, 5,4 millions de requêtes uniques. Aucun humain ne lit ça. Le seul rôle de ce chiffre, c’est de vous indiquer le prochain mouvement — agréger ce tas selon la dimension qui paie les factures — et de vous avertir que tout tri manuel ligne par ligne est sans espoir.

Étape 2 · Jetez-en 96 % avant d’analyser quoi que ce soit

Ce que vous faites : comptez les lignes à zéro clic, puis filtrez-les. Pourquoi : le rapport de requêtes Shopping enregistre chaque requête pour laquelle votre annonce s’est affichée, dont la plupart sans aucun clic. Ces lignes purement à impressions ne peuvent ni vous coûter ni convertir — c’est du bruit qui rend la table effrayante.

Situation : 22,6 M de lignes, vous ne savez pas par où commencer. Action : WHERE clicks > 0. Résultat : la table se réduit à 738 444 lignes — une taille exploitable.

Le déluge d'impressions

  • Lignes à zéro clic (impressions pures) 21 902 272 — 96,7 %
  • Lignes ayant coûté ne serait-ce qu'une couronne 738 444 — 3,3 %

Ce que vous obtenez : 96,7 % du chiffre effrayant n’a jamais été autre chose que du bruit. Vous travaillez désormais une table de 738 K lignes, pas de 22,6 M — et chaque agrégation ci-dessous tourne sur la partie qui dépense réellement de l’argent.

Étape 3 · Posez la seule question qui recadre le compte

Ce que vous faites : sur les lignes cliquées, répartissez les dépenses entre « a converti au moins une fois » et « n’a jamais converti », et totalisez le coût de chacune. Pourquoi : 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 ». C’est le résultat intermédiaire phare — calculez-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 2,20 M CZK (~88 k€)
  • Parmi les lignes cliquées seules, part sans conversion 92,3 %

Ce que vous obtenez : 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 vous ne pouviez le voir que parce que vous avez regroupé la requête sur ce contre quoi elle a été vendue.

Étape 4 · Vérifiez si le gaspillage vient de quelques coupables ou de toute la foule

Ce que vous faites : triez les lignes cliquées par coût, prenez le top 1 % et le top 10 %, et voyez quelle part des dépenses totales elles détiennent. Pourquoi : cela décide de votre tactique. Si une poignée de termes brûle le budget, vous les mettez en pause et c’est réglé. Si le gaspillage est diffus, mettre des termes en pause est inutile — il vous 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

Ce que vous obtenez : le poids mort est longue traîne, pas quelques coupables — 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. C’est la raison appuyée par les données de corriger la structure (quels produits dans quelle campagne avec quel objectif) plutôt que de courir après des requêtes individuelles — et un rappel que Google ne vous laisse de toute façon même pas ajouter un mot clé à exclure par produit.

Étape 5 · Découvrez pourquoi la longue traîne fuit : une requête, plusieurs produits

Ce que vous faites : pour chaque requête de recherche, comptez sous combien de groupes de produits distincts elle a été diffusée. Pourquoi : cela explique mécaniquement le gaspillage. Shopping fait correspondre une requête aux signaux de tout votre flux, pas à la pertinence d’un seul produit — donc une seule requête fuit à travers des coins sans rapport de votre catalogue, et vous payez pour chaque raté.

Situation : « collier anti-aboiement » continue de brûler du budget. Action : COUNT(DISTINCT ad_group) pour ce terme. Résultat : il a été diffusé sous 139 groupes d’annonces / de produits différents pour 976 CZK et ~0 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 / 976 CZK / ~0

Ce que vous obtenez : près de la moitié de vos 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 la chose exacte que vous pouvez enfin voir une fois que chaque clic porte son ID produit.

Étape 6 · Examinez à l’œil nu les pires décalages — ils sont absurdes

Ce que vous faites : sortez les lignes au coût le plus élevé qui n’ont jamais converti et lisez la requête à côté du groupe de produits contre lequel elle a été vendue. Pourquoi : les chiffres agrégés convainquent votre tableur ; ces trois lignes convainquent votre patron. Elles sont le visage lisible par un humain de l’étape 5.

Paires requête × groupe de produits sans conversion au coût le plus élevé (traduites et anonymisées ; illustratives des vraies lignes).
Requête de rechercheDiffusée sous le groupe de produitsClicsCoûtConv.
collier de dressage pour chienSacs à main97270 CZK0
collier anti-aboiementProduits pour bébé76239 CZK0
lego technicÉclairage70169 CZK0

Une requête « collier de dressage pour chien » payée sous votre 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 vous a facturé. Avec requête × produit, vous voyez cela d’un coup d’œil ; avec le rapport standard de Google, jamais. (Exemple illustratif — catégories traduites et anonymisées.)

Étape 7 · Maintenant le gain : les 0,25 % qui paient tout le compte

Ce que vous faites : inversez l’étape 3 — isolez uniquement les lignes qui ont converti et totalisez leur coût et leur chiffre d’affaires. Pourquoi : c’est la raison pour laquelle tout cet exercice compte. Une fois que vous pouvez séparer les gagnants du poids mort, vous protégez les gagnants et affamez 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é 372 k CZK (~14,9 k€)
  • Ce qu'elles ont rapporté 17,4 M CZK (~697 k€)
  • ROAS sur cette tranche 46,8×

Ce que vous obtenez : 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 cela n’est possible tant que chaque ligne ne porte pas le produit contre lequel elle a été vendue. C’est ce que vous achète l’UTM à un paramètre du début de cet article.

The part you can steal

Le modèle + les trois pièges

{lpurl}?utm_content={product_id}
  1. Ne mettez pas de paramètre personnalisé dans utm_campaign. Google Ads assainit les valeurs des paramètres personnalisés — vos noms de campagne sont réécrits et la continuité historique de GA4 se brise. N’envoyez que utm_content ; l’auto-tagging gère le reste.
  2. N’appliquez qu’aux campagnes Shopping + PMax ACTIVÉES. Le Search n’en a pas besoin ; les campagnes en pause ne font que polluer votre historique des modifications.
  3. Piège d’API : déploiement programmatique ? Les versions récentes de l’API Google Ads ont supprimé client.get_type(“FieldMask”) — importez field_mask_pb2.FieldMask à la place.

FAQ

Est-ce que ça marche pour Performance Max ?

Oui, pour la surface Search/Shopping. Les clics Display, YouTube et Gmail portent l’ID produit mais pas de requête — attendez-vous à 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/campagne ; vous n’ajoutez que le contenu d’annonce. Ce qui casserait tout, c’est un paramètre personnalisé dans utm_campaign — ne faites pas ça.

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 — vous lisez des tendances, pas un audit au centime.

Puis-je 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 — Bing, Sklik ?

Oui, il 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.

Tout l'intérêt de la démarche

Vous voulez ce niveau de visibilité dans votre compte ?

Un e-mail. Je vous dis honnêtement si ça vaut le coup pour votre configuration.

Contact →