De vervelendste fout bij tracking is niet de pixel die stukgaat. Het is de pixel die er geïnstalleerd uitziet en niets doorstuurt.

Dat is precies wat er bij mij bijna gebeurde. Het script stond netjes in de head, het dashboard zei niets, en er kwam geen enkele gebeurtenis binnen. Drie dingen zaten in de weg, en geen van de drie gaf een foutmelding.

Hieronder staat de hele opzet, plus de lijst met gebeurtenisnamen die OpenAI accepteert. Die lijst staat nergens in hun documentatie. Ik heb hem uit hun eigen script gelezen.

SCRIPT IN DE HEAD GEBEURTENIS BIJ CONVERSIE FIREWALL OPEN ZICHTBAAR IN DE STREAM
Vier schakels. De derde breekt geruisloos en daar gaat het bijna altijd mis.

Waarom je dit eerst doet

Zonder conversiemeting kan ChatGPT wel verkeer sturen, maar niet leren wie er converteert. Je campagne optimaliseert dan op clicks in plaats van op klanten, en je betaalt voor nieuwsgierige mensen zonder budget.

Belangrijker nog: als je conversie nooit binnenkomt, optimaliseert het algoritme richting niemand. Je verbrandt dan budget op precies de verkeerde mensen.

Zet de meting op voordat je de eerste euro uitgeeft. Een campagne die stuurt op een conversie die nooit aankomt, koopt de verkeerdste clicks die er zijn.

Stap 1. Maak een gegevensbron aan

In Ads Manager ga je naar Tools, dan Conversies. Je maakt eerst een gegevensbron aan, wat in andere platforms gewoon je pixel heet.

Een nieuwe gegevensbron aanmaken in Ads Manager

Let op het blokje tekst eronder. Automatische geavanceerde matching staat aan en herkent klantgegevens op je site, hasht die in de browser en stuurt ze door. Dat is precies waarom je hier ook even naar je cookiebanner moet kijken. Daar kom ik onderaan op terug.

De rechterkolom laat de vier stappen zien: gegevensbron, conversiegebeurtenis, implementeren, en koppelen aan een campagne.

Stap 2. Het script plaatsen

Na het aanmaken krijg je je Pixel-ID en het installatiescript.

Het installatiescript en de Pixel-ID

OpenAI is hier specifiek over: zet het script in de head van je site, zo hoog mogelijk, en maar één keer per pagina.

Dat laatste is geen detail. Twee installatiescripts op dezelfde pagina en je telt alles dubbel.

En dan het probleem dat niemand noemt

Als je site pagina’s wisselt zonder de browser echt opnieuw te laten laden, en dat doen de meeste moderne sites, dan telt het script alleen die allereerste lading. Alle volgende pagina’s tellen niet mee.

Bij mij scheelde dat naar schatting tachtig procent van mijn paginaweergaven.

De oplossing is een page_viewed afvuren bij elke navigatie, niet alleen bij de eerste. Op een Astro-site met View Transitions hangt dat aan astro:page-load. Op een React- of Vue-site hang je het aan je router.

Als je site pagina’s wisselt zonder volledige herlaadbeurt, telt de pixel alleen de eerste. Vuur zelf een page_viewed af bij elke navigatie.

Stap 3. De conversiegebeurtenis

Nu maak je de gebeurtenis aan die je als conversie wil tellen.

Een aangepaste conversie aanmaken

Je kiest je gegevensbron, dan de basisgebeurtenis, dan een naam. De naam mag maximaal 30 tekens zijn.

Onderaan staat het attributievenster. Standaard staat het doorklikattributie-venster op 30 dagen. Dat bepaalt hoe lang na een klik een conversie nog aan je advertentie wordt toegeschreven. Voor een dienst met een lange beslistijd is dertig dagen redelijk. Verkoop je iets waar mensen dezelfde dag over beslissen, zet het dan korter, anders schrijf je verkopen aan je advertenties toe die er niets mee te maken hadden.

De gebeurtenisnamen die OpenAI accepteert

Dit is het stuk waar ik het meeste tijd in kwijt was. Je kunt niet zomaar een naam verzinnen. Het script van OpenAI accepteert een vaste lijst, en alles wat er niet in staat wordt stilletjes weggegooid. Geen foutmelding, geen waarschuwing, gewoon niets.

Ik heb hun script gelezen om de lijst compleet te krijgen:

GebeurtenisWaarvoor
page_viewedPaginaweergave
lead_createdLead binnengekomen
appointment_scheduledAfspraak ingepland
registration_completedRegistratie afgerond
contents_viewedProduct of inhoud bekeken
checkout_startedAfrekenen gestart
items_addedToegevoegd aan winkelwagen
order_createdBestelling geplaatst
subscription_createdAbonnement afgesloten
trial_startedProefperiode gestart
customEigen gebeurtenis
Gebruik je een naam die niet in deze lijst staat, dan wordt je gebeurtenis weggegooid zonder foutmelding.

De code zelf is één regel. Die zet je op de plek waar de conversie echt gebeurt, dus niet naast je installatiescript.

De code voor de conversiegebeurtenis

oaiq("measure", "lead_created", { type: "customer_action" });

Bij mij hangt die aan het moment dat Cal.com een boeking bevestigt. Eén gebeurtenis per boeking. Ik had eerst appointment_scheduled gebruikt, maar mijn dashboard telde lead_created, dus dat moest gelijkgetrokken. Vuur er nooit twee tegelijk af, want dan telt elke boeking dubbel.

Stap 4. De Conversies-API, en wanneer je die niet nodig hebt

Er is ook een serverkant.

De Conversies-API met het curl-voorbeeld

Je stuurt dan een POST naar https://bzr.openai.com/v1/events met je pixel-ID en een API-sleutel.

Voor de meeste bedrijven is dit voorlopig niet nodig. Het vraagt een server, en veel sites zijn gewoon statische bestanden zonder backend. De pixel dekt je.

Wat de API je later wel oplevert is dat je boekingen meetelt van mensen met een adblocker. Waard om op terug te komen als de cijfers van OpenAI merkbaar lager liggen dan wat je zelf in je agenda ziet.

Stap 5. De firewall, oftewel de stille moordenaar

Dit is de reden dat je pixel geïnstalleerd kan lijken terwijl er niets binnenkomt.

Als je site een beveiligingsbeleid heeft dat bepaalt welke externe scripts mogen laden, en de meeste serieuze sites hebben dat, dan blokkeert dat OpenAI standaard. Het script laadt niet, of het laadt wel maar mag niets versturen. Je ziet geen foutmelding op je site. Je ziet alleen een leeg dashboard.

Twee domeinen moeten erdoor:

bzrcdn.openai.com
bzr.openai.com

De eerste levert het script, de tweede ontvangt de data. Zet je er maar één op je lijst, dan werkt het half en dat is verwarrender dan wanneer het helemaal stukgaat.

Dit was bij mij het enige dat de pixel echt stil zou hebben gehouden.

Stap 6. Bewijzen dat het werkt

Niet aannemen. Controleren. Ads Manager heeft daar een tabblad voor: Gebeurtenisstroom.

De lege gebeurtenisstroom voordat je begint

Je klikt op Polling starten en laat het openstaan. Dan ga je in een ander tabblad naar je eigen site en klikt wat rond.

Twee page_viewed gebeurtenissen die binnenkomen

Daar staan ze. Twee keer page_viewed, met tijdstip, gegevensbron en het kanaal waarlangs ze binnenkwamen. Drie seconden uit elkaar, want dat was ik die van de ene pagina naar de andere klikte.

Dit is je bewijs. Zie je hier niets binnen een minuut, dan werkt je opzet niet, hoe netjes je code er ook uitziet.

Doe daarna hetzelfde met je echte conversie. Boek een afspraak bij jezelf, of vul je eigen formulier in, en kijk of er precies één lead_created verschijnt. Eén, niet twee.

Test je eigen conversie voordat je gaat adverteren. Een campagne die stuurt op een gebeurtenis die nooit aankomt, verbrandt budget op de verkeerde mensen.

Het stuk dat niemand leuk vindt: toestemming

De pixel plaatst een herkenningspunt zodra je pagina laadt. Doe je dat zonder dat de bezoeker daar ja op heeft gezegd, dan zit je in Nederland en de rest van de EU fout.

De regel is niet nieuw en niet specifiek voor OpenAI. De Europese privacytoezichthouders hebben bevestigd dat tracking pixels onder dezelfde regel vallen als cookies, ook als het je eigen domein is. Praktisch betekent dat: de pixel mag pas afvuren nadat iemand toestemming heeft gegeven, net als bij Meta of Google.

Twee dingen die daarbij vaak fout gaan.

De serverkant is geen ontsnapping. Gehashte mailadressen die je via de API doorstuurt blijven persoonsgegevens. Hashen is niet hetzelfde als anonimiseren.

En je kunt je niet verschuilen achter de verwerkersovereenkomst van OpenAI. In hun eigen voorwaarden staat dat jullie voor gewone conversiemeting onafhankelijke verwerkingsverantwoordelijken zijn, dus geen verwerker en verantwoordelijke. Dat betekent dat jouw toestemming jouw probleem is, en dat je OpenAI in je privacyverklaring moet noemen als ontvanger.

Ik ben geen jurist en dit is geen juridisch advies. Maar het is wel de reden dat ik dit stuk niet oversla.

De rest van de opzet, van account tot eerste advertentie, staat in de complete handleiding voor adverteren in ChatGPT. Voor de teksten zelf is er advertentietekst voor ChatGPT Ads.

Even snel: de hele checklist

  1. Gegevensbron aanmaken in Tools, dan Conversies
  2. Script in de head, zo hoog mogelijk, één keer per pagina
  3. Bij een site zonder volledige herlaadbeurt: zelf page_viewed afvuren per navigatie
  4. Conversiegebeurtenis aanmaken, attributievenster controleren
  5. Alleen een naam uit de vaste lijst gebruiken
  6. bzrcdn.openai.com en bzr.openai.com toestaan in je beveiligingsbeleid
  7. Pixel achter je toestemmingsbanner zetten
  8. Gebeurtenisstroom openen en je eigen conversie testen

Punt 8 is de enige die echt telt. De rest kun je perfect doen en alsnog niets meten.

Veelgestelde vragen

Waarom komen er geen gebeurtenissen binnen in ChatGPT Ads?

Bijna altijd één van drie dingen: je beveiligingsbeleid blokkeert bzrcdn.openai.com of bzr.openai.com, je site laadt niet echt opnieuw bij navigatie dus telt alleen de eerste pagina, of je gebruikt een gebeurtenisnaam die niet op de vaste lijst staat. Geen van de drie geeft een foutmelding.

Welke gebeurtenissen accepteert de OpenAI-pixel?

page_viewed, lead_created, appointment_scheduled, registration_completed, contents_viewed, checkout_started, items_added, order_created, subscription_created, trial_started en custom. Andere namen worden weggegooid.

Heb ik de Conversies-API nodig?

Niet als je site geen backend heeft. De pixel is genoeg om te beginnen. De API is nuttig als je vermoedt dat adblockers conversies wegvangen.

Hoe lang is het attributievenster?

Standaard 30 dagen na een klik. Je kunt dat aanpassen bij het aanmaken van de conversie.

Moet de pixel achter een cookiebanner?

Ja, als je bezoekers uit de EU krijgt. De pixel plaatst een herkenningspunt bij het laden van de pagina, en dat valt onder dezelfde toestemmingsregel als andere marketingpixels.


Ik heb dit voor mijn eigen site opgezet en doe het nu ook voor een paar andere bedrijven, om erachter te komen of dit kanaal iets oplevert. Loop je vast op de meting, of wil je gewoon dat iemand het in één keer goed neerzet, plan even een gesprek.