Naar de inhoud

GidsenGoogle Analytics 410 min leestijd

GA4 op Shopify: de Google & YouTube-app versus een custom pixel

Hoe GA4 zijn Shopify-data krijgt via de Google & YouTube-app of een custom pixel: eventnamen, transaction_id, consent en wat je zelf in de hand hebt.

Gepubliceerd
Gecontroleerd
Een beheerde app en een aangepaste pixel bieden verschillende routes voor winkelevents.

Daniil MaximkinProduct & Solutions Engineer

Kort antwoord

GA4 op Shopify haalt zijn data uit een van twee bronnen: de Google & YouTube-app, die Shopify en Google onderhouden en die de events van Shopify voor je op het ecommerce-schema van GA4 mapt, of een custom pixel die je zelf schrijft en onderhoudt in Customer Events. De app is sneller opgezet en minder configureerbaar; de pixel is volledig bestuurbaar en helemaal van jou. Beide tegelijk draaien telt purchases dubbel, tenzij de transaction ID's exact overeenkomen.

— Daniil

Belangrijkste punten

  • De Google & YouTube-app is een verkoopkanaal-app van Shopify, gebouwd met Google; hij mapt de standaardevents van Shopify naar GA4-eventnamen en -parameters, waaronder transaction_id, value, currency en items.
  • Een custom pixel in Customer Events geeft jou de eventnamen, de parameters, de items-array, transaction_id en de consent-poort — en de volledige verantwoordelijkheid om ze allemaal correct te houden.
  • De checkout van Shopify draait in een sandbox: webpixels kunnen de DOM niet uitlezen of de dataLayer van de storefront delen, en Google stelt dat Google-tags binnen een custom pixel geen ondersteunde configuratie zijn.
  • GA4 dedupliceert purchases die dezelfde transaction_id delen en waarschuwt dat een lege transaction_id niet-gerelateerde purchases samenvoegt, waardoor twee actieve purchase-routes het aantal meestal opblazen.
  • Additional Scripts en checkout.liquid zijn uitgefaseerd ten gunste van checkout extensibility; een purchase-tag die daar nog staat, stopt met afvuren, dus migreren is kiezen tussen deze twee opties.
In deze gids

GA4 op Shopify heeft twee gangbare instappen: de Google & YouTube-app, of een custom pixel in Customer Events die de events zelf verstuurt. Beide zetten ecommerce-data in je GA4-property. Ze verschillen in wie de mapping schrijft, wie hem onderhoudt, en wat je kunt aanpassen.

Deze gids vergelijkt ze op het niveau van het mechanisme: wat de purchase afvuurt, wat de transaction ID draagt, hoe consent wordt gerespecteerd, en wat er stukgaat. Er komt geen winnaar uit, want het juiste antwoord hangt af van de controle die je nodig hebt en het onderhoud dat je kunt dragen. Server-side doorsturen valt buiten dit stuk; dat is een andere laag.

Wat doet de Google & YouTube-app eigenlijk?

De Google & YouTube-app is een verkoopkanaal-app van Shopify, gebouwd met Google. Hij laadt de tags van Google op de winkel en mapt de standaardevents van Shopify naar de aanbevolen ecommerce-namen van GA4, zodat een purchase GA4 bereikt zonder dat iemand pixelcode schrijft. Jij configureert hem; Shopify en Google onderhouden de mapping.

Hij abonneert zich op de standaardevents van Shopify en mapt ze naar de aanbevolen namen van GA4: product_viewed naar view_item, product_added_to_cart naar add_to_cart, checkout_started naar begin_checkout, en checkout_completed naar purchase, met de omliggende cart-, list-, shipping- en search-events inbegrepen.

De purchase is een compleet GA4-ecommerce-event: transaction_id, value, currency, tax, shipping, coupon, market_id, en een items-array met id, name, brand, variant, price, quantity en SKU. Value is subtotaal min kortingen, exclusief verzending en belasting, en valt standaard terug op USD wanneer het event geen valuta draagt. Elk event draagt ook shopify_event_name en een event_id. Klantgegevens zoals e-mail en telefoon worden alleen toegevoegd waar consent en de Analytics-instellingen dat toestaan.

Wat je bestuurt is configuratie, geen code: je verbindt je GA4-property of voegt handmatig een Google-tag toe, en je kunt events binnen GA4 filteren op shopify_event_name. De mapping, de value-formule en de parameterset liggen vast. Google stelt dat niet elke op code gebaseerde tagfunctie wordt ondersteund, vanwege de sandboxbeperkingen van Shopify.

De purchase is zowel de kracht als het plafond van de app. Hij vuurt af vanuit checkout_completed, dus hij is niet afhankelijk van een bedankpagina-script dat in leven blijft, maar hij verstuurt alleen wat het schema van Google definieert: een refund-event, een custom parameter of je eigen value-definitie valt buiten zijn gedocumenteerde oppervlak.

Wat doet een custom pixel eigenlijk?

Een custom pixel is JavaScript dat je toevoegt onder Customer Events in het Shopify-admin. Het abonneert zich op de standaardevents van Shopify en stuurt GA4 wat jij het opdraagt, via gtag of een GTM-container die binnen de pixel is geladen. Jij kiest de eventnamen, de parameters, de items-array, de transaction_id en de consent-poort.

De pixel draait in de sandbox van Shopify. Custom pixels laden in een soepele sandbox — een iframe dat beperkt is tot scripts en formulieren — en kunnen niet bij het topframe, de DOM niet uitlezen en de dataLayer van de storefront niet delen. In ruil krijg je een gestructureerde event-payload en de Standard API van Shopify. Code die de pagina of window.dataLayer verwacht, vindt geen van beide, en daarom doen snippets die uit een themabestand zijn verplaatst niets.

Binnen de sandbox beslis jij alles wat de app voor je beslist: op welke events je je abonneert, hoe je ze noemt, hoe je items opbouwt, en wat je als transaction_id en value gebruikt. Een purchase-abonnement kan er als volgt uitzien:

analytics.subscribe('checkout_completed', (event) => {
  const checkout = event.data.checkout;
  gtag('event', 'purchase', {
    transaction_id: checkout.order.id,
    value: checkout.subtotalPrice.amount,
    currency: checkout.currencyCode,
    items: checkout.lineItems.map((item) => ({
      item_id: item.variant?.sku ?? String(item.variant?.id),
      item_name: item.title,
      price: item.variant?.price?.amount,
      quantity: item.quantity,
    })),
  });
});

Consent moet jij regelen. De pixel kan init.customerPrivacy lezen en zich abonneren op visitorConsentCollected, en bepaalt vervolgens wat hij wel en niet verstuurt. Shopify draait pixels in consent-regio’s al pas nadat de vereiste doeleinden zijn toegekend, en speelt eerdere events daarna opnieuw af; jouw poort komt daar bovenop.

De ruil is eigenaarschap. Niets werkt je pixel bij wanneer Shopify een schema verandert, dus jij bent eigenaar van de mapping, het testen en de fix. En Google stelt dat Google-tags binnen een custom pixel geen ondersteunde configuratie zijn, dat het hun gedrag niet kan garanderen en dat de ondersteuning van Google die problemen daar niet kan oplossen. Dat is geen reden om een pixel te vermijden die je nodig hebt. De betrouwbaarheid rust dan op jou.

Wat gebeurt er als je beide tegelijk draait?

De app en een custom pixel tegelijk draaien betekent twee purchase-events voor dezelfde bestelling. GA4 dedupliceert purchases die een identieke transaction_id delen, maar wanneer de twee routes verschillende of lege ID’s versturen, telt GA4 de bestelling dubbel. Een lege transaction_id voegt niet-gerelateerde purchases samen.

De regel van GA4 is specifiek: het voegt purchase-events met dezelfde transaction_id op webstreams samen, en een lege transaction_id zorgt ervoor dat GA4 niet-gerelateerde purchases samen dedupliceert. Het helpt alleen wanneer beide routes dezelfde niet-lege identifier versturen. Ze kiezen die onafhankelijk van elkaar — de app leidt zijn eigen ID af uit de bestelling, jouw pixel gebruikt wat jij hebt gekozen — dus een mismatch komt vaak voor en GA4 ziet twee bestellingen. De oplossing is structureel: draai één purchase-route, zet de ene uit voordat de andere aan gaat, en bevestig in DebugView dat één testbestelling één purchase oplevert.

Naast elkaar

De tabel vergelijkt de twee op de criteria die de meeste implementaties bepalen. Het is een beschrijving van afwegingen, geen ranglijst.

CriteriumGoogle & YouTube-appCustom pixel (gtag of GTM)
EventbronStandaardevents van Shopify, gemapt door de appJouw abonnementen op de standaardevents van Shopify
Dekking van purchase en refundGedocumenteerde mapping tot en met purchase; refund-aanpassing valt niet binnen het configureerbare oppervlakJij verstuurt purchase en eventuele refund-events; jij bepaalt de dekking
DeduplicatieDe app genereert zijn eigen transaction_id en event_idJij kiest transaction_id en event_id
Omgaan met consentDraait als pixel onder de Customer Privacy API van Shopify en respecteert de doeleinden die hij aangeeftJij leest het privacy-object en bepaalt zelf welke events erdoor mogen
Data-eigenaarschapMapping in eigendom van Shopify en Google; data belandt in jouw GA4-propertyLogica in jouw eigendom; data belandt in jouw GA4-property
Afhankelijkheid en lock-inAfhankelijk van de app en het Shopify-kanaal waar hij doorheen looptAfhankelijk van de sandbox en het eventschema van Shopify
OnderhoudslastDe leverancier onderhoudt de mapping terwijl het platform verandertJij onderhoudt elke schemawijziging en parameterwijziging
Voor wie het pastWinkels die GA4-ecommerce willen laten draaien met minimale codeWinkels die parameters, events of een poort nodig hebben die de app niet blootlegt

Beslistabel

Koppel je situatie aan een startpunt. Dit zijn standaardkeuzes voor gangbare gevallen, geen regels; een winkel met een developer en ongebruikelijke rapportagebehoeften kan op de custom pixel uitkomen, zelfs waar de app zou werken.

Als je situatie … isKies …
Je wilt standaard GA4-ecommerce-events laten draaien en niemand schrijft pixelcodeGoogle & YouTube-app
Je hebt een event, een parameter of een items-veld nodig dat de app niet verstuurtCustom pixel
Je moet precies bepalen wat er onder je consentbanner afvuurt en wanneerCustom pixel, met je eigen poort
Je migreert van Additional Scripts of checkout.liquid en wilt het ondersteunde padGoogle & YouTube-app
Je draait al een werkende custom pixel en wilt alleen het verouderde script wegHoud de pixel, en zorg dat er geen tweede purchase-route actief is
Je wilt dat de event-mapping voor je wordt onderhouden terwijl Shopify de checkout verandertGoogle & YouTube-app
Je verlies bestaat uit geblokkeerde of afgekapte requests, niet uit de mappingGeen van beide op zichzelf — zie server-side tracking

Wanneer je elk van beide niet gebruikt

Tegen een optie kiezen is makkelijker als je de harde randen kent. De app is het verkeerde gereedschap wanneer je configuratie nodig hebt die hij niet blootlegt; de custom pixel is verkeerd wanneer niemand hem kan onderhouden of wanneer je het door Google ondersteunde pad wilt. Geen van beide lost transportverlies op.

Grijp niet naar de Google & YouTube-app wanneer:

  • Je een refund-event, een custom parameter of een andere value-definitie nodig hebt dan subtotaal min kortingen.
  • Je dezelfde purchase moet routeren naar bestemmingen die zijn mapping niet bedient.
  • Je consent-logica moet afwijken van de doeleinden die de app aangeeft.

Grijp niet naar een custom pixel wanneer:

  • Niemand hem gaat beheren; elke schemawijziging van Shopify wordt een storing die opgemerkt moet worden.
  • Je de configuratie wilt die Google ondersteunt. Google stelt dat Google-tags in een custom pixel niet ondersteund worden en dat de ondersteuning van Google ze niet oplost.
  • Je vertrouwt op Tag Assistant of GTM Preview, die tags op de pagina debuggen en niet in de pixel-sandbox.
  • Standaard ecommerce-mapping is alles wat je nodig hebt — je neemt onderhoud op je zonder winst.

Verwacht van geen van beide dat ze dit oplossen:

  • Signaal dat verloren gaat aan adblockers, gesloten tabbladen of geweigerde consent. Dat is transport, en het antwoord is server-side levering, niet een andere browsertag.
  • Een permanent verschil tussen GA4 en Shopify. De twee systemen tellen anders; reconciliatie is de methode, niet een betere pixel.

Hoe ik dit verifieer in echte implementaties

Ik verifieer door te tellen. Eén purchase-route hoort per bestelling één purchase op te leveren, zichtbaar in DebugView met een overeenkomende transaction_id, en te reconciliëren tegen een Shopify-orderexport. Al het andere — consent, items, currency — wordt tegen diezelfde bestelling gecontroleerd.

  1. Bevestig welke route de purchase bezit. Settings → Customer events toont de geregistreerde pixels. Wijs elke pixel aan die een purchase kan versturen; precies één zou dat moeten kunnen.
  2. Volg een live bestelling in DebugView. Debug een apparaat, doorloop een volledige checkout, en bevestig dat de purchase aankomt met zijn transaction_id, value, currency en items. Test meer dan één checkoutroute voordat je concludeert dat een tag dood is.
  3. Controleer de sleutel tegen de bestelling. De transaction_id die GA4 ontving, moet niet leeg zijn, uniek voor die bestelling, en identiek op elke route die hem verstuurt.
  4. Bevestig dat de advertentieplatforms het eens zijn. Waar Meta meespeelt, hoort Test Events in Events Manager één conversie voor de bestelling te tonen, niet één per browserroute.
  5. Reconciliëer de volgende dag. Vergelijk GA4-purchases op transaction_id met een Shopify-orderexport van een afgesloten periode — dezelfde methode van orderreconciliatie die in een trackingaudit wordt gebruikt.
  6. Bewijs consent in beide richtingen. Bevestig met geweigerde consent dat de tags onderdrukt blijven; ken hem daarna toe en bevestig dat events doorstromen — zie Consent Mode v2.

Veelvoorkomende faalpatronen

De meeste storingen zijn niet exotisch. Het zijn een tweede purchase-route die blijft draaien, een lege transaction_id, een value die aan elke kant anders is gedefinieerd, of gesandboxte code die aannam dat hij de pagina kon lezen.

  • Twee purchase-routes, twee ID’s. De app en een pixel vuren allebei af en versturen verschillende transaction_id-waarden, waardoor GA4 de bestelling dubbel telt.
  • Een lege transaction_id. GA4 dedupliceert elke purchase die hem draagt samen, waardoor niet-gerelateerde bestellingen samenvallen.
  • Een value op de verkeerde basis. De app verstuurt subtotaal min kortingen, exclusief verzending en belasting; een handgeschreven pixel die een brutototaal verstuurt, komt niet overeen met de GA4-rapportage of het netto van Shopify.
  • Gesandboxte code die aannam dat hij de pagina kon lezen. Snippets die uit een themabestand zijn verplaatst, doen stilletjes niets, omdat de sandbox geen DOM en geen gedeelde dataLayer heeft.
  • Debuggen met het verkeerde gereedschap. Een GTM-container in een pixel kan kapot lijken onder GTM Preview of Tag Assistant, die tags op de pagina debuggen en niet in de pixel-sandbox.
  • Geen consent-poort in een custom pixel. Events blijven afvuren voor bezoekers die weigerden — een complianceprobleem, geen voorkeur.
  • Een tag die nog in Additional Scripts staat. Na de upgrade naar checkout extensibility stopt het verouderde veld met uitvoeren, en valt de purchase stil zonder foutmelding.

Beperkingen

Geen van beide opties is een transportfix. Beide zijn afhankelijk van de pixel van Shopify die in de browser draait, dus bestellingen die sneuvelen door blockers, gesloten tabbladen of geweigerde consent blijven verloren, tenzij de levering server-side gaat. Beide laten GA4 anders tellen dan Shopify, omdat GA4 sessies attribueert terwijl Shopify bestellingen registreert, en geen enkele pixelkeuze verandert dat.

De custom pixel voegt eigenaarschap toe — schemawijzigingen, testen, en het door de leverancier aangegeven gebrek aan ondersteuning voor Google-tags daarbinnen. De app voegt een plafond toe: de mapping ligt vast, dus behoeften buiten zijn gedocumenteerde oppervlak hebben een andere route nodig. Geen van beide is een consent-omzeiling, en geen van beide maakt een cijfer dat niet is gereconcilieerd betrouwbaar.

Alternatieven

Als je probleem niet “welke pixel” is, kan het antwoord in een andere laag zitten. Server-side levering verstuurt de purchase vanuit de order-webhook van Shopify in plaats van vanuit de browser, wat het duurzame antwoord is voor signaal dat verloren gaat aan blockers — zie de server-side trackinggids. Offline conversie-imports dekken bestellingen die de browser nooit heeft gezien.

Als je een kapotte purchase repareert in plaats van een architectuur te kiezen, staat de stap-voor-stapopbouw in Het GA4 purchase-event op Shopify oplossen. Is het symptoom ontbrekende purchases, een groter wordend verschil of een kapotte checkout, begin dan bij GA4 registreert geen purchases, de omzetmismatch tussen GA4 en Shopify en kapotte Shopify-checkouttracking. Voor de onderliggende concepten, zie event ID, Consent Mode v2 en first-party tracking.

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

Kan ik gewoon de Google & YouTube-app gebruiken in plaats van een custom pixel?

Vaak wel. De app dekt de standaard ecommerce-route, is de configuratie die Google aanraadt, en zijn mapping wordt voor je onderhouden terwijl Shopify verandert. Een custom pixel verdient zijn plek wanneer je iets nodig hebt dat de app niet blootlegt: een parameter die hij niet verstuurt, een custom event, een specifieke definitie van value, of een consent-poort die jij bestuurt. Verstuurt de app al wat je rapportage nodig heeft, dan voegt een tweede route alleen een manier toe om dubbel te tellen.

Waarom verdubbelden de GA4-purchases nadat ik een custom pixel toevoegde?

Omdat er nu twee purchase-routes actief zijn. GA4 dedupliceert purchases alleen wanneer ze dezelfde transaction_id dragen, en de app en jouw pixel kiezen die ID onafhankelijk van elkaar. Verschillen de strings, dan leest GA4 twee bestellingen; stuurt een van beide een lege transaction_id, dan voegt GA4 juist niet-gerelateerde purchases samen. Zet één route uit en bevestig met een testbestelling in DebugView dat één bestelling één purchase oplevert.

Kan ik met een custom pixel data versturen zonder consent?

Nee. Custom pixels draaien in de sandbox van Shopify en worden geacht het customer-privacy-object te lezen en wat ze versturen te koppelen aan de doeleinden die van toepassing zijn; in regio's die zijn ingesteld om consent te vereisen, draait Shopify pixels pas nadat de bezoeker de vereiste doeleinden toekent, en speelt het eerdere events daarna opnieuw af. Een pixel gebruiken om consent te omzeilen is een probleem met de platformvoorwaarden en juridisch, geen technische truc. Dit betreft technische implementatie, geen juridisch advies.

Kan ik Google Tag Manager binnen een custom pixel laden?

Het draait in de sandbox, maar lees eerst de afweging. Google stelt dat Google-tags die via de custom pixel van Shopify zijn geïmplementeerd niet ondersteund worden, dat het hun gedrag niet kan garanderen en dat de ondersteuning van Google die problemen daar niet kan oplossen. Tag Assistant en GTM Preview zijn gebouwd om tags op de pagina te debuggen, niet code die in de pixel-sandbox draait, dus je bewijs moet uit DebugView en reconciliatie komen. Heb je GTM-achtige controle nodig, reken er dan op dat je het testen zelf in de hand hebt.

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