Ik heb net een Google Ads-audit afgerond op een Nederlands e-commerce account met zevenstellige omzet in technische producten, het soort catalogus waarbij Shopping vrijwel alle groei levert, de marges dun zijn en elk procentpunt aan verspilling zich opstapelt. Het eerste wat ik bij elke audit controleer, is waar het geld naartoe gaat. De grootste kostenpost was geen categorie, campagne of product. Hij heette “Unknown.” Bijna de helft van het budget.
Dat is de audit in één zin. Maar het gaat eigenlijk niet om Unknown. Het gaat om wat er gebeurt met een Shopping-account wanneer je de feed behandelt als een statische export in plaats van een strategiedocument dat dagelijks meebeweegt met je data. Ik zie hetzelfde anti-patroon terugkomen bij vrijwel ieder account boven zo'n €20k per maand dat ik onder ogen krijg. Hieronder volgt de volledige audit, in algemene vorm.
1 · Het “Unknown”-probleem
In de Google Ads-interface kun je de spend opsplitsen naar Google Product Category. Als zo'n 50% van de spend in een rij staat met het label “Unknown” of “Onbekend,” is er meestal een van deze drie dingen aan de hand:
- De feed heeft geen
google_product_categorygemapt, of het is alleen op het hoogste niveau ingesteld. - Het veld
product_typeontbreekt of is hardcoded naar één enkele waarde voor de hele catalogus. - De
custom_label_*-velden (vrije velden waarmee je producten zelf kunt indelen, bijvoorbeeld op marge of voorraad) zijn leeg, waardoor Google de inventaris helemaal niet kan indelen.
Het gevolg: Google heeft geen idee wat je producten zijn. Bidding, zoekwoordmatching en doelgroeptargeting werken allemaal zonder categoriecontext. Elke euro in “Unknown” is in feite een gok, en bij dit account kostte die gok €23.800 per maand.
De oplossing is mechanisch (koppel de taxonomie van Google aan je CMS-categorieën, vul product_type vanuit je echte categorieboom, vul de custom_label_*-velden). De les is structureel: de feed is de strategie. Niet de campagne. Niet het bod. Niet de asset group. De feed.
Die twee manieren van kijken naast elkaar:
| Feed als statische export | Feed als strategiedocument | |
|---|---|---|
| Wie bepaalt de campagne-indeling | De specialist, handmatig in de interface | Labels die elke nacht uit je eigen data worden berekend |
| Hoe vaak de indeling verandert | Bij de lancering, daarna zelden | Elke nacht, automatisch |
| Waar de strategie leeft | In campagne-instellingen die niemand kan teruglezen | In feedlabels die iedereen kan zien |
| Als een product zich anders gaat gedragen | Er gebeurt niets, tot iemand het opmerkt | Het product verhuist zelf naar de juiste campagne |
| Overdraagbaarheid | Zit in het hoofd van de beheerder | De architectuur legt zichzelf uit |
2 · Het prestatiepatroon over 6 maanden
Nadat ik de data had gesegmenteerd op feedgezondheid, heb ik de totale kosten tegen de ROAS (return on ad spend: omzet per euro advertentiebudget) uitgezet over de afgelopen zes maanden. Drie dingen vielen op:
- Stabiele ROAS tussen 1,9 en 2,2. Geen grote schokken, geen algoritmische verrassingen. Niet slecht, niet uitzonderlijk. Het cijfer dat je krijgt wanneer niets kapot is, maar ook niemand iets actief verbetert.
- Dip naar zo'n 1,6 in december bij de grootste campagnes, ondanks hogere spend dan in november. Klassieke seizoensgebonden CPC-inflatie die een catalogus met lage marges hard raakt.
- De grootste afzonderlijke campagne was een “Marge 0-10%”-bucket die €18-24k per maand opslokte. Bij een SKU met 0-10% marge is ROAS 2,0 nauwelijks break-even. Elk procentpunt verspilling weegt hier extra zwaar.
Het verhaal tot nu toe: een stabiel maar ongedifferentieerd account, opgegeten door een campagne met lage marge die zich geen ongedifferentieerde aanpak kan veroorloven.
3 · De DSA-valkuil
Het account draaide met slechts één Dynamic Search Ads-campagne (DSA: Google kiest daarbij zelf zoektermen en landingspagina's op basis van je website), die twee taken tegelijk moest uitvoeren: nieuwe long-tail zoektermen ontdekken en converteren op de zoektermen die hij al had geleerd. Met Maximize Conversion Value (Target ROAS) erbovenop werken die twee taken elkaar actief tegen. De bidder beloont voorspelbare converteerders en laat discovery uithongeren; de discovery-kant krijgt nooit de tijd om te leren.
De cijfers uit de audittabel vertelden hetzelfde verhaal. Specifieke DSA-targets zoals Categorie = gereedschap leverden een ROAS van 3,38 op. Het catch-all target Alle webpagina’s haalde daar maar een fractie van. DSA had duidelijk zijn discovery-taak goed gedaan. Alleen werden de winnaars nooit doorgeschoven.
De oplossing bestaat uit twee campagnes waar er eerst één was:
- DSA Explorer. Breed, lager budget, geen agressieve Target ROAS. Zijn taak is het vinden van nieuwe zoektermen. Niet afknijpen.
- Search Converter. Exact en phrase match op de categorieën waarvan DSA de waarde al heeft bewezen. Eigen budget, eigen biedstrategie, eigen negatieven. De gemigreerde categorie en de best converterende URL's belanden op de uitsluitingslijst van DSA, zodat de twee campagnes elkaar niet langer kannibaliseren.
Bij accounts die zwaar op DSA leunen is deze splitsing meestal de impactvolste wijziging, en levert op zichzelf vaak al een efficiëntiewinst van 10-20% op.
4 · De Hybrid Matrix
Zodra de feed gezond is en DSA is opgesplitst, wordt de eigenlijke architectuur vanzelf duidelijk. Het is geen waterval. Het is een matrix.
Drie campagnefamilies, elk aangestuurd door labels uit de feed:
Search (geautomatiseerd via de API). Sniper (exact match op high-intent zoektermen geïdentificeerd via Google Search Console + Semrush), Brand Protection (concurrenten blokkeren op je merknaam), DSA Explorer (long-tail vangnet met laag budget).
PMax (Performance Max, de belangrijkste winstbron). Hero (top 5% bestsellers, geen tROAS, marktaandeel maximaliseren), Profit (hoge marge + Closers, strikte tROAS), Volume (lage marge + Openers, lagere ROAS accepteren omdat ze de Profit-campagne ondersteunen).
Standard Shopping (de reparatiewerkplaats). Zombies (0 impressies in 30 dagen, lage handmatige CPC om het algoritme te voeden), Overstock Dump (hoge voorraad, agressieve biedingen om magazijnkapitaal vrij te maken), Bleeders (kosten > €20 met €0 winst, volledig uitgesloten).
Het geheel wordt aangestuurd door feedlabels. PMax bepaalt niet wat een “Hero” is. De feed doet dat. Dat werkt meedogenloos consequent: zodra een SKU zich niet meer als Hero gedraagt, verliest hij het label en valt hij automatisch uit de Hero-campagne. Prestatieonderhoud gebeurt in je datapipeline, niet in de Google Ads-interface.
5 · Openers, Closers, Assisters
De meest ongemakkelijke bevinding kwam uit BigQuery, niet uit Google Ads. Als je de kostendata van Ads koppelt aan ruwe GA4-eventdata, kun je per product het verschil berekenen tussen “dit product is aangeklikt” en “dit product is gekocht.”
Drie profielen komen naar voren:
- Closers. Hoge directe verkopen, lage assisted sales. Ze doen precies wat de cijfers beloven. Veilig om te optimaliseren op ROAS of POAS (Profit On Ad Spend: dezelfde som, maar dan met winst in plaats van omzet). Veilig om op te schalen of stop te zetten op basis van diezelfde metric.
- Openers / Assisters. Hoge assisted sales, lage directe verkopen. Mensen klikken hierop (vaak omdat ze goedkoop of populair zijn) en kopen vervolgens iets anders. Nooit stopzetten op basis van lage ROAS. Ze vullen winkelmandjes. Optimaliseer ze op CPA, of accepteer bewust een lagere ROAS.
- Traffic Wasters. Veel sessies, geen verkopen (direct of assisted). De bloeders. Wegsnijden.
Zo'n een op de vijf SKU's in de audit was een Opener met een ROAS die op zichzelf beroerd oogde. Stopzetten op basis van ROAS zou de rest van de catalogus onderuit hebben gehaald. Dit is in mijn ervaring een van de duurste fouten die e-commerce teams in Google Ads maken, en je ziet hem niet in de Google Ads-interface. Alleen als je verder kijkt dan die interface, naar ruwe GA4-data of BigQuery, kom je hier ooit achter.
6 · De datapipeline
De architectuur werkt alleen als je de feed elke nacht herbouwt vanuit de data, in plaats van hem handmatig samen te stellen. Het patroon dat steeds terugkomt:
- 03:00 · BigQuery-refresh. Kostendata van Google Ads, ruwe GA4-events, marge-/voorraad-/retourdata uit het CMS inladen. Koppelen op
item_id. - 03:30 · 5 custom labels berekenen. Margebucket, levenscyclus (Zombie/Bleeder/Winner/Kickstart), attributierol (Opener/Closer/Traffic), POAS-bucket, voorraadstatus.
- 04:00 · Doorzetten naar een Google Sheet. Die sheet is gekoppeld aan Merchant Center als Supplemental Feed, een aanvullende feed die extra velden toevoegt aan bestaande producten.
- 06:00 · Producten verplaatsen zichzelf. Een SKU die vorige week nog een Zombie was (Standard Shopping, lage handmatige CPC) en net 30 conversies binnenkreeg, wordt vandaag automatisch een Winner, krijgt het Hero-label en verhuist naar PMax zonder tussenkomst van een mens.
In de Nederlandse praktijk is stap 1 vaak de moeilijkste. Omzetdata doorgeven lukt bijna elk webshopplatform wel, maar marge per SKU zit bij veel Nederlandse webshops in een apart inkoopsysteem of in een spreadsheet van de inkoper, niet in een veld dat je 's nachts kunt uitlezen. Zolang dat veld ontbreekt, werkt de helft van de labels niet. Behandel die dataontsluiting dus als eerste projectfase, niet als detail achteraf.
Zodra dat draait, wordt de Google Ads-interface vooral een monitoringtool. De strategie zit stroomopwaarts, in BigQuery en de Sheet. Dit maakt het account ook overdraagbaar: geef het morgen aan een andere specialist en de architectuur legt zichzelf uit, omdat de labels zichtbaar zijn in de feed.
7 · De geavanceerde stap: waardecorrectie
Zodra de labels stabiel zijn, is de volgende laag het corrigeren van de conversiewaarden die je naar Google stuurt. Als BigQuery laat zien dat Product A zo'n €100 aan indirecte (assisted) omzet oplevert voor elke €10 directe omzet, kun je een synthetische conversiewaarde terugsturen naar Google Ads via Offline Conversion Imports of een Value Rule. De bidder leert dat Product A ondergewaardeerd werd en geeft het niet langer te weinig budget.
Dit is de geavanceerde versie van de Opener/Closer-fix. De meeste accounts komen hier nooit aan toe omdat de pipeline er nog niet is. Maar zodra de pipeline er staat, kan waardecorrectie het verschil maken tussen een stabiele ROAS van 2,0 en een stabiele ROAS van 2,6, zonder een euro extra adspend.
8 · Voor wie is dit interessant, en wat is een realistische eerste stap?
Moet je hier iets mee? Mijn inschatting per situatie:
- Nu interessant: webshops met serieuze Shopping-spend (dit account zit boven de €20k per maand, maar het patroon loont al veel eerder), honderden of duizenden SKU's, en marges die per product flink verschillen.
- Nog niet: een webshop met enkele tientallen producten en een bescheiden budget. Daar wint een schone feed met correcte categorieën plus een eenvoudige campagnestructuur het van elke pipeline. Bouw geen nachtelijke BigQuery-machine voor een catalogus die je in een middag handmatig kunt labelen.
- Eerst iets anders: als je conversietracking niet klopt of je marge per product nergens is vastgelegd, begin daar. Elke laag hierboven staat of valt met die twee dingen.
De realistische eerste stap kost een kwartier: open Google Ads, segmenteer je Shopping-spend op productcategorie en kijk hoeveel procent er in “Unknown” staat. Of stel die ene vraag aan je bureau. Het antwoord vertelt je direct of je feed een strategiedocument is of een vergeten export.
Drie regels die ik iedereen zou meegeven die een Shopping-account met een zescijferige omzet runt
- Behandel de feed als code. Hij verdient versiebeheer, tests en een nachtelijke rebuild-pipeline. Als je je feed niet elke nacht herschrijft met labels die je afleidt uit je eigen data, laat je een groot deel van wat Google's algoritme kan ongebruikt.
- Stop niet enkel op basis van ROAS. Check altijd de assist-kolom. De reflex om een “product met 0% ROAS” te pauzeren, kan je 20% van je resultaten elders kosten als dat product achteraf een Opener blijkt te zijn.
- Splits discovery van conversie. Elk campagnetype dat Google je verkoopt als “alles-in-één” (DSA, brede PMax, Smart Shopping) doet twee dingen tegelijk. Jouw taak is om discovery hongerig te houden en conversie strikt te sturen, niet om die twee te vermengen.
Het moeilijke deel van een Google Ads-audit is niet het vinden van de verspilling. Die verspilling ligt bijna altijd voor het oprapen onder een label als “Unknown.” Het moeilijke deel is het herbouwen van de datapipeline zodat wat je vandaag oplost, morgen ook opgelost blijft, terwijl de meeste concurrenten terugzakken in dezelfde valkuil.
