Een grote retailer met winkels in Nederland en België wil vooral één ding van zijn website. Dat bezoekers een afspraak maken in de winkel. Retargeting liep al, maar standaard. Wie de website verliet zonder afspraak, kreeg opnieuw te zien wat diegene al had bekeken. Keek je naar een product, dan kreeg je dat product.

Maar wat iemand bekeek, vertelt niet welke stap diegene verder brengt. Dus bouwden we een model dat per afhaakmoment voorspelt welke vervolgstap het meest kansrijk is, en lieten we die stap de advertentie bepalen. Met hetzelfde budget leverde dat 51% meer winkelafspraken op.

Plan een gesprek


Hand houdt een betaalkaart tegen een pinautomaat op een oranje tafel
+51% Winkelafspraken per maand
-34% Kosten per afspraak
9.676 Persoonlijke advertentievarianten

We noemen de opdrachtgever hier niet bij naam en delen percentages, geen budgetten of absolute aantallen afspraken.

Uitdaging

Wie naar een product keek, zoekt misschien nog steeds dat product. Toch kan een andere boodschap diegene sneller naar een afspraak helpen. Alleen wisten we per pagina niet welke stap dat was. De bestaande retargeting keek terug naar wat iemand had gezien. Wij wilden vooruitkijken naar wat iemand nog moest doen.

Het doel was om met hetzelfde retargetingbudget via Google en Meta minimaal 32% meer winkelafspraken per maand te halen. De kosten per afspraak zouden dan met 24% dalen. Daarnaast wilden we drie dingen bereiken.

  • Bezoekers die zonder afspraak vertrokken een persoonlijke advertentie tonen die hen helpt de meest kansrijke vervolgstap te zetten.
  • Het mediabudget verdelen op basis van de kans dat een bezoeker uiteindelijk een afspraak maakt.
  • Per retargetingflow zien hoeveel bezoekers we bereiken en welke advertenties hen terugbrengen, zodat we gericht kunnen verbeteren.

Een Markov-model als basis

We richtten ons op bezoekers die de website zonder afspraak verlieten. Om te bepalen welke advertentie hen verder kon helpen, onderzochten we in BigQuery welke routes bezoekers aflegden en welke stappen tot een afspraak leidden.

Dat leverde ruim 90.000 unieke routes op, en daar kwamen we eerst niet verder mee. Van alle routes kwam 80% maar één keer voor. Veel verschillende klantreizen dus, maar te weinig herhaling om per route iets te voorspellen. Daarom groepeerden we pagina's in categorieën en pasten we het Markov-model opnieuw toe. Zo kregen we genoeg herhaling om de overgangskansen betrouwbaar te berekenen.

Het model berekent vanuit iedere pagina welke vervolgstappen bezoekers zetten en hoe waarschijnlijk die zijn. Door die stappen aan elkaar te koppelen, zien we ook hoe groot de kans is dat iemand uiteindelijk een afspraak maakt. Daar hingen we twee dingen aan op.

homepage2%ExitAdvertentienaar /categoriebudget laagFAQ-pagina1%ExitAdvertentienaar /categoriebudget laag/categorie4%ExitAdvertentienaar /vind-een-winkelbudget mid/merken3%ExitAdvertentienaar /vind-een-winkelbudget mid/vind-een-winkel15%ExitAdvertentienaar /winkelbudget hoog/winkel26%ExitAdvertentienaar afspraakbudget hoogafspraak35%15%10%25%35%20%20%10%60%25%15%%Kans op een afspraak vanaf deze pagina%Kans dat een bezoeker deze stap zetExit zonder afspraakAdvertentie naar de meest kansrijke vervolgstapBudget per advertentie: laag onder 3%, mid 3 tot 10%, hoog vanaf 10% afspraakkans
Vereenvoudigd Markov-model van de website. Per pagina de kans op een afspraak, per stap de kans dat een bezoeker die zet, en per afhaakmoment de advertentie die daaruit volgt.

De meest kansrijke vervolgstap bepaalt de boodschap

Vanuit de laatst bekeken pagina voorspelt het model welke vervolgstap het meest kansrijk is op weg naar een afspraak. Die stap bepaalt de boodschap en de landingspagina. De eerder bekeken thema's gebruiken we om de advertentie persoonlijk te maken. Zo sluit de advertentie aan op de interesse van de bezoeker en geeft die een concrete reden om terug te komen. Hieronder een voorbeeld van hoe dat uitpakt.

homepageFAQ-pagina/categorie/merkenREIS VAN DE BEZOEKERExitMOGELIJKE VOLGENDE STAP/vind-een-winkelafspraakkans 15%/categorieafspraakkans 4%ADVERTENTIEbeeld uit de beeldbank,gekozen op bestandsnaamBoodschap haakt aan opde FAQ die de bezoeker lasLaat je adviseren in de winkelVind een winkellandt op /vind-een-winkel
Een bezoeker leest een FAQ en haakt af op de merkenpagina. Wie vanaf daar naar de winkelzoeker gaat, maakt in 15% van de gevallen een afspraak, tegen 4% via de categoriepagina. Dus stuurt de advertentie naar de winkelzoeker, en pakt de boodschap het onderwerp van de FAQ op.

De totale afspraakkans bepaalt het budget

Het model berekent ook hoe groot de kans is dat een bezoeker vanuit het afhaakmoment uiteindelijk een afspraak maakt. Op basis daarvan verdeelden we bezoekers over drie groepen met een lage, middelhoge of hoge afspraakkans. Iedere groep kreeg een eigen budget. Zo konden we de media-inzet per groep sturen en meteen toetsen of de voorspelde afspraakkans ook in de campagneresultaten terugkwam.

Oplossing & implementatie

We werkten dit in drie stappen uit. We maakten de persoonlijke advertenties, bouwden de techniek om ze bij de juiste bezoeker te krijgen en brachten de prestaties per flow in kaart.

1. Duizenden persoonlijke advertenties maken

Voor iedere retargetingflow kreeg Claude een briefing met de afhaakpagina, de voorspelde vervolgstap en de eerder bekeken paginagroepen. Claude kreeg ook bestaande teksten van de retailer en toegang tot de beeldbank. De afbeeldingen gaven we beschrijvende bestandsnamen, zodat Claude snel een passend beeld bij de boodschap kon kiezen.

Dat leverde 1.120 unieke boodschappen op. Met de Channable Image Editor werkten we die uit tot 9.676 advertentievarianten, waarvan het grootste deel voor een specifieke winkel. De 40 belangrijkste varianten controleerden we handmatig, de rest met steekproeven.

2. De juiste advertentie na het juiste afhaakmoment

Tijdens een websitebezoek verandert de meest relevante advertentie steeds. Daarom houden we per pagina bij welke advertentie past bij de laatst bekeken pagina en de eerdere interesses. Server-side GTM zoekt die combinatie op in een tabel in BigQuery en slaat de bijbehorende advertentie-ID tijdelijk op in Firestore. Bij iedere nieuwe pagina overschrijven we die.

Pas na 30 minuten inactiviteit sturen we de laatst opgeslagen advertentie-ID naar Google Ads en Meta. Zo krijgt de bezoeker één advertentie die past bij het uiteindelijke afhaakmoment, in plaats van losse advertenties voor elke stap uit hetzelfde bezoek.

TIJDENS HET BEZOEKPAGINAmet tijdstipSERVER-SIDE GTMzoekt de combinatie opin de tabel uit BigQueryFIRESTOREdocument per bezoekerhomepage13:51ad-ID 0231naar /categorieFAQ-pagina13:55ad-ID 0544naar /categorie/categorie13:58ad-ID 0871naar /vind-een-winkel/merken14:02ad-ID 0912naar /vind-een-winkeleerder bekekenhomepage, FAQ-pagina, /categorie, /merkenlaatste ad-ID0231054408710912laatste activiteit14:02elke nieuwe pagina overschrijft ad-ID en tijdstipNA HET BEZOEKExitScript, elke 5 minutenZoekt in Firestore bezoekers dielanger dan 30 minuten stil zijn.Om 14:35 is dat deze bezoeker.MetaProductViewID 0912Google AdsProductViewID 0912
Tijdens het bezoek zoekt server-side GTM per pagina een advertentie-ID op en schrijft die naar Firestore. Een script stuurt na 30 minuten stilte de laatste ID door naar Meta en Google Ads.

3. Per retargetingflow volgen wat werkt

Na het uitleveren wilden we weten of de advertenties bezoekers ook terugbrachten. Daarom combineerden we in BigQuery de afhaakmomenten uit de Markov-analyse met de advertentievertoningen uit Google Ads en Meta. Via GA4 en de advertentie-ID in de UTM-code zagen we hoeveel bezoekers vanuit iedere flow terugkwamen.

Zo zagen we per flow hoeveel bezoekers afhaakten, hoeveel vertoningen daarop volgden en hoeveel mensen terugkwamen. Dat vertelde ons waar we bezoekers onvoldoende bereikten en welke advertenties of landingspagina's we moesten verbeteren.

Resultaat

In de twee maanden na livegang haalden we met hetzelfde maandelijkse mediabudget 51% meer winkelafspraken dan in de eerste helft van het jaar. De kosten per afspraak daalden met 34%. De doelstelling was 32% meer afspraken en 24% lagere kosten per afspraak. Beide haalden we ruim.

Wat we leerden

Markov hielp ons de klant beter te begrijpen. We vonden kansrijke vervolgstappen die we zelf niet hadden bedacht, en we konden bezoekers retargeten met klantreizen die buiten onze handmatige flows zouden vallen.

De drie budgetgroepen gaven ons vanaf de start meer controle. Verrassend genoeg deed ook de groep met een lage afspraakkans het goed. Onze verklaring is dat deze bezoekers uit zichzelf minder snel terugkomen, waardoor hun klantreizen historisch laag scoren. Met de juiste advertentie bleken we ook hen richting een afspraak te kunnen helpen.

Ook leerden we hoe we AI beter kunnen inzetten. Bij grote aantallen advertenties in één keer schreef AI vooral generieke teksten die steeds hetzelfde patroon volgden. Door de advertenties in een loop in batches van vijf te laten schrijven, werd de copy een stuk beter. Iedere advertentie kreeg zo meer aandacht en de verschillen tussen klantreizen kwamen beter terug in de boodschap.

De campagne gaf ons bovendien aanknopingspunten voor de website zelf. Voor een aantal pagina's bevestigden de campagneresultaten welke vervolgstappen werkten. Die kennis verwerkten we in de eerste CRO-briefings voor de retailer. En de meest succesvolle flows zijn input voor het platform waarmee de retailer straks ook e-mails en websitecontent personaliseert.

Conclusie

Personalisatie op schaal klinkt groot, maar de uitdaging zat vooral in de praktische toepassing. Patronen herkennen in ruim 90.000 klantreizen, een Markov-model vertalen naar begrijpelijke keuzes, en met AI, Channable, server-side GTM, BigQuery en Firestore zelf de infrastructuur bouwen om duizenden persoonlijke advertenties uit te leveren.

Die investering in techniek leverde 51% meer winkelafspraken op bij hetzelfde mediabudget. En de inzichten uit het model helpen ons nu al bij CRO en straks bij e-mail en websitecontent. Zo zetten wij data en techniek in. Eerst snappen welke stap een bezoeker verder brengt, dan pas de advertentie maken.