Google Ads tracking instellen via Webhook Matching
Google Ads tracking versterken met Webhook Matching
Dit artikel gaat over het Google Ads-deel van AdPage Webhook Matching. Belangrijk om vooraf te begrijpen: Webhook Matching is geen vervanging van je bestaande, client-side Google Ads conversietracking — het is een toevoeging daarop. Je houdt je normale server-side Google Ads-setup (Conversion Linker + Google Ads Conversion Tracking op de GA4-client) gewoon staan, en Webhook Matching voegt daar een tweede, backend-bevestigde purchase-conversie aan toe. Beide conversies worden door Google gededupliceerd op transaction_id (de oid-parameter), zodat je aankoop nooit dubbel telt.
Heb je Webhook Matching nog niet ingericht? Doorloop eerst het basisartikel (activeren, Event Notifier-template, BasketKey, Measurement Protocol Client) — dit artikel bouwt daar direct op verder.
Waarom een toevoeging, en niet een vervanging?
De standaard server-side Google Ads-setup (zoals beschreven door Simo Ahava en in het reguliere Google Ads-artikel) werkt zo:
Je GA4 web-tag stuurt events naar de sGTM server container
Een Conversion Linker-tag vangt de klik-id en schrijft de
FPGCLAW-cookieEen Google Ads Conversion Tracking-tag vuurt op het purchase-event van de GA4-client
Die client-side keten blijft je primaire pad. Maar hij is afhankelijk van de browser: ad-blockers, ITP/tracking-preventie, afgebroken sessies of ontbrekende consent kunnen ervoor zorgen dat de purchase-conversie de browser niet haalt of zonder waarde binnenkomt.
Webhook Matching vult dat gat. De conversie komt hier rechtstreeks uit de backend-order (server-side webhook), verrijkt met browser-context uit de Prepare-stap. Die is robuuster: echte ordergegevens, backend-bevestigd, met consent-forwarding en gehashte Enhanced Conversions. Door beide paden te laten lopen en op transaction_id te dedupliceren, krijg je de betrouwbaarheid van server-side data zónder het risico op dubbeltelling.
💡 De kern van dit artikel in één zin: voeg een tweede Google Ads Conversion Tracking-tag toe op de Measurement Protocol Client, gebruik dezelfde conversie-actie (Conversion ID + Label) als je client-side tag, en zorg dat beide hetzelfde
transaction_idmeesturen — dan dedupt Google opoid.
Kort: wat is Webhook Matching ook alweer?
Webhook Matching is een AdPage-functionaliteit die twee databronnen server-side samenvoegt tot één gevalideerd event:
Prepare (browser-side, vlak vóór checkout): vangt browser-context —
gclid,_gcl_aw, cookies, user-agent, items-arrayTrigger (server-side webhook, bij de order): vangt de backend-ordergegevens — klant, adres, bedrag,
transaction_id
Beide kanten worden gekoppeld via een BasketKey (user_id, cart_token of quote_id, afhankelijk van je platform). Het resultaat komt binnen op je sGTM server container via een Measurement Protocol (GA4) Client op het pad /data, en bevat direct alle velden die GA4, Meta, Google Ads, TikTok én Pinterest nodig hebben — inclusief consent-forwarding.
Hoe de deduplicatie werkt
Google Ads dedupliceert conversies binnen dezelfde conversie-actie op basis van het order-ID / transaction ID (de oid-parameter in de conversie-ping). Zodra er voor dezelfde conversie-actie twee conversies binnenkomen met dezelfde oid, houdt Google er één aan.
Dat is precies wat we benutten:
Pad | Bron |
|
|---|---|---|
Client-side (bestaand) | Google Ads Conversion Tracking-tag op GA4-client purchase-event |
|
Server-side (nieuw, deze setup) | Google Ads Conversion Tracking-tag op de Measurement Protocol Client |
|
Zolang beide paden dezelfde conversie-actie (Conversion ID + Label) én hetzelfde transaction_id gebruiken, is het resultaat één gededupliceerde conversie. Komt het client-side event niet aan (ad-blocker, consent, afgebroken sessie), dan vangt het server-side event de conversie alsnog op — zonder dat je bij normale flows dubbeltelt.
⚠️ Deduplicatie werkt alleen als de
oidin beide paden exact gelijk is. Wijkt hettransaction_idaf — of ontbreekt het in één van de paden — dan telt Google beide conversies apart. Dit is het eerste dat je controleert bij vermoeden van dubbeltelling.
Wat heb je nodig?
Je bestaande client-side Google Ads server-side setup werkend: GA4 web-tag → server container, een Conversion Linker-tag (All Pages) en een Google Ads Conversion Tracking-tag op het GA4-client purchase-event
Webhook Matching actief voor deze klant (stap 1 uit het basisartikel)
De Prepare- en Trigger-tags (op basis van
adpage-event-notifier.tpl) al ingericht met de juiste BasketKey — inclusief een consistenttransaction_idEen Measurement Protocol (GA4) Client op pad
/data, met een herkenbare naam — in dit artikel gebruiken weWebhook Matching - GA4als voorbeeldJe Google Ads Conversion ID en Conversion Label — dezelfde conversie-actie als je client-side purchase-tag, beheerd via de per-domein lookups (zie Stap 2)
Stap 1: Client en payload controleren
De Google Ads Conversion Tracking-tag is een ingebouwde GTM server-tag; je hoeft hiervoor géén template te importeren. Wat wél moet kloppen, is dat de standaard Google MP (App+Web) client de payload van de Event Notifier parseert.
Die client bouwt uit de payload het GA4 event-data-model op: value, currency, items, transaction_id, user_data (gehasht) en de consent-state. De Google Ads-tag leest die velden vervolgens automatisch uit dat model — zolang je ze niet handmatig overschrijft.
Stap 2: Tweede conversie-tag aanmaken en basisinstellingen
Je maakt een tweede Google Ads Conversion Tracking-tag aan, naast je bestaande client-side tag. Deze vuurt op de Measurement Protocol Client (Stap 3).
Ga naar Tags in het linkermenu
Klik op New
Kies als Tag Configuration Google Ads Conversion Tracking
Geef de tag een herkenbare naam, bijvoorbeeld
Google Ads - Purchase (Webhook Matching)Vul de velden in volgens onderstaande tabel:
Veld | Waarde | Toelichting |
|---|---|---|
Conversion ID |
| ✅ invullen — dezelfde actie als de client-side tag (lookup per domein) |
Conversion Label |
| ✅ invullen — dezelfde actie als de client-side tag (lookup per domein) |
Conversion Value | (leeg) | ❌ leeg laten — komt uit |
Currency code | (leeg) | ❌ leeg laten — komt uit |
Order ID / Transaction ID | (leeg of | moet gelijk zijn aan de |
Enable Restricted Data Processing |
| tenzij bewust anders |
Provide product-level sales data | optioneel | aanvinken voor item-/productdata ( |
Provide new customer data | optioneel | aanvinken voor new-customer-acquisition reporting |
Meer hoef je niet in te stellen. Consent, klik-id (gclid), Enhanced Conversions én het transaction_id komen uit de payload.
⚠️ Vul
Conversion Valueniet in met een variabele zoals{{value}}. Op het MP-pad geeft zo'n variabele vaak leeg terug, waarmee je de automatische uitlezing overschrijft met een lege waarde — de conversie gaat dan zonder waarde de deur uit. Hetzelfde geldt voor Currency code. Laat de velden simpelweg leeg.
Stap 3: Trigger instellen op de Measurement Protocol Client
Dit event komt niet binnen als een custom event met een trytagging_-prefix. Het komt binnen via de Measurement Protocol Client die je in stap 4 van het basisartikel hebt aangemaakt, met een schone event_name: "purchase".
Klik in de tag op Triggering → +
Kies als trigger type Custom
Stel in: {{Client Name}} komt overeen met de naam van je Measurement Protocol Client (bijv.
Webhook Matching - GA4)Voeg optioneel een tweede voorwaarde toe: Event Name is gelijk aan
purchaseGeef de trigger een naam, bijvoorbeeld
Webhook Matching - PurchaseKlik op Save
💡 Je client-side purchase-tag (getriggerd op de GA4-client) blijft gewoon staan — dit is bewust. De twee tags vuren op verschillende clients, maar op dezelfde conversie-actie en met hetzelfde
transaction_id, zodat Google opoiddedupt. Verwijder de bestaande client-side trigger dus niet.
Stap 4: Consent — controleren, niet blind uitzetten
Webhook Matching stuurt consent standaard mee. Op het MP-pad gebeurt dat via een top-level consent-object (ad_user_data / ad_personalization: GRANTED/DENIED); de standaard MP-client leest consent uitsluitend uit dat object. Zonder dat object worden EEA-conversies niet toegekend.
Test de flow (zie Stap 5)
Controleer in de outgoing request of
gcs/gcdaanwezig zijn (bijv.G111)Ontbreken die parameters, dan komt consent niet in het verwachte formaat aan — meld dit door aan het Tracking & Tools-team, want dan klopt de consent-doorvertaling van de Measurement Protocol Client of de consent-capture in de tagging-template niet.
💡 De GA4-client (
gaaw_client) leest consent óók uit dex-ga-gcs-param; de MP-client (mpaw_client) uit het top-levelconsent-object. De Event Notifier stuurt beide mee, dus de tag-config is identiek voor beide paden.
Stap 5: Klant- en aankoopdata — automatisch gemapt
De merged payload van Webhook Matching bevat exact de velden die de Google Ads-tag automatisch uitleest. Je hoeft dus in de regel niets handmatig te mappen:
Google Ads-veld | Herkomst (via Webhook Matching) |
|---|---|
|
|
|
|
Enhanced Conversions ( |
|
|
|
productdata ( |
|
consent ( | top-level |
Kom je toch een veld tegen dat leeg blijft? Check eerst in de sGTM preview of het veld daadwerkelijk in de payload van de Measurement Protocol Client staat, vóór je het handmatig toevoegt.
Stap 6: Testen
Open je server container → Webhook Logs
Zoek een recente purchase-webhook en klik op Replay
Open je GTM server container in Preview Mode
Klik rechtsboven op de drie puntjes en kies Send requests manually
Kopieer de
x-gtm-server-previewheader en plak deze in de Webhook Replay-popupKlik op Replay
Controleer in de preview mode, in deze volgorde:
De Prepare- en Trigger-tag van Event Notifier hebben eerder al gematcht (geen
missed-status in de Webhook Matching-logs — zie troubleshooting in het basisartikel)Je Measurement Protocol Client (
Webhook Matching - GA4) verschijnt met het request op/dataDe Google Ads - Purchase (Webhook Matching)-tag toont Fired
Onder Outgoing HTTP Requests from Server staat een request naar
googleadservices.com/pagead/conversion/…
In een correcte purchase-ping staan:
Parameter | Verwacht |
|---|---|
| aanwezig (bijv. |
| de orderwaarde (bijv. |
|
|
| het |
|
|
| aanwezig (in de ping of de |
Veelvoorkomende problemen
Conversie wordt dubbel geteld
Deduplicatie mislukt. Controleer of de client-side én de Webhook Matching-conversie exact dezelfde oid (transaction_id) meesturen én dezelfde conversie-actie (Conversion ID + Label) gebruiken. Wijkt het transaction_id af of ontbreekt het in één van de paden, dan telt Google beide apart. Dit is de meest voorkomende oorzaak.
Geen value in de ping (wel shipping/tax)
Conversion Value is aan een variabele gekoppeld die op het MP-pad leeg resolvet. Maak het Conversion Value-veld leeg, dan leest de tag params.value automatisch uit de payload.
Enhanced Conversions komen plaintext binnen (i.p.v. gehasht em=tv.1~…)
De tag gebruikt de plaintext-velden in plaats van het gehashte user_data. Maak de value- en currency-velden leeg, zodat de tag het gehashte user_data-object auto-collect.
Geen gclid / gclaw in de ping
Het _gcl_aw-cookie is niet doorgestuurd of niet omgezet naar gclid. Controleer of de Prepare-stap het _gcl_aw-cookie vangt; de Event Notifier leidt gclid daaruit af.
Conversie komt binnen maar telt niet mee (EEA)
Het consent-signaal ontbreekt (gcs / gcd niet aanwezig). Zie Stap 4 — consent hoort via het top-level consent-object mee te komen.
Verschil met de standaard Webhook Client
Gebruik je (nog) geen Webhook Matching, maar wel de gewone AdPage Webhook Client rechtstreeks? Dan gelden twee afwijkende punten ten opzichte van dit artikel:
Het event komt binnen met de ruwe naam
trytagging_purchase, niet als schonepurchase. Stel je trigger dan in op die custom event-naam, niet op de Measurement Protocol Client.De payload bevat geen consent-signaal via het top-level
consent-object. Controleer dan extra zorgvuldig of de conversie wel wordt toegekend in EEA-verkeer.
Randvoorwaarden
Je bestaande client-side Google Ads-setup (Conversion Linker + Google Ads Conversion Tracking op de GA4-client) blijft de basis; Webhook Matching is een aanvulling daarop.
Deduplicatie staat of valt met een consistent
transaction_idin beide paden en dezelfde conversie-actie.Werkt alleen als de tagging-template de marketing- en consent-data vastlegt en de Event Notifier die in de MP-payload meestuurt.
Controleer dat de per-domein lookups (Conversion ID + Label) voor élk domein een waarde teruggeven; ontbreekt een domein, dan vuurt de tag niet.
