Meta Ads tracking instellen via Webhook Matching

Bewerkt

Dit artikel gaat specifiek over het Meta CAPI-deel van AdPage Webhook Matching: hoe je de AdPage - Meta Conversion API-tag koppelt aan de merged payload die Webhook Matching aanlevert. 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.


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, cookies, user-agent, items-array

  • Trigger (server-side webhook, bij de order): vangt de backend-ordergegevens — klant, adres, bedrag

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.


Wat heb je nodig?

  • 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

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

  • Je Meta Pixel ID en API Access Token — zie dit artikel

  • Het template-bestand AdPage - Meta Conversion API.tpl (AdPage-fork van de Facebook Conversion API-template) - https://adpage.b-cdn.net/GTM-Templates/Facebook%20Conversion%20API.tpl


Stap 1: Template uploaden

  1. Open je GTM server container en ga naar Templates

  2. Klik bij Tag Templates op New

  3. Klik rechtsboven op de drie puntjes (⋮) en kies Import

  4. Selecteer het bestand AdPage - Meta Conversion API.tpl - https://adpage.b-cdn.net/GTM-Templates/Facebook%20Conversion%20API.tpl

  5. Klik op Save


Stap 2: Tag aanmaken en basisinstellingen

  1. Ga naar Tags in het linkermenu

  2. Klik op New

  3. Kies als Tag Configuration de AdPage - Meta Conversion API

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

  5. Vul Facebook Pixel ID en API Access Token in

  6. Laat Action Source op de standaardwaarde Website staan

  7. Vink Generate _fbp cookie if it not exist uit — Webhook Matching stuurt de echte _fbp/_fbc van de Prepare-stap al mee; een zelfgegenereerde fallback voegt daar niets aan toe


Stap 3: Trigger instellen op de Measurement Protocol Client

In tegenstelling tot een setup met de "losse" AdPage Webhook Client, komt dit event 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 (extra zekerheid als deze client ooit meer event-types gaat afhandelen)

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

  6. Klik op Save

⚠️ Gebruik deze aanpak — niet de "Client Name equals GA4"-trigger uit het reguliere Meta CAPI-artikel. Die trigger vangt de gewone client-side GA4-events, en zou dan naast Webhook Matching een tweede (deels dubbele) Meta-event veroorzaken voor dezelfde aankoop.


Stap 4: Event Name — "Inherit from client" werkt hier prima

Omdat de Measurement Protocol Client een schone event_name: "purchase" doorgeeft (géén trytagging_-prefix), herkent de tag dit automatisch als het standaard Facebook-event Purchase via de ingebouwde naam-mapping.

  1. Laat Event Name Setup Method op Inherit from client staan

Wil je liever expliciete controle, of twijfel je of er ooit een afwijkende event-naam doorkomt? Zet dan Override → Standard → Purchase. Functioneel maakt het in deze specifieke setup geen verschil.


Stap 5: Consent — controleren, niet blind uitzetten

Webhook Matching stuurt consent standaard mee, in meerdere vormen (gcs/gcd, en een genest consent.*-object). Zet Consent Settings dus in eerste instantie niet op "Send data always", maar test eerst of het "gewoon werkt":

  1. Laat Consent Settings op de standaardwaarde staan: "Send data in case marketing consent given"

  2. Test de flow (zie Stap 7)

  3. Zie je in de preview mode dat de tag Fired toont, maar niets onder Outgoing HTTP Requests from Server? Dan komt de consent niet aan in het formaat dat deze tag verwacht (consent_state.ad_storage of x-ga-gcs) — zet dan als tijdelijke fix Consent Settings op Send data always, en meld dit door aan het Tracking & Tools-team, want dan klopt de gcs-doorvertaling van de Measurement Protocol Client niet.

💡 Dit is een bewuste afwijking van eerdere Meta CAPI/webhook-artikelen: bij de losse AdPage Webhook Client ontbreekt consent-data structureel (zie de kanttekening onderaan), maar bij Webhook Matching hoort consent er wél doorheen te komen omdat het via de Measurement Protocol Client loopt.


Stap 6: Klant- en aankoopdata — automatisch gemapt

De merged payload van Webhook Matching bevat exact de velden die deze tag automatisch herkent. Volgens het basisartikel worden deze Meta-velden standaard meegestuurd:

Meta-veld

Herkomst (via Webhook Matching)

fbp / fbc

_fbp/_fbc-cookie, gevangen tijdens de Prepare-stap

em, fn, ln, ph

e-mail, voornaam, achternaam, telefoon — tag hasht deze automatisch met SHA256 als ze nog niet gehasht zijn

zp, ct, st, country

postcode, stad, provincie, land

external_id

customer.id — stabiel over meerdere orders van dezelfde klant

client_ip_address / client_user_agent

IP en user-agent voor matching

event_id

voor deduplicatie met je browser-side Pixel

value, currency, contents/content_type

order- en productdata, inclusief de items-array uit de Prepare-stap

Je hoeft de User Data- en Custom Data-tabellen dus in de regel niet handmatig te vullen. 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 als custom property toevoegt.


Stap 7: Testen

  1. Open je server container op → 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

Via onderstaande link kun je de stappen zien: https://app.arcade.software/share/0HswbFejHQLFQeeC2NXw

Controleer in de preview mode, in deze volgorde:

  1. De Prepare-tag 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 AdPage - Meta Conversion API-tag toont Fired

  4. Onder Outgoing HTTP Requests from Server staat een request naar graph.facebook.com — staat hier None, ga terug naar Stap 5 (consent)

💡 Extra check in Meta zelf: vul tijdens het testen het veld Test ID in met de code uit Gebeurtenisbeheer → Test-gebeurtenissen in Meta, zodat je meteen de Event Match Quality-score van het event ziet. Verwijder het Test ID voordat je live gaat.


Veelvoorkomende problemen

Tag toont "Fired", maar geen Outgoing HTTP Request

Zie Stap 5 — de gcs/consent-doorvertaling van de Measurement Protocol Client komt niet aan zoals de tag verwacht. Zet tijdelijk Consent Settings op Send data always en meld dit intern.

Aankoop wordt dubbel geteld in Meta

Je hebt zowel deze trigger (Client Name = Measurement Protocol Client) als de trigger uit het reguliere artikel (Client Name = GA4) actief op dezelfde soort purchase-events. Meta dedupliceert alleen als beide events exact hetzelfde event_id gebruiken — zorg dat je maar één van de twee triggers gebruikt, of controleer de dedup via Event Deduplicatie instellen voor Meta Ads.

"Match identifier value could not be resolved" in de Webhook Matching-logs

Dit gebeurt vóór de Meta-tag en heeft niets met deze tag te maken — de BasketKey wordt niet gevonden. Zie de troubleshooting in het basisartikel.

Event komt bij Meta binnen met een lege of onverwachte event-naam

Controleer of de trigger inderdaad op de Measurement Protocol Client staat (Stap 3) en niet op een custom event met een trytagging_-prefix — dat laatste hoort bij de losse Webhook Client, niet bij Webhook Matching (zie hieronder).


Verschil met de standaard Webhook Client

Gebruik je (nog) geen Webhook Matching, maar wel de gewone AdPage Webhook Client rechtstreeks (zoals in het GA4 webhook-artikel)? Dan gelden twee afwijkende punten ten opzichte van dit artikel:

  • Het event komt binnen met de ruwe naam trytagging_purchase, niet als schone purchase. Zet Event Name Setup Method dan op Override → Standard → Purchase — "Inherit from client" stuurt anders een custom event trytagging_purchase naar Meta.

  • De payload bevat geen consent-signaal. Zet Consent Settings dan direct op Send data always, anders stopt de tag stilzwijgend zonder een request te versturen.


Was dit artikel nuttig?


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.