← Alle resources Tutorial

E-commerce tracking in GA4 met Google Tag Manager

Elk omzetcijfer in GA4, van het Monetization-overzicht tot productprestaties en purchase-attributie in Google Ads, is gebouwd op één event met één strikte vorm: purchase, met een unieke transaction_id, een value, een currency en een items array. Krijg je dat goed, dan is de rest van e-commerce tracking een set kleinere, optionele events die dezelfde items-structuur gebruiken. Zit je er net naast, dan toont GA4 omzet zonder producten, producten zonder omzet, of bestellingen die stilletjes verdwijnen. Dit artikel bouwt het netjes op met Tag Manager: de datalayer, de tags, de testbestelling en de controles.

Onderdeel van de GA4-handleiding, stap 9. Je hebt de via Tag Manager geïnstalleerde Google-tag nodig, en een developer, plugin of platform dat bestelgegevens in de pagina kan schrijven.

Zo werkt e-commerce in GA4

GA4 leest je shop niet. Het leest events die je site verstuurt, elk met een items array van productobjecten. De aanbevolen events, in funnelvolgorde: view_item_list, select_item, view_item, add_to_cart, remove_from_cart, view_cart, begin_checkout, add_shipping_info, add_payment_info, purchase, en refund. Alleen purchase is vereist voor omzet; de rest voedt de checkoutfunnel en de productrapporten. Implementeer purchase eerst, controleer het, en voeg daarna de funnel-events toe in volgorde van hoe vaak je er echt naar zult kijken (meestal view_item, add_to_cart en begin_checkout).

Met Tag Manager pusht de shop elk event naar de dataLayer, een Tag Manager-trigger luistert ernaar, en één GA4-eventtag per event stuurt het door met de e-commercedata die rechtstreeks uit de datalayer wordt gelezen. De shop praat nooit direct met GA4.

De datalayer: de purchase-push

Op de orderbevestigingspagina, en alleen daar, pusht de site dit voordat Tag Manager laadt of zodra de bestelling bekend is:

dataLayer.push({ ecommerce: null });
dataLayer.push({
  event: "purchase",
  ecommerce: {
    transaction_id: "ORD-10482",
    value: 129.90,
    tax: 22.55,
    shipping: 4.95,
    currency: "EUR",
    coupon: "WELCOME10",
    items: [{
      item_id: "SKU-4471",
      item_name: "Trail running shoe",
      item_brand: "Northline",
      item_category: "Shoes",
      item_variant: "Blue / 43",
      price: 124.95,
      quantity: 1
    }]
  }
});

De regels die ertoe doen: ecommerce: null eerst, zodat de items van een vorig event niet in dit event lekken; transaction_id uniek per bestelling; value als getal, niet als string, en in dezelfde valuta als currency; items als array, ook bij één product; price per stuk, niet per regel. Of value inclusief btw en verzendkosten is, beslis je zelf, maar neem overal dezelfde beslissing, ook in Google Ads, anders wijken je ROAS-cijfers af van die van de boekhouding.

Shopplatforms verschillen in wat ze pushen. De plugins voor Shopify, WooCommerce en Shopware pushen de volledige aanbevolen set in deze vorm; de meeste thema's en generieke plugins pushen iets wat in de buurt komt en wat je tegen deze lijst moet controleren.

Tag Manager: de trigger en de tag

Maak een Custom Event trigger aan met de eventnaam purchase. Daarna een Google Analytics: GA4 Event tag: Measurement ID uit je Google-tag, eventnaam purchase, en onder More settings › Ecommerce vink je Send Ecommerce data aan, met de databron ingesteld op Data Layer. Dat ene vinkje leest transaction_id, value, currency, items en de rest uit de push; je hoeft ze niet een voor een te mappen.

Herhaal dit voor elk funnel-event dat je implementeert: één trigger per eventnaam, één tag per event, allemaal met het e-commercevinkje. Geef de tags consistente namen (GA4 · purchase, GA4 · add_to_cart) zodat de container leesbaar blijft.

Plaats een testbestelling en lees DebugView

Gebruik Tag Manager Preview, loop door de shop en rond een bestelling af (met een testbetaalmethode, een kortingscode van 100 procent, of een echte bestelling die je terugbetaalt). Op de bevestigingspagina moet Tag Assistant de purchase trigger één keer laten afgaan, samen met de GA4-tag. Open daarna in GA4 Admin › DebugView, klik op het purchase event en klap het open: je ziet de transactieparameters en, onder Items, elk product met zijn id, naam, prijs en aantal.

Ontbreken de items in DebugView terwijl Tag Assistant ze wel in de datalayer toont, dan leest de tag uit de verkeerde bron of kwam de push pas nadat de tag al was afgegaan. Staat value op 0, dan is het als string of onder de verkeerde sleutel gepusht.

De volgende dag: Monetization-rapporten

Vierentwintig uur later toont Reports › Monetization › Ecommerce purchases de producten, en het overzicht laat omzet en transacties zien. Vergelijk een dag met het orderrapport van je shop: het aantal transacties hoort binnen een of twee te liggen (geweigerde betalingen en terugbetalingen verklaren kleine verschillen), en de omzet klopt tot op de cent als je dezelfde definitie van value hebt gekozen. Een groot verschil in transacties wijst op een bevestigingspagina die sommige betaalmethoden overslaan (bankoverschrijvingen, redirects van achteraf betalen); een verschil in omzet wijst op de definitie van valuta of btw.

Markeer purchase als key event als dat nog niet zo is (GA4 doet het meestal automatisch), en laat hem eenmaal per event tellen.

Vijf fouten die je omzetdata breken

Terugbetalingen, ook gedeeltelijke

A refund event met de oorspronkelijke transaction_id draait de purchase terug in de rapporten van GA4 (volledige terugbetaling) of alleen de genoemde items (gedeeltelijk, met items en hun aantallen). Het moet komen van de plek die van terugbetalingen weet, en dat is zelden de browser; de meeste shops sturen het server-to-server vanuit het ordersysteem via het Measurement Protocol of een servercontainer. Stuur je geen refunds, onthoud dan dat de omzet in GA4 bruto is, dus vóór retouren, wanneer je hem vergelijkt met de boekhouding.

Als je GA4 via een servercontainer laat lopen

Alles hierboven blijft gelijk: de datalayer, de triggers, de tags, de testbestelling. De purchase-hit gaat van de browser naar je servercontainer en van daaruit naar GA4, in plaats van rechtstreeks naar Google. Daardoor halen adblockers hem niet meer weg (bij een gemiddelde Nederlandse shop is 10 tot 20 procent van de bestellingen onzichtbaar voor GA4 dat alleen in de browser draait) en blijft de GA4-cookie op Safari langer bestaan, zodat de purchase wordt toegeschreven aan de campagne die de bezoeker binnenbracht in plaats van aan "direct".

Er worden twee dingen mogelijk die eerder niet konden. Server-purchases: de backend van de shop kan de bestelling naar de servercontainer sturen zodra de betaling bevestigd is, en vangt zo de bestellingen op waarvan de bevestigingspagina nooit laadde; de Measurebase-plugins voor Shopify, WooCommerce en Shopware doen dit, en de twee kopieën worden ontdubbeld met een gedeeld event-ID, zodat GA4 de bestelling één keer telt. Winst in plaats van omzet: de servercontainer kan de kostprijs van elk item opzoeken en mb_profit aan de purchase toevoegen. Dat doet Profit Tracking voor je, zodat campagnes op marge geoptimaliseerd kunnen worden. De nachtelijke audit controleert of purchase-events een transactie-ID, items en een valuta bevatten, en of browser- en serverkopieën ontdubbeld worden.

Veelgestelde vragen

Heb ik alle funnel-events nodig?

Nee. purchase alleen geeft je al omzet- en productrapporten. Voeg daarna view_item, add_to_cart en begin_checkout toe; die voeden het checkoutfunnelrapport en de meeste remarketingdoelgroepen. De rest is mooi meegenomen.

Moet value btw en verzendkosten bevatten?

Dat maakt GA4 niet uit, zolang je consequent bent. Veel shops gebruiken het ordertotaal dat de klant betaalde (inclusief btw en verzendkosten), omdat dat met de bank klopt; sommige gebruiken de netto productomzet om met de marge te vergelijken. Kies er één en gebruik dezelfde voor de conversiewaarden in Google Ads.

Welke valutacode verwacht GA4?

Een ISO-code van drie letters: EUR, USD, GBP. GA4 rekent in rapporten om naar de valuta van de property, tegen dagkoersen, dus shops met meerdere valuta sturen de valuta van de bestelling mee, geen omgerekend bedrag.

Kan GA4 bestellingen ontdubbelen op transaction_id?

Binnen een sessie op hetzelfde apparaat wel: een opnieuw geladen bevestigingspagina met dezelfde transaction_id wordt genegeerd. Over apparaten, browsers of een later bezoek heen niet. Voorkom de tweede push op de site in plaats van erop te vertrouwen.

Hoe test ik zonder een echte bestelling te plaatsen?

De meeste platforms hebben een testbetaalmethode of een kortingscode van 100 procent. Plaats de bestelling met Tag Manager Preview open, zodat DebugView hem laat zien, en annuleer of restitueer hem daarna in de shop. Filter achteraf je eigen IP als de testbestelling niet mee mag tellen.

Waarom toont Google Ads andere purchase-aantallen dan GA4?

Ads telt conversies op de klikdatum, met een eigen attributie en alleen voor bezoekers die het aan een advertentieklik kan koppelen; GA4 telt op de eventdatum, over alle kanalen. De totalen horen week op week in dezelfde richting te bewegen; identieke dagcijfers zijn niet te verwachten.

Mijn shopplatform stuurt al e-commerce naar GA4. Moet ik dan nog Tag Manager gebruiken?

Gebruik maar één route. Stuurt de integratie van het platform complete, correcte purchase-data met items, houd die dan en voeg geen Tag Manager-tags toe voor dezelfde events. Is het onvolledig of wil je zelf de controle, zet het dan uit en bouw het in Tag Manager zoals hier beschreven.

Verder lezen

Klaar om je tracking-setup te verbeteren?

Gratis starten, geen creditcard nodig. Binnen een kwartier live.

Gratis starten