Kort gezegd: Shopping- en PMax-rapporten tonen de zoekopdracht maar verbergen het product. Voeg één URL-parameter toe, {lpurl}?utm_content={product_id}, en binnen een week levert GA4 je het afgeschafte zoekopdracht × product-rapport door sessionManualAdContent te koppelen aan sessionGoogleAdsQuery. Op een echt account liet die weergave zien dat 85 % van de uitgaven naar combinaties ging die nooit converteerden. Slechts 0,25 % van de paren converteerde, maar die kleine groep draaide op 46,8× ROAS en bracht de hele omzet binnen.
Wil je alleen de gedestilleerde methode?
Download de complete AI-instructies — één bestand dat je in Claude of een andere capabele coding agent plakt, en hij trekt het zoekopdracht × product-rapport uit je eigen account. Laat je e-mail achter en het bestand is van jou — of lees gewoon verder.
Eén bestand, één lijst. Ik schrijf alleen als er iets te lezen valt.
Een klant stelde me ooit een vraag waarop je met één klik antwoord zou moeten kunnen krijgen. Iemand zocht op “steelstofzuiger onder 200”, klikte op de Shopping-advertentie, en het account betaalde ervoor. Op welk van de 5.000 producten in de feed landde die klik? Ik opende het zoekopdrachtenrapport, daarna het productrapport, en ik kon ze op geen enkele manier aan elkaar koppelen. Dat kan nog steeds niet. Google toont je de zoekopdracht, Google toont je het product, maar nooit allebei tegelijk.
Jaren geleden gaf de oude AdWords API je precies deze koppeling. Toen verdween die stilletjes, en geen instelling, geen rapport, geen API-veld brengt die terug. Voor een webshop is dat gat niet cosmetisch. Het verband tussen zoekopdracht en product is waar de echte optimalisatie zit: het laat je zien of je titels aansluiten op echte vraag, welke producten rommeltraffic aantrekken en waarom een product klikken krijgt maar nooit converteert.
Na twaalf jaar werken met de Google Ads API weet ik dat een rapport dat Google afschaft, niet terugkomt. Daarom heb ik het zelf nagebouwd. De oplossing is bijna gênant eenvoudig: één URL-parameter. Binnen een week levert GA4 je voor elke betaalde klik een zoekopdracht × product-paar, met sessies, conversies en omzet erbij. Het opzetten kost een paar minuten; de rest van dit artikel gaat over wat je doet met wat terugkomt.
De oplossing: één parameter, twee GA4-dimensies
Voeg een trackingsjabloon toe
Stel {lpurl}?utm_content={product_id} in als trackingsjabloon voor je Shopping- en PMax-campagnes. De ValueTrack-variabele {product_id} stuurt de Merchant Center product-ID mee met elke klik.
GA4 bewaart het product
De UTM landt in de dimensie Session manual ad content (sessionManualAdContent).
GA4 kent de zoekopdracht al
Auto-tagging (gclid) vult in diezelfde sessie de dimensie sessionGoogleAdsQuery in.
Koppel de twee dimensies
Elke betaalde klik wordt een zoekopdracht × product-paar, met sessies, conversiepercentage en omzet erbij.
Auto-tagging en de handmatige UTM bijten elkaar niet. De gclid blijft bron, medium en campagne afhandelen; jouw UTM bevat alleen de product-ID.
Weet wat je krijgt (en wat niet)
- Alleen zoekopdrachten met een klik. Deze dataset begint bij de klik. Zoekopdrachten waarvoor je advertentie verscheen maar niemand klikte, bereiken GA4 nooit. Analyse op vertoningsniveau blijft in Googles standaardrapport, zonder producten.
- Ongeveer 20 % van de klikken matcht niet. De ontbrekende koppelingen komen door sessies zonder toestemming, PMax-oppervlakken zonder zoekopdracht (Display, YouTube, Gmail) en klikken waarbij de Analytics-tag nooit werd geactiveerd.
- Eén product per sessie. De sessie bevat de ID van het product waarop de gebruiker klikte, ook als die daarna nog tien andere bekijkt.
Haal de complete AI-instructies voor deze methode
De hele methode, herschreven als een brief die je zo in Claude of een andere capabele coding agent plakt. Hij zet het trackingsjabloon, trekt het zoekopdracht × product-rapport uit GA4 en draait de aggregaties op jouw account. Het sjabloon en zijn drie valkuilen zitten er ook in. Laat je e-mail achter en het bestand is van jou.
Eén bestand, één lijst. Ik schrijf alleen als er iets te lezen valt.
Het rapport uit GA4 trekken
Open Verkennen in de GA4-interface en maak een vrije-vormtabel. Gebruik als dimensies Session manual ad content en Session Google Ads query, en als statistieken sessies, belangrijke gebeurtenissen (voorheen conversies) en aankoopomzet. Stel het filter voor sessiebron/-medium in op google / cpc.
Voor serieus werk gebruik je de Data API, want dit rapport hoort in een dashboard of een BigQuery-join, niet in een browsertabblad:
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"),
)),
)
Koppel sessionManualAdContent aan je productfeed (id → titel, prijs, categorie) en het rapport is compleet. Zoekopdracht, product, titel, conversies en omzet in één tabel.
Geverifieerd, geen theorie
We rolden dit uit op het live account van een Tsjechische elektronicaretailer met 22 ingeschakelde Shopping-campagnes. Zeven dagen later checkte ik GA4:
GA4, 7 dagen na uitrol
- Rijen google/cpc-traffic 9.753
- Bevatte de product-ID (utm_content) 96 %
- Bevatte de zoekopdracht (sessionGoogleAdsQuery) 81 %
- Bevatte beide en leverde zo een werkend zoekopdracht × product-rapport 78 %
Nu het leuke deel: wat de paren je vertellen
1 · Het titelgat
Zet de zoekopdrachten naast de titel en beschrijving die ze triggerden. De mismatch springt eruit:
De roadmap voor de feed schrijft zichzelf. Ik werk al twee jaar aan een AI-tool voor feedverrijking. Eerlijk gezegd is de zwakke plek van die hele categorie dat de impact moeilijk te bewijzen is. Dit rapport lost dat op. Herschrijf de titel zodat hij past bij de vraag die je net hebt aangetoond, en volg vervolgens hoe de CTR en het conversiepercentage per zoekopdracht veranderen. AI-feedverrijking is dan niet meer iets wat je op goed vertrouwen aanneemt, maar een meetbare cyclus.
2 · Wie er nog meer voor “jouw” zoekopdracht verschijnt, en met welk product
Eén ding kun je niet: uitgesloten zoekwoorden per product toevoegen. Google biedt die mogelijkheid niet in Shopping of PMax. Als een zoekopdracht × product-paar onderpresteert, heeft vragen hoe je die combinatie uitsluit dus geen zin. De zinvolle vraag is waarom die combinatie onderpresteert.
Neem de zoekopdracht en scrape de bijbehorende live-resultatenpagina. Hiervoor gebruik ik het endpoint serp/google/organic/live/advanced van DataForSEO. Eén POST met de tekst van de zoekopdracht en de location_code van je markt geeft de hele resultatenpagina terug als gestructureerde JSON: betaalde advertenties, shoppingblokken met merchantnamen en prijzen, en organische resultaten eronder. DataForSEO rekent per SERP, en één SERP dekt tot 10 resultaten. Tegen de huidige basisprijs van zo’n $ 0,002 per SERP kost het checken van 200 zoekopdrachten met standaarddiepte ongeveer $ 0,40, exclusief eventuele kosten voor geavanceerde parameters.
Dit is een typische bevinding: een slaapzak uit het middensegment trekt klikken voor een generieke zoekopdracht, terwijl bij diezelfde zoekopdracht drie budgetmerken uit dezelfde categorie voor de helft van jouw prijs verschijnen. Het product is prima. Met die prijs verlies je deze specifieke veiling.
Nu heb je echte opties. Pas de prijs aan. Zet het onderscheidende kenmerk in de titel (“donsvulling, −15 °C comfort”). Verplaats het product naar een campagne met een biedstrategie die bij de werkelijke marge past. Of accepteer de zoekopdracht als upper-funnel en beoordeel die op de bijdrage aan latere conversies in plaats van alleen op de laatste klik.
3 · Structuur- en biedbeslissingen
Producten die zoekopdrachten met hoge intentie aantrekken, verdienen hun eigen componentengroepen en budgetten. Producten die alleen generieke traffic verzamelen, horen in restgroepen met conservatieve targets. Dit rapport geeft shopping-segmentatie een feitelijke basis in plaats van onderbuikgevoel.
4 · Een gezondheidscheck voor PMax
PMax vertelt je vrijwel niets over zoeken. Dichter bij een audit van wat PMax daadwerkelijk voor je inkoopt op het zoekoppervlak, per product, kom je niet.
Kijk hoe ik één echte export doorloop, stap voor stap
Alles hierboven is het waarom. Nu het hoe: wat je downloadt, waar je naar kijkt en het echte getal dat terugkomt.
De data in deze sectie komen uit een tweede account, een middelgrote Tsjechische webshop in het koopjessegment. De webshop is niet de elektronicaretailer uit het GA4-blok hierboven. Ik heb deze webshop gekozen omdat het assortiment breed genoeg is om elk patroon op volle schaal zichtbaar te maken. Ik trok het ruwe Shopping-zoekopdrachtenrapport via de Google Ads API naar een lokale SQLite-tabel en draaide de aggregaties hieronder. Eerst één kanttekening. Het ruwe rapport geeft je de advertentiegroep of productgroep waaraan de zoekopdracht werd gekoppeld, niet het individuele product. Dat is precies het gat dat de UTM-truc dicht. Maar zelfs op productgroepniveau zijn de onderstaande cijfers duidelijk genoeg om te laten zien waar het budget daadwerkelijk naartoe gaat.
Bron voor elk getal in deze sectie: Google Ads Shopping-zoekopdrachtenrapport, één middelgroot Tsjechisch webshopaccount, ~22,6M regels, gegevens opgehaald in april 2026. Bedragen omgerekend uit CZK tegen een koers van ~25 CZK/EUR.
Stap 1 · Trek het ruwe rapport en meet de berg
Exporteer het Shopping-zoekopdrachtenrapport via de Google Ads API (search_term_view) naar een omgeving waarin je een GROUP BY kunt uitvoeren, zoals SQLite of BigQuery. Voordat je ook maar iets koppelt of filtert, draai je een kale COUNT(*) en een paar SUM’s. Je moet eerst zien hoe groot de onbewerkte dataset is en hoeveel ruis die bevat, want dat ene feit stelt alle volgende verwachtingen bij:
De ruwe berg, één COUNT en drie SUM's
- Rapportregels (zoekopdracht × productgroep) 22.640.716
- Unieke zoekopdrachten 5.370.131
- Productgroepen waaraan de zoekopdrachten werden gekoppeld 10.393
- Uitgaven / omzet (blended ROAS 6,8×) € 103k / € 697k
22,6 miljoen regels, 5,4 miljoen unieke zoekopdrachten. Geen mens leest al die regels. Die twee aantallen hebben precies één doel: afrekenen met het idee dat je alle regels handmatig één voor één kunt beoordelen. De enige werkbare aanpak is de berg te aggregeren op de dimensie die de rekeningen betaalt.
Stap 2 · Gooi er 96 % van weg vóór je iets analyseert
Tel de regels met nul klikken en filter ze eruit. Het Shopping-zoekopdrachtenrapport registreert elke zoekopdracht waarvoor je advertentie verscheen, maar bij de meeste daarvan klikte niemand op de advertentie. Regels met alleen vertoningen kunnen je niets kosten en kunnen niet converteren. Die vormen ruis die de tabel angstaanjagend groot laat lijken.
WHERE clicks > 0 reduceert de tabel tot 738.444 regels, een formaat waar je echt mee kunt werken.
De vertoningenvloed
- Regels met nul klikken (pure vertoningen) 21.902.272 (96,7 %)
- Regels die ooit geld kostten 738.444 (3,3 %)
96,7 % van het angstaanjagende getal was nooit iets anders dan ruis. Filter op regels met klikken voordat je iets analyseert, en elke aggregatie hieronder draait op de regels die daadwerkelijk geld kosten.
Stap 3 · Stel de ene vraag die je blik op het account omgooit
Verdeel de regels met klikken in twee groepen: “minstens één keer geconverteerd” en “nooit geconverteerd”. Bereken vervolgens de totale kosten per groep. Die verdeling verandert “het account is prima, de ROAS is 6,8” in “het grootste deel van het budget doet niets”. Bereken dit voordat je ook maar één optimalisatie bedenkt:
De kosten van verkeer zonder conversies
- Rapportregels die nul keer converteerden 99,75 %
- Aandeel van de totale uitgaven dat naar die regels ging 85,5 %
- Uitgaven die geen conversie opleverden € 88k
- Aandeel zonder conversies binnen de regels met klikken 92,3 %
85 % van het budget werd besteed aan combinaties van zoekopdracht en productgroep die geen enkele conversie opleverden.
Dit is geen afrondingsfout die je later wel oplost. Het is het grootste probleem in het account. En je kon het alleen zien omdat je elke zoekopdracht per productgroep hebt samengevat.
Stap 4 · Check of de verspilling een paar schurken is of de hele meute
Sorteer de regels met klikken op kosten, neem de top 1 % en de top 10 %, en meet hun aandeel in de totale uitgaven. Dit bepaalt je tactiek. Als een handjevol zoekopdrachten het budget verbrandt, pauzeer je die en ben je klaar. Als de verspilling breed is verspreid, heeft het geen zin om losse zoekopdrachten te pauzeren en zijn structurele aanpassingen nodig:
Waar de verspilde uitgaven écht zitten
- Top 1 % van de regels met klikken op basis van kosten 10,5 % van uitgaven
- Top 10 % van de regels met klikken op basis van kosten 29,8 % van uitgaven
De verspilling is breed verspreid. De top 1 % van dure regels is goed voor amper een tiende van de uitgaven, dus 20 slechte zoekopdrachten pauzeren verandert niets. In plaats van achter individuele zoekopdrachten aan te jagen, verbeter je de structuur: bepaal welke producten in welke campagne op welk target thuishoren. En onthoud dat Google je sowieso geen uitgesloten zoekwoord per product laat toevoegen.
Stap 5 · Ontdek waarom de long tail lekt: één zoekopdracht, veel producten
Tel voor elke zoekopdracht aan hoeveel verschillende productgroepen die werd gekoppeld. Dit verklaart het mechanisme achter de verspilling. Shopping koppelt een zoekopdracht op basis van signalen uit je hele feed, niet op basis van de relevantie voor één product. Eén zoekopdracht kan zo aan ongerelateerde delen van je assortiment worden gekoppeld, en je betaalt voor elke misser.
Een concreet geval uit het account. De zoekopdracht “anti-blafapparaat” bleef budget verbranden, dus draaide ik er COUNT(DISTINCT ad_group) op. De zoekopdracht was gekoppeld aan 139 verschillende advertentie- en productgroepen, kostte € 39 en leverde vrijwel geen conversies op. De zoekopdracht “lego technic” was gekoppeld aan 300 verschillende advertentie- en productgroepen.
Eén zoekopdracht, verspreid over het assortiment
- Unieke zoekopdrachten gekoppeld aan meer dan één productgroep 46,7 % van 5.370.131
- Hoogste aantal productgroepen waaraan één zoekopdracht werd gekoppeld 6.661
- ‘anti-blafapparaat’ → groepen / kosten / conversies 139 / € 39 / ~0
Bijna de helft van de zoekopdrachten is uitgesmeerd over meerdere productgroepen, en in de extreemste gevallen gaat het om duizenden groepen. Daar komen de kosten van verkeer zonder conversies uit stap 3 vandaan. En dat kun je eindelijk zien zodra elke klik aan een product-ID is gekoppeld.
Stap 6 · Bekijk de ergste mismatches, want ze zijn absurd
Trek de duurste regels die nooit converteerden en lees de zoekopdracht naast de productgroep waarin die werd weergegeven. De totaalcijfers laten zien hoe groot het probleem is. Dit zijn de drie regels die je aan je baas voorlegt:
| Zoekopdracht | Gekoppeld aan productgroep | Klikken | Kosten | Conv. |
|---|---|---|---|---|
| hondentrainingsband | Handtassen | 97 | € 11 | 0 |
| anti-blafapparaat | Babyproducten | 76 | € 9,60 | 0 |
| lego technic | Verlichting | 70 | € 6,80 | 0 |
De zoekopdracht “hondentrainingsband” werd gekoppeld aan de groep Handtassen. De zoekopdracht “anti-blafapparaat” werd gekoppeld aan Babyproducten. De productgroep heeft niets met de zoekopdracht te maken. Google koppelde de zoekopdracht op basis van brede feedsignalen, registreerde de klik en bracht de kosten bij het account in rekening. Met zoekopdracht × product zie je dit in één oogopslag; met het standaardrapport van Google zie je het nooit. (Categorieën vertaald en geanonimiseerd.)
Stap 7 · Nu de beloning: de 0,25 % die het hele account betaalt
Keer stap 3 om. Isoleer alleen de regels die wel converteerden en tel hun kosten en omzet op. Dit is de reden waarom de hele exercitie ertoe doet. Zodra je de winnaars kunt scheiden van de regels die het resultaat belasten, bescherm je de winnaars en draai je voor de rest de geldkraan dicht.
De 0,25 % die het account overeind houdt
- Regels die converteerden (aandeel van alle regels) 57.209 (0,25 %)
- Wat ze kostten € 14,9k
- Wat ze opleverden € 697k
- ROAS van die 0,25 % 46,8×
Een kwart procent van de regels draait op 46,8× ROAS en houdt het account feitelijk overeind. De andere 99,75 % trekt de gecombineerde ROAS omlaag naar 6,8×. Het hele werk draait om drie dingen: die 0,25 % vinden, het bijbehorende budget beschermen en de rest van het account zo herstructureren dat die niet meer om hetzelfde budget concurreert. Dat werkt pas als elke regel vermeldt bij welk product de aangeklikte advertentie hoort. Die product-ID komt uit één bron: de utm_content={product_id} die je aan het begin hebt ingesteld.
Download de complete instructies voor je AI
De hele methode hierboven, herschreven als een brief die je zo in Claude of een andere capabele coding agent plakt. Hij zet het trackingsjabloon, trekt het zoekopdracht × product-rapport uit GA4 en draait de aggregaties op jouw account. Het sjabloon en zijn drie valkuilen zitten er ook in. Laat je e-mail achter en het bestand is van jou.
Eén bestand, één lijst. Ik schrijf alleen als er iets te lezen valt.
FAQ
Werkt dit voor Performance Max?
Ja, voor het zoek- en shoppingoppervlak. Klikken via Display, YouTube en Gmail bevatten wel de product-ID, maar geen zoekopdracht. Reken er daarom op dat die rijen een lege zoekopdrachtdimensie hebben.
Breekt de UTM mijn GA4-attributie?
Nee. Auto-tagging (gclid) blijft bron, medium en campagne afhandelen; je voegt alleen ad content toe. Wat er wél iets kapotmaakt, is een aangepaste parameter in utm_campaign, dus zet daar nooit iets in.
Waarom maar 78 % dekking?
Consent mode, zoekopdrachtloze PMax-oppervlakken en analytics-blockers zorgen voor de ontbrekende 22 %. 78 % is ruim voldoende voor alle genoemde toepassingen, want je zoekt naar patronen in plaats van bedragen tot op de cent te controleren.
Kan ik zoekopdrachten zien waarvoor mijn advertentie verscheen maar niemand klikte?
Nee. Deze dataset begint bij de klik. Analyse op vertoningsniveau blijft in het standaard zoekopdrachtenrapport, zonder producten.
Werkt het patroon ook buiten Google, zeg Bing of Sklik?
Ja. Het patroon werkt op elk platform met een URL-sjabloon, een productmacro en een analytics-dimensie om die op te vangen. De specifieke macro’s verschillen per platform.
Hoe lang duurt het tot ik bruikbare data heb?
Dat hangt af van het volume. Ons account leverde na 7 dagen dataverzameling een bruikbaar rapport op. Een kleiner account kan beter 30 dagen data verzamelen.
CTA: Welke van jouw producten verdienen hun klikken, en welke sturen je alleen een rekening? Voeg de parameter vandaag toe, en over een week weet je het. Of stuur me je account en we lezen het rapport samen.