Als de kosten per aankoop oplopen, gaat het gesprek bijna altijd over het account: biedingen omlaag, zoekwoorden uitsluiten, een nieuwe biedstrategie. Soms klopt dat. Vaak ligt de oorzaak twee stappen eerder. De koper kende je merk niet toen hij begon te zoeken, of hij kende je wel maar vertrouwde de concurrent meer. Dan moet je advertentie in één klik iets goedmaken wat eerder in de reis niet gebeurd is, en dat zie je terug in de CPA.
Concurrentieonderzoek helpt daarbij, als je de vraag goed stelt. De gebruikelijke vraag is wat de concurrent goed doet. Wij stellen een andere: in welke fase verliezen wij van hem? Daarvoor delen we de weg van koper naar klant op in drie fasen en meten we per fase waar het gat zit.
Drie fasen: gezien, geloofd, gekozen
- Gezien. Kent de juiste koper je al voordat hij een aankoop overweegt, en kom je in beeld als hij gaat zoeken?
- Geloofd. Gelooft hij dat jij zijn probleem oplost, op basis van je advertentie, je landingspagina, je reviews en wat een AI-assistent over je zegt?
- Gekozen. Zet die zichtbaarheid en dat vertrouwen zich om in een aankoop of aanvraag, op het moment dat hij jou naast een concurrent legt?
De fasen werken als een keten. Slaat een merk er een over, dan moet de volgende fase dat opvangen. Een webshop die niemand kent, betaalt de onbekendheid terug in een lage klikratio. Een merk met slechte reviews betaalt het terug in een lage conversieratio. Daarom begin je de analyse bij de eerste fase, ook als het probleem zich pas in de laatste laat zien.
| Fase | Signaal in je eigen data | Waar je de concurrent naast legt |
|---|---|---|
| Gezien | Vertoningsaandeel, verlies door budget, groei van zoekopdrachten op je merknaam | Veilinginzichten, zichtbaarheid in Semrush of SimilarWeb, vermeldingen in pers en communities, AI-antwoorden |
| Geloofd | Klikratio bij een goede positie, verlies door rangschikking, bouncepercentage op de landingspagina | Reviewscores, cases, hoe een AI-assistent beide merken beschrijft |
| Gekozen | Conversieratio, CPA, kosten per verkoop | Landingspagina's naast elkaar voor dezelfde zoekterm: prijs, verzendkosten, levertijd, retour |
Gezien en geloofd uit elkaar halen in Google Ads
Voor zoekcampagnes geeft Google Ads drie velden die samen precies optellen tot 100 procent: het vertoningsaandeel, het aandeel dat je verliest door budget en het aandeel dat je verliest door rangschikking. Dat maakt ze bruikbaar om de eerste twee fasen te scheiden. Verlies door budget is een zichtbaarheidsprobleem dat je met geld oplost. Verlies door rangschikking komt uit je bod en je kwaliteit, en kwaliteit bestaat uit verwachte klikratio, relevantie van de advertentie en de ervaring op de landingspagina. Dat is de fase geloofd, gemeten door Google.
Deze query zet de velden per campagne naast elkaar, met de klikken en conversies erbij:
SELECT
campaign.name,
metrics.impressions,
metrics.clicks,
metrics.conversions,
metrics.cost_micros,
metrics.search_impression_share,
metrics.search_budget_lost_impression_share,
metrics.search_rank_lost_impression_share,
metrics.search_top_impression_share,
metrics.search_absolute_top_impression_share
FROM campaign
WHERE campaign.advertising_channel_type = 'SEARCH'
AND segments.date DURING LAST_30_DAYS
AND metrics.impressions > 0
ORDER BY metrics.cost_micros DESCWe hebben hem gedraaid op API-versie 26 tegen een account met een paar actieve zoekcampagnes. Twee dingen vallen dan op. De drie aandelen tellen per campagne inderdaad op tot 1. En sommige waarden komen terug als precies 0,0999: zo meldt Google "minder dan 10 procent". Reken met zo'n waarde niet verder alsof het een meting is, het is een ondergrens.
Zo lees je de uitkomst:
- Hoog verlies door budget, de rest in orde: je wordt te weinig gezien. Meer budget, of het bestaande budget naar de campagnes met de beste marge.
- Hoog verlies door rangschikking en een lage klikratio: je advertentie overtuigt minder dan die van de concurrent. Kijk in de veilinginzichten wie er boven je staat en lees hun advertenties. Een hoger bod betaalt hier het gat in vertrouwen.
- Goed aandeel en een goede klikratio, maar weinig conversies: de koper vertrouwt je genoeg om te klikken en kiest daarna toch de ander. Dat is de fase gekozen, en die zit op de landingspagina en in je aanbod.
De veilinginzichten zelf zijn handwerk. De velden staan in de API-documentatie, maar uitlezen vraagt een aparte toestemming van Google die een gewone ontwikkelaarstoken niet heeft. Exporteer ze uit de interface.
Gekozen: de landingspagina naast die van de concurrent
Voor de laatste fase bestaat geen rapport. Zoek je drie belangrijkste zoektermen, klik op de advertenties van de twee concurrenten die het vaakst boven je staan, en zet de pagina's naast de jouwe. Beoordeel ze op wat een koper op dat moment afweegt: prijs inclusief verzendkosten, levertijd, retourvoorwaarden, reviews op de pagina zelf en hoeveel stappen het kost om te bestellen of een offerte aan te vragen. Doe het op een telefoon, want daar komt het meeste verkeer binnen. Wat je hier vindt, los je zelden op in het account.
AI-antwoorden tellen per merk
Een groeiend deel van de oriëntatie gebeurt in ChatGPT, Gemini en Perplexity. Ook daar gelden de drie fasen: word je genoemd, hoe word je beschreven, en word je aangeraden? Om dat te meten hebben we een klein script gebouwd. Het verzamelt zelf geen antwoorden, het telt ze. Je levert een bestand met antwoorden op vragen zonder merknaam, en een lijst met je eigen merk en je concurrenten.
Per merk telt het drie dingen:
- Genoemd: in hoeveel antwoorden het merk voorkomt.
- Eerst: in hoeveel antwoorden het merk als eerste van de lijst genoemd wordt.
- Aanbevolen: in hoeveel antwoorden het merk in dezelfde zin staat als een aanbeveling, zoals "beste keuze" of "kies voor".
import json
import re
import sys
from collections import defaultdict
# Zinnen waarmee een antwoord een keuze voorlegt. Breid uit met wat je in je eigen antwoorden ziet.
AANBEVELING = re.compile(
r"\b(raad(en)? (ik |we )?\w* ?aan|aanrader|beste keuze|beste optie|kies voor|ga voor"
r"|onze voorkeur|recommend|best choice|best option|go with|top pick)\b",
re.IGNORECASE,
)
def laad_merken(pad):
"""{"Merk": ["alias", ...]} naar één patroon per merk, op woordgrens."""
with open(pad, encoding="utf-8") as f:
merken = json.load(f)
return {
merk: re.compile(r"\b(" + "|".join(re.escape(a) for a in [merk, *aliassen]) + r")\b", re.IGNORECASE)
for merk, aliassen in merken.items()
}
def zinnen(tekst):
return re.split(r"(?<=[.!?])\s+|\n+", tekst)
def tel(pad_antwoorden, patronen):
teller = defaultdict(lambda: {"genoemd": 0, "eerst": 0, "aanbevolen": 0})
totaal = 0
with open(pad_antwoorden, encoding="utf-8") as f:
for regel in f:
if not regel.strip():
continue
antwoord = json.loads(regel)["antwoord"]
totaal += 1
posities = {}
for merk, patroon in patronen.items():
treffer = patroon.search(antwoord)
if not treffer:
continue
posities[merk] = treffer.start()
teller[merk]["genoemd"] += 1
if any(patroon.search(z) and AANBEVELING.search(z) for z in zinnen(antwoord)):
teller[merk]["aanbevolen"] += 1
if posities:
teller[min(posities, key=posities.get)]["eerst"] += 1
return totaal, teller
if __name__ == "__main__":
totaal, teller = tel(sys.argv[1], laad_merken(sys.argv[2]))
print(f"{totaal} antwoorden")
print(f"{'merk':<14}{'genoemd':>9}{'eerst':>8}{'aanbevolen':>12}")
for merk in sorted(teller, key=lambda m: -teller[m]["genoemd"]):
t = teller[merk]
print(f"{merk:<14}" + "".join(f"{t[k] / totaal:>{w}.0%}" for k, w in (("genoemd", 9), ("eerst", 8), ("aanbevolen", 12))))Elke regel in het antwoordenbestand is een JSON-object, en het merkenbestand koppelt elk merk aan zijn schrijfwijzen, zoals de domeinnaam:
{"prompt": "kunstplant die echt lijkt", "antwoord": "Bladwerk en Groenhuys maken allebei realistische planten. Wil je de meest echte look, dan is Bladwerk de beste keuze."}{"Groenhuys": ["groenhuys.nl"], "Bladwerk": [], "Plantica": ["plantica.nl"]}Draaien gaat met python fasen.py antwoorden.jsonl merken.json. Onze test was klein en verzonnen: vijf antwoorden over kunstplanten met drie fictieve merken, waarvan één antwoord geen merk noemt. De uitkomst kwam overeen met wat we per antwoord met de hand telden:
5 antwoorden
merk genoemd eerst aanbevolen
Groenhuys 80% 20% 20%
Plantica 60% 40% 20%
Bladwerk 40% 20% 20%Lees de kolommen als de fasen. Groenhuys wordt het vaakst genoemd, maar staat zelden bovenaan en wordt net zo vaak aangeraden als de anderen. Dat merk heeft geen zichtbaarheidsprobleem, het verliest in de fasen erna. Dat is het soort conclusie waar je naar zoekt: in welke fase het verschil met de concurrent ontstaat.
Een paar dingen om op te letten bij echte antwoorden:
- Toon tel je met de hand. Of een merk positief of negatief beschreven wordt, is met woordenlijsten in het Nederlands niet betrouwbaar te meten. Neem per merk een steekproef van twintig antwoorden en lees ze.
- De aanbevelingszinnen zijn een begin. "Ga voor" vangt ook "ga voor de zekerheid na", en "raad ik voor kantoor Plantica aan" valt buiten het patroon. Lees de treffers na en breid de lijst uit met de zinnen die je in je eigen antwoorden ziet.
- Antwoorden wisselen. Stel elke vraag meerdere keren en leg de datum vast. Antwoorden via de API wijken af van de app met zoekfunctie, kies één route en houd die aan.
- Kies vragen die je klanten echt stellen. Haal ze uit je zoektermenrapport, Search Console en de vragen die bij je klantenservice binnenkomen.
Waar ruimte zit die concurrenten laten liggen
Concurrentieonderzoek laat ook zien waar niemand staat. Vijf plekken waar wij kijken:
- Waar het gesprek over je categorie plaatsvindt. Forums, Facebookgroepen, Reddit, vakbladen. Leg dat naast de kanalen waar je adverteert.
- Benchmarks van het platform. Je contactpersoon bij Google, Microsoft of Meta heeft cijfers over vergelijkbare adverteerders in je categorie. Vraag erom.
- Zelf scrollen en vastleggen. Zoekresultaten, feeds en AI-antwoorden, met schermafbeeldingen en een datum. Tools missen plaatsingen die je met het blote oog wel ziet.
- Wat beursgenoteerde concurrenten aan beleggers vertellen. Jaarverslagen en kwartaalcijfers zeggen soms meer over hun kanaalmix dan welke tool ook.
- AI-antwoorden, elke maand. Een merk dat in je categorie nergens genoemd wordt, ook niet door de concurrent, wijst op een vraag waar nog niemand het antwoord op is.
Een nieuw kanaal toetsen voordat je het voorstelt
Een leeg kanaal is niet automatisch een kans. Voordat we er budget voor vragen, lopen we vijf vragen langs:
- Zit je doelgroep er? Dit weegt het zwaarst. Zonder publiek is de rest niet relevant.
- Past het bij hoe je verkoopt? Kun je het meten, koppelt het met je CRM of je webshop, past de advertentievorm bij je product?
- Waarom is het leeg? Omdat niemand het gevonden heeft, of omdat het bij anderen al eens niet werkte?
- Wat verwacht je dat een klant kost? Leg een hypothese vast en reken een testperiode in voordat je oordeelt.
- Heb je de mensen ervoor? Beeld maken, meting inrichten, iemand die het bijhoudt. Dit scoor je niet mee, het is een ja of een nee.
Bewijzen dat geld in de eerste fasen iets oplevert
Budget voor zichtbaarheid is lastig te verdedigen, want de conversie valt weken later toe aan een ander kanaal. Perfecte attributie is er niet, wel vier aanwijzingen die je samen kunt lezen:
- Direct verkeer en omzet over 60 tot 90 dagen. Pas op: sinds begin oktober komt ook ChatGPT-verkeer als Direct binnen. Hoe je dat terugschat staat in ChatGPT-verkeer staat sinds begin oktober in Direct.
- Zoekopdrachten op je merknaam. In Search Console en in je merkcampagne. Stijgen ze in de weken na een videocampagne, dan heeft die mensen naar je toe gebracht.
- Een regionale controlegroep. Zet de campagne voor zichtbaarheid aan in een deel van de provincies en houd de rest als vergelijking. Het verschil in merkzoekopdrachten en omzet tussen de twee groepen is je effect.
- Vermeldingen in AI-antwoorden. Draai het script hierboven elke maand op dezelfde vragen. Een merk dat vaker genoemd en vaker aangeraden wordt, wint in de fase geloofd.
Wat een advertentie in een AI-antwoord moet doen
Nu er advertenties in en naast AI-antwoorden verschijnen, hangt hun rol af van waar je al staat. De uitkomst van het script bepaalt de opdracht:
| Jouw stand in de antwoorden | Wat de advertentie moet doen |
|---|---|
| Je wordt nooit genoemd | Zichtbaarheid kopen, je bent er anders niet |
| Soms genoemd, zonder concurrent ernaast | Vaker aanwezig zijn, zodat je naam blijft hangen |
| Concurrenten staan vaker bovenaan | De keuze beïnvloeden, op de vervolgvraag waar de koper twijfelt |
| Je staat meestal bovenaan naast concurrenten | Het verschil laten zien, waarom jij en niet de ander |
| Je staat altijd bovenaan, zonder concurrent | Je positie bewaken, of het budget verschuiven naar een categorie waar je wel achterloopt |
Waar je morgen mee begint
- Draai de query en bepaal per campagne of je verliest op budget, op rangschikking of na de klik.
- Leg voor je drie belangrijkste zoektermen je landingspagina naast die van de twee concurrenten die het vaakst boven je staan.
- Stel dertig vragen op die je klanten stellen, verzamel de antwoorden en tel ze met het script.
Dan weet je in welke fase het lekt, en dat bepaalt of het antwoord in het account ligt of ervoor. Werk je met kanaalprioriteit in Google Ads, lees dan ook wat een budgetgrens van 5 procent wel en niet tegenhoudt.