Google Ads tracking instellen via Webhook Matching

Bewerkt

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-cookie

  • Een 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_id meesturen — dan dedupt Google op oid.


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-array

  • Trigger (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

oid

Client-side (bestaand)

Google Ads Conversion Tracking-tag op GA4-client purchase-event

transaction_id van de dataLayer-purchase

Server-side (nieuw, deze setup)

Google Ads Conversion Tracking-tag op de Measurement Protocol Client

transaction_id uit de merged Webhook Matching-payload

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 oid in beide paden exact gelijk is. Wijkt het transaction_id af — 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 consistent transaction_id

  • Een Measurement Protocol (GA4) Client op pad /data, met een herkenbare naam — in dit artikel gebruiken we Webhook Matching - GA4 als voorbeeld

  • Je Google Ads Conversion ID en Conversion Labeldezelfde 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).

  1. Ga naar Tags in het linkermenu

  2. Klik op New

  3. Kies als Tag Configuration Google Ads Conversion Tracking

  4. Geef de tag een herkenbare naam, bijvoorbeeld Google Ads - Purchase (Webhook Matching)

  5. Vul de velden in volgens onderstaande tabel:

Veld

Waarde

Toelichting

Conversion ID

{{@ Google Ads Conversion ID}}

✅ invullen — dezelfde actie als de client-side tag (lookup per domein)

Conversion Label

{{@ Google Ads Conversion Label (purchase) - MP}}

✅ invullen — dezelfde actie als de client-side tag (lookup per domein)

Conversion Value

(leeg)

leeg laten — komt uit params.value

Currency code

(leeg)

leeg laten — komt uit params.currency

Order ID / Transaction ID

(leeg of {{transaction_id}})

moet gelijk zijn aan de oid van de client-side tag — zie Stap 1; komt standaard uit params.transaction_id

Enable Restricted Data Processing

False

tenzij bewust anders

Provide product-level sales data

optioneel

aanvinken voor item-/productdata (item=) in de conversie

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 Value niet 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".

  1. Klik in de tag op Triggering+

  2. Kies als trigger type Custom

  3. Stel in: {{Client Name}} komt overeen met de naam van je Measurement Protocol Client (bijv. Webhook Matching - GA4)

  4. Voeg optioneel een tweede voorwaarde toe: Event Name is gelijk aan purchase

  5. Geef de trigger een naam, bijvoorbeeld Webhook Matching - Purchase

  6. Klik 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 op oid dedupt. 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.

  1. Test de flow (zie Stap 5)

  2. Controleer in de outgoing request of gcs / gcd aanwezig zijn (bijv. G111)

  3. 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 de x-ga-gcs-param; de MP-client (mpaw_client) uit het top-level consent-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)

value + currency_code

events[0].params.value / .currency — conversiewaarde

oid

events[0].params.transaction_idde dedup-sleutel, moet gelijk zijn aan de client-side oid

Enhanced Conversions (em, pn, fn, ln, ct, pc, co…)

events[0].params.user_data (SHA-256-gehasht, GA4 EC-formaat)

gclid

events[0].params.gclid / _gcl_aw — de Event Notifier leidt gclid af uit het _gcl_aw-cookie

productdata (item=)

events[0].params.items (optioneel, via "Provide product-level sales data")

consent (gcs / gcd)

top-level consent-object

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

  1. Open je server container → Webhook Logs

  2. Zoek een recente purchase-webhook en klik op Replay

  3. Open je GTM server container in Preview Mode

  4. Klik rechtsboven op de drie puntjes en kies Send requests manually

  5. Kopieer de x-gtm-server-preview header en plak deze in de Webhook Replay-popup

  6. Klik op Replay

Controleer in de preview mode, in deze volgorde:

  1. 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)

  2. Je Measurement Protocol Client (Webhook Matching - GA4) verschijnt met het request op /data

  3. De Google Ads - Purchase (Webhook Matching)-tag toont Fired

  4. Onder Outgoing HTTP Requests from Server staat een request naar googleadservices.com/pagead/conversion/…

In een correcte purchase-ping staan:

Parameter

Verwacht

gcs / gcd

aanwezig (bijv. G111) — consent

value

de orderwaarde (bijv. 48.88)

currency_code

EUR

oid

het transaction_idvergelijk dit met de oid van je client-side conversie; ze moeten gelijk zijn

em

tv.1~em.<sha256>~pn.<sha256>~fn0.<sha256>~ln0.<sha256>~ct0…~pc0…~co0… — gehashte Enhanced Conversions

gclid / _gcl_aw

aanwezig (in de ping of de data-blob)


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 schone purchase. 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_id in 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.


Gerelateerde artikelen

Was dit artikel nuttig?

Onze excuses! Zou je ons meer willen vertellen?

Bedankt voor de feedback!

Er is een probleem opgetreden bij het verzenden van uw feedback
Controleer uw verbinding en probeer het opnieuw.