Naar de inhoud

GidsenShopify7 min leestijd

Het GA4 purchase-event op Shopify oplossen (stap voor stap)

Hoe het Shopify purchase-event nu werkt, waarom Additional Scripts niet meer werkt en de beperkingen van een GA4-purchase vanuit een custom pixel.

Gepubliceerd
Gecontroleerd
Herstel het purchase-event en controleer de afgeronde bestelling.

Daniil MaximkinProduct & Solutions Engineer

Kort antwoord

Shopify publiceert checkout_completed via Customer Events, geïsoleerd van je thema. Ik begin met de ondersteunde Google & YouTube-app voor GA4-aankoopmeting: Google ondersteunt geen Google-tags in custom pixels van Shopify. Gebruik één purchase-route, controleer transaction_id, value, currency en items en vergelijk daarna met Shopify-bestellingen.

— Daniil

Belangrijkste punten

  • Shopify vuurt de purchase af via Customer Events (web pixels) in een sandbox — code in Additional Scripts of checkout.liquid kan hem niet meer naar GA4 sturen.
  • 28 augustus 2025 was de einddatum voor Plus; niet-Plus-winkels moesten hun Thank you- en Order status-pagina’s uiterlijk 26 augustus 2026 upgraden. Additional Scripts werd op 28 augustus 2025 alleen-lezen.
  • Google ondersteunt geen Google-tags in custom pixels van Shopify. Bekijk eerst de Google & YouTube-app voordat je een experimentele eigen implementatie onderhoudt.
  • Deduplicatie hangt af van een consistente transaction_id en, vooral, van het afvuren van de purchase vanuit precies één route — nooit het native GA4-kanaal en een custom pixel tegelijk.
  • Controleer binnen de beperkingen van de sandbox: DebugView en Realtime voor het live event, daarna orderreconciliatie om de dekking te controleren zodra de rapporten zijn verwerkt.
In deze gids

Als je Shopify-winkel vroeger purchases naar GA4 stuurde en nu niets meer stuurt, of ze dubbel stuurt, controleer dan waar het purchase-event wordt verzameld. Deze gids behandelt de huidige eventroute van Shopify, de uitgefaseerde scriptlocaties en de beperkingen van een custom pixel.

Hoe vuurt Shopify het purchase-event vandaag af?

Shopify heeft de checkout ondergebracht in een uitbreidbaar model, en tracking is daarin meeverhuisd. In plaats van scripts in checkoutpagina’s te injecteren, registreer je een pixel die zich abonneert op de events die Shopify uitstuurt — page views, product views, add-to-cart en, voor de voltooide bestelling, checkout_completed.

Het belangrijke architecturale feit is de sandbox. Custom pixels draaien niet op je storefront-pagina. Ze draaien in een aparte, beperkte context met hun eigen window, geïsoleerd van de scripts van je thema. Dat is bewust zo: het voorkomt dat pixels van derden alles op de pagina kunnen uitlezen. Maar het heeft twee gevolgen waar bijna elke kapotte setup die ik tegenkom op stukloopt:

  • Een GTM-container of gtag-snippet die door je thema wordt geladen, kan geen checkout-events zien, omdat de pixel en het thema in verschillende contexten leven.
  • Alles wat je vanuit de checkout wilt versturen — je GA4-tag inbegrepen — moet binnen de pixel zelf worden geladen, of vanuit Shopify naar een server worden doorgestuurd.

Zodra je dat doorhebt, kloppen de oude symptomen ineens: de reden dat de GTM van je thema geen purchases meer opving, is geen bug — het is de sandbox die zijn werk doet.

Wat is er gebeurd met Additional Scripts en checkout.liquid?

Twee oudere methodes duiken nog op in handleidingen en overgenomen winkels, en allebei zijn ze doodlopende wegen.

  • Aanpassingen aan checkout.liquid waren de manier waarop Plus-winkels tracking in de checkout injecteerden. Die route is uitgefaseerd ten gunste van checkout extensibility.
  • Additional Scripts op de Thank you- en Order status-pagina’s was een oude trackinglocatie. 28 augustus 2025 was de einddatum voor Plus. Voor niet-Plus-winkels maakte Shopify Additional Scripts toen alleen-lezen en werd de pagina-upgrade uiterlijk 26 augustus 2026 verplicht. Order status-script tags hadden dezelfde einddatums per plan. Controleer de paginaversie en bestelgegevens in plaats van één datum op alle winkels toe te passen.

De praktische conclusie: als een winkel zijn purchase-tag nog in Additional Scripts heeft staan, controleer dan of die daadwerkelijk draait en of een andere integratie de purchase verstuurt. Als de tag niet meer draait, migreer het ontbrekende event naar een ondersteunde pixel en verifieer het met een testbestelling en orderreconciliatie.

De beperkingen van een custom-pixelimplementatie

Google ondersteunt geen Google-tags in custom pixels van Shopify en beveelt de Google & YouTube-app aan. Een tag in een sandbox kan data versturen terwijl andere functies niet werken. Ik bekijk de ondersteunde app voordat ik voor een eigen implementatie kies.

Het volgende is een hypothetisch custom-pixelvoorbeeld, geen ondersteunde Google-opzet of geteste productie-implementatie. Het toont de eventmapping voor een geüpgradede checkout met kortingen per bestelregel. Kortingen op bestelniveau en prijzen inclusief belasting moeten apart met de bestelling worden gecontroleerd; dit voorbeeld bewijst die aanpassingen niet. De sandbox laadt gtag zelf in plaats van de tag van het thema te gebruiken.

// Shopify admin → Settings → Customer events → Add custom pixel
// Deze code draait in de pixel-sandbox van Shopify: hij heeft zijn eigen
// window, geïsoleerd van je thema. Een GTM/gtag-snippet op het thema is
// HIER NIET bereikbaar, dus laad gtag binnen de pixel en vuur van hieruit af.

const MEASUREMENT_ID = 'G-XXXXXXXXXX';

// 1) Laad gtag.js in de sandbox en configureer GA4
const s = document.createElement('script');
s.src = 'https://www.googletagmanager.com/gtag/js?id=' + MEASUREMENT_ID;
s.async = true;
document.head.appendChild(s);

window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', MEASUREMENT_ID, { send_page_view: false });

// 2) Vuur de purchase precies één keer af, wanneer de checkout wordt voltooid
analytics.subscribe('checkout_completed', (event) => {
  const checkout = event.data.checkout;
  if (!checkout.order?.id || !checkout.currencyCode || !checkout.lineItems?.length) return;

  const items = (checkout.lineItems || []).map((line) => ({
    item_id: line.variant && (line.variant.sku || line.variant.id),
    item_name: line.title,
    item_variant: line.variant && line.variant.title,
    price: line.finalLinePrice.amount / line.quantity,
    quantity: line.quantity,
  }));

  gtag('event', 'purchase', {
    transaction_id: checkout.order.id,
    value: items.reduce((sum, item) => sum + item.price * item.quantity, 0),
    currency: checkout.currencyCode,
    tax: checkout.totalTax && checkout.totalTax.amount,
    shipping:
      checkout.shippingLine &&
      checkout.shippingLine.price &&
      checkout.shippingLine.price.amount,
    items: items,
  });
});

Als je in plaats daarvan via Google Tag Manager routeert, duwt hetzelfde analytics.subscribe-blok een gelijkwaardig object naar een dataLayer die wordt uitgelezen door een container die binnen de pixel is geladen. De regel verandert niet: de doeltag moet samen met het abonnement in de sandbox leven, niet in het thema. Voor de mechaniek van dat object, zie de toelichting over de dataLayer.

Waar moet de GA4 items-array aan voldoen?

Google noemt items en transaction_id verplichte purchase-parameters. Een ontvangen event zonder die parameters bewijst niet dat de ecommerce-implementatie aan het gedocumenteerde schema voldoet.

Volgens de ecommerce-referentie van Google heeft elk item minstens één van item_id of item_name nodig; beide versturen maakt controle eenvoudiger. price, quantity en item_variant maken de itemrapporten bruikbaar. Een paar regels die je debugtijd besparen:

  • value is de som van price × quantity per item, zonder belasting en verzending. Gebruik eenheidsprijzen na korting en verstuur belasting en verzending in hun aparte parameters. Vergelijk dezelfde waardedefinitie met Shopify.
  • currency is verplicht en moet een ISO-code van drie letters zijn. Stuur in winkels met meerdere valuta’s de valuta waarin de klant daadwerkelijk heeft afgerekend, en zorg dat value in diezelfde valuta staat.
  • item_id moet stabiel zijn. Gebruik consequent de SKU of het variant-ID, want dat is de sleutel die GA4 gebruikt om items tussen events aan elkaar te koppelen.

Hoe dedupliceert GA4 Shopify-purchases?

GA4 dedupliceert purchases met dezelfde transaction_id in webstreams. Google beschrijft dit voor transacties van dezelfde gebruiker; het is geen garantie voor verschillende gebruikerscontexten of appstreams. Twee regels zijn belangrijk:

  1. Vuur de purchase vanuit precies één route af. Het native GA4-kanaal van Shopify en een custom pixel kunnen dezelfde bestelling in verschillende gebruikerscontexten versturen. Een overeenkomend transaction ID bewijst op zichzelf niet dat deduplicatie werkte. Kies één route en controleer het ontvangen event.
  2. Stuur nooit een lege transaction_id. GA4 dedupliceert alle purchases met een lege transaction ID samen, dus een lege waarde helpt niet alleen niet — hij smelt echte bestellingen actief samen tot één. Stuur altijd het echte order-ID.

Als je al hebt gezien dat GA4 hoger uitkomt dan Shopify, is deduplicatie de eerste plek om te kijken. Het bijbehorende artikel over waarom de omzet van GA4 niet overeenkomt met Shopify laat zien hoe je die duplicaten opspoort tijdens reconciliatie.

Verificatieprotocol

Verifiëren binnen de sandbox werkt anders dan het verifiëren van een normale pagina, en het gebruikelijke eerste instinct — GTM Preview of Tag Assistant openen — werkt hier grotendeels niet. Dit is de volgorde die ik vertrouw.

  1. DebugView, met een echte bestelling. Zet een testapparaat in debugmodus en doorloop een echte checkout. Kijk hoe de purchase binnenkomt in DebugView en inspecteer de parameters: is transaction_id aanwezig en niet leeg, klopt value, klopt currency, bevat items de producten?
  2. Realtime als sanity check. De purchase zou binnen enkele ogenblikken in het Realtime-rapport moeten verschijnen. Realtime bevestigt dat het event binnenkomt, zelfs als het koppelen met DebugView lastig is.
  3. Accepteer de beperkingen van de tools. Tag Assistant en GTM Preview kunnen niet inhaken op de pixel-sandbox zoals ze dat op een pagina doen. Het event daar niet zien is te verwachten; het is geen bewijs dat de pixel faalde. Beoordeel succes op basis van DebugView en Realtime.
  4. Elke betaalroute, niet één. Test kaartbetaling, Shop Pay, express- of wallet-checkout en post-purchase-upsells. Shopify publiceert checkout_completed één keer: meestal op Thank you, maar bij post-purchase-flows op de eerste upsellpagina. Als die pagina niet laadt, wordt het event niet verstuurd.
  5. Vergelijk na verwerking. Vergelijk GA4-purchases met Shopify-bestellingen op transaction ID nadat de rapporten zijn verwerkt. Volgens Google kan verwerking 24–48 uur duren. Reconciliatie meet geregistreerde dekking; het bewijst niet dat browsertracking elke bestelling heeft vastgelegd ongeacht consent of een pagina die niet laadt.

Veelvoorkomende faalpatronen

  • Dubbele pixels. Het native GA4-kanaal en een custom pixel kunnen dubbele purchases versturen. Gebruik één purchase-route en controleer ID’s en gebruikerscontext voordat je concludeert dat de omzet verdubbeld is.
  • Ontbrekende express-routes. De purchase is gekoppeld aan een flow die Shop Pay of express checkout overslaat, waardoor wallet-bestellingen nooit een purchase versturen en verdwijnen tijdens reconciliatie. Dit is hetzelfde type fout als in kapotte Shopify-checkouttracking.
  • Blokkering door consent. Onder een consentbanner kan analytics-opslag geweigerd worden, waardoor de pixel voor die bezoekers niet mag versturen. Dat is een legitiem verlies, geen bug om omheen te coderen. Dit betreft technische implementatie, geen juridisch advies — zie voor het mechanisme consent mode v2.
  • Verouderde tag in Additional Scripts. De purchase staat nog op een uitgefaseerde scriptlocatie. Controleer de paginaversie en of een vervangende pixel of app het event al verstuurt voordat je de opzet wijzigt.
  • Lege of niet-overeenkomende transaction_id. Een lege ID smelt bestellingen samen; een ID dat per route verschilt, ondermijnt deduplicatie volledig. Zie de gerelateerde uitleg bij GA4 registreert geen purchases.

Beperkingen

Een custom pixel heeft de beperkingen van browsertracking en is niet de ondersteunde Shopify-integratie van Google. De ingestelde privacyvoorwaarden kunnen de pixel blokkeren zolang consent is geweigerd. Een pagina die niet laadt of browserblokkering kan de verzameling ook verhinderen.

De sandbox beperkt ook het debuggen, dus verificatie leunt op DebugView, Realtime en reconciliatie in plaats van de gebruikelijke page-level inspectors. En een pixel repareert de purchase; hij herstelt op zichzelf geen upstream-events zoals add-to-cart als die door dezelfde checkout-migratie kapot zijn gegaan.

Alternatieven

Er zijn drie brede manieren om de Shopify-purchase te versturen, en ze sluiten elkaar niet uit.

  • Native Shopify-integratie. De Google & YouTube-app is de ondersteunde opzet van Google. Controleer vóór installatie of er al een eigen purchase-tag is, zodat niet twee routes dezelfde bestelling versturen.
  • Custom pixel met GTM of gtag (het hypothetische voorbeeld hierboven). Je beheert de code, maar Google ondersteunt deze opzet niet. Eén succesvol verstuurd event bewijst niet dat andere Google-tagfuncties werken.
  • Server-side. Een server-side opzet kan Shopify-orderwebhooks doorsturen terwijl browserevents sessie- en consentcontext aanleveren. Webhooks bevatten geen browsercookies. De opzet vraagt om hosting, monitoring en een consentontwerp; de consentvereiste blijft bestaan.

Als je wilt dat ik de purchase-route voor je kies, controleer en met bestellingen vergelijk in plaats van dat je die zelf onderhoudt, valt dat onder mijn GA4-implementatiewerk; de verificatiemethode is orderreconciliatie.

Als de gids geen uitsluitsel gafEUR 375

Ik doe deze afstemming op je winkel alleen-lezen, voor EUR 375 — schriftelijk oordeel twee werkdagen na de kickoff.

Vraag een Health Check aan

Vragen

Vragen die deze gids beantwoordt

Heb ik het native GA4-verkoopkanaal nog nodig als ik een custom pixel gebruik?

Kies één purchase-route. Twee integraties kunnen dubbele requests versturen; of GA4 beide telt, hangt af van de transactie-ID’s en de gebruikerscontext. De ondersteunde Shopify-route van Google is de Google & YouTube-app, niet Google-tags in een custom pixel. Verwijder dubbele purchase-tags en controleer één bestelling tegenover het ontvangen event.

Kan ik de GTM-container van mijn thema gebruiken om de Shopify-purchase af te vuren?

Niet voor de nieuwe checkout. Een GTM-container in je thema ziet geen checkout- of Thank you-events, omdat die in een aparte sandbox draaien. De ondersteunde route van Google is de Google & YouTube-app. Gtag of GTM in een custom pixel kan data versturen, maar Google ondersteunt dit niet; de andere optie is de purchase server-side versturen.

Waarom laten Tag Assistant of GTM Preview mijn purchase-event niet zien?

De custom pixel draait in een sandbox waarop Tag Assistant en GTM Preview niet kunnen aansluiten zoals op een gewone pagina. Dat is een beperking van de tools, geen bewijs dat het event faalde. Controleer GA4 DebugView en Realtime en bekijk de dekking nadat de rapporten zijn verwerkt.

De purchase vuurt af bij een kaartbetaling maar niet bij Shop Pay of express checkout. Waarom?

Test elke betaalroute afzonderlijk. Shopify triggert checkout_completed één keer, meestal op Thank you of op de eerste upsellpagina bij een post-purchase-flow. Als die pagina niet laadt, vuurt het event niet af. Een ontbrekend event is niet genoeg om een fout in de abonnementen of een app aan te wijzen.

Wat moet ik gebruiken als transaction_id?

Gebruik het Shopify order-ID of de ordernaam, dezelfde waarde op elke route, uniek per bestelling. Stuur nooit een lege string: GA4 dedupliceert purchases met een lege transaction_id samen, waardoor je omzet stilletjes in elkaar zakt. Een consistente, niet-lege ID is wat deduplicatie laat werken.

Daniil Maximkin

Hoi, ik ben Daniil.

Ik werk met je samen, van probleemdefinitie tot implementatie en overdracht. Je praat met degene die het werk doet. Ik werk in het Engels en het Russisch.

Geprobeerd en kom je er nog niet uit?

Beschrijf je taak

Het eerste antwoord is gratis, binnen één werkdag. Of schrijf rechtstreeks: next@taskfordaniel.com