Mediya.
Shoeby · data tracking
Toelichting op de GTM-check
6 oktober 2026 · vertrouwelijk

De GTM-check: wat is opgelost en wat staat nog open

Jorn heeft vanuit Mediya de GTM-check gedaan en per punt een actie voorgesteld. Jij hebt per punt de stand bijgehouden en bij vier punten een vraag gesteld. Die beantwoorden we hieronder, en in hoofdstuk 03 staat per container precies wat er aangepast moet worden. Daarnaast hebben we vandaag de live meetcode op shoeby.nl zelf nagekeken, om te zien of de aanpassingen ook echt live staan.

Het meeste is goed opgepakt. Twee punten die als aangepast zijn gemeld, staan nog niet live: de extra Meta-aankoop en de TikTok-aankoop zonder koppel-ID. En het belangrijkste open punt is privacy: klantgegevens die leesbaar in cookies staan. Dat is met een paar uur werk op te lossen.

01 · Stand van zaken

Twaalf punten in één oogopslag

4vragen van jou, beantwoord in hoofdstuk 02
2gemeld als aangepast, maar nog actief in de live versie
4aangepast, maar nog te bewijzen aan de serverkant of half goed
2akkoord, en zo zien we het ook live

02 · Jouw vier vragen

Jouw vragen en ons advies

Vraag 1 · punt 1 uit de sheet

Klantgegevens leesbaar in cookies

Jouw vraag: waarom is dit zo gebouwd, waarvoor wordt het gebruikt, en hoe pas je het goed aan?

Wat er gebeurt. Na een bestelling worden naam, e-mailadres, telefoonnummer en adres van de klant 30 dagen lang als gewone, leesbare tekst in cookies op shoeby.nl gezet. In de live meetcode zien we dat de tags die cookies teruglezen (visitorEmail, visitorPhone, visitorStreet, visitorPostalCode en meer) en doorgeven aan Google Ads, Meta en Google Analytics.

Waarom het waarschijnlijk zo gebouwd is. Google Ads en Meta herkennen een aankoop beter als ze bij die aankoop ook het e-mailadres of telefoonnummer krijgen. Dat heet Enhanced Conversions bij Google en advanced matching bij Meta, en het levert meer gemeten aankopen op. Bij een gastbestelling staan die gegevens niet in de meetcode op de bedankpagina. De oplossing die gekozen is: de gegevens in een cookie bewaren, zodat de tags ze kunnen oppakken. Het doel is dus goed. De plek is verkeerd. Wie het gebouwd heeft, kan dit bevestigen.

Waarom het weg moet.

  • Elk script op de site kan ze lezen, ook scripts van andere partijen zoals chat, reviews en A/B-testen. Dat de tags ze kunnen uitlezen, bewijst dat ze niet afgeschermd zijn.
  • Ze blijven 30 dagen staan, ook als iemand daarna de toestemming intrekt of op een gedeelde computer heeft besteld.
  • De AVG vraagt om zo min mogelijk gegevens en om beveiliging. Google en Meta hebben de gegevens alleen gehasht nodig, dus onleesbaar gemaakt. Leesbaar bewaren is niet nodig voor het doel.

Ons advies: stoppen, opruimen en vervangen. Zonder verlies aan meetkwaliteit, als de vervanging tegelijk live gaat.

  1. Stoppen. De servertag setCookies.EnhancedConversionGuest uitzetten, zodat er geen nieuwe cookies bijkomen.
  2. Opruimen. De bestaande cookies verlopen pas na 30 dagen. Laat de server dezelfde cookies (zelfde naam, pad en domein) overschrijven met een datum in het verleden, minimaal 30 dagen lang. Dan zijn ze bij elke terugkerende bezoeker weg.
  3. Vervangen. De klantgegevens alleen op het moment van de aankoop aanbieden, op de bedankpagina of direct vanuit de order op de server, en niet bewaren. Altijd gehasht naar Google en Meta, en alleen bij marketingtoestemming. In de meetcode staat al een gehashte e-mailvariabele (visitorHashedEmail), daar kan op worden voortgebouwd.

Inspanning: een paar uur inclusief testen. Met het oog op Shopify: daar is dit niet meer nodig, omdat de checkout en de orderkoppeling de klantgegevens direct aanleveren. Dus nu klein en netjes oplossen, niet groot verbouwen.

Vraag 2 · punt 7 uit de sheet

Toegangssleutels leesbaar in de servercontainer

Jouw vraag: is dit nodig, en hoe richt je het dan anders in?

Wat er speelt. In de servercontainer staan de sleutels waarmee Shoeby gegevens naar Meta, TikTok, Snapchat en andere kanalen stuurt. Die staan als leesbare tekst in de tags. Iedereen die de container mag inzien, kan ze kopiëren. Met zo'n sleutel kan iemand namens Shoeby aankopen naar een kanaal sturen. Dat vervuilt de cijfers en de biedstrategie. De sleutels verlopen meestal niet vanzelf.

Ons advies: ja, nodig, maar niet urgent. Er is geen lek, wel een deur die openstaat. Twee dingen nu, één bij Shopify.

  1. Nu: toegang nalopen. Wie heeft rechten op de servercontainer? Oud-medewerkers en bureaus die niet meer betrokken zijn eruit. Shoeby is eigenaar, partijen krijgen alleen de rechten die ze nodig hebben.
  2. Nu: sleutels één keer vernieuwen. Nieuwe sleutel aanmaken, in de tag vervangen, oude intrekken. Maak ze aan op een systeemgebruiker in het eigen bedrijfsaccount van Shoeby, niet op het persoonlijke account van een medewerker of bureau. Dan gaan ze niet verloren als iemand vertrekt.
  3. Bij Shopify: sleutels uit de tags. Centraal bewaren in afgeschermde opslag die de container pas bij het verzenden uitleest, bijvoorbeeld een tabel in Google Cloud met beperkte rechten. Wie de container beheert, ziet de sleutel dan niet meer. Welke variant past, hangt af van waar de servercontainer draait. Dat nemen we mee in het ontwerp.

Inspanning: een tot twee uur voor stap 1 en 2.

Vraag 3 · punt 8 uit de sheet

Enhanced Conversions van Google Ads alleen in de browser

Jouw vraag: in welke container, tag en versie zien jullie enableEnhancedMatch = false?

Waar het staat. Niet in de webcontainer. In de live webcontainer (GTM-TK64Z4J, versie 280) staat Enhanced Conversions juist aan, in de Google Ads-conversietag voor aankopen. De uitgeschakelde instelling zit in de servercontainer op shby.shoeby.nl, in de Google Ads-tag die de aankoop vanaf de server verstuurt. Jorn zag dit in de servercontainer en geeft de exacte tagnaam en het versienummer door.

Wat dit voor jullie betekent. Dit is geen fout die nu opgelost moet worden. Ons advies in de sheet was juist: niet zomaar aanzetten. Aan de browserkant werkt het. Aan de serverkant heeft het pas zin als de server ook de gehashte klantgegevens en de toestemming meekrijgt. Dat hangt direct samen met vraag 1.

Ons advies: zo laten staan. In het Shopify-meetfundament richten we het aan de serverkant in, met de klantgegevens uit de order zelf.

Vraag 4 · punt 9 uit de sheet

Nieuwe of bestaande klant doorgeven aan Google Ads

Jouw vraag: is dit nodig? Graag advies.

Wat het is. Google Ads kan per aankoop zien of het om een nieuwe of een bestaande klant gaat. Dan zie je per campagne hoeveel nieuwe klanten hij oplevert. En je kunt het algoritme laten sturen op nieuwe klanten, bijvoorbeeld door daar meer voor te bieden. Nu staat het uit. Dat is geen meetfout.

Waarom het voor Shoeby interessant is. Shoeby heeft een groot bestaand klantenbestand. Zonder dit onderscheid weet je niet of advertentieomzet van nieuwe klanten komt of van klanten die toch al zouden kopen. Voor groei is dat het verschil tussen nieuwe omzet en omzet die je opnieuw inkoopt.

De voorwaarde. Het werkt alleen als het kenmerk per order klopt. Iemand die al jaren in de winkel koopt maar voor het eerst online bestelt, is geen nieuwe klant. Dat vraagt een koppeling met het klantsysteem of een klantenlijst in Google Ads.

Ons advies: niet nu op het huidige platform. Wel meenemen in het Shopify-meetfundament. Daar eerst vier tot zes weken alleen meten, en pas daarna besluiten of de biedstrategie erop stuurt.

03 · Wijzigingen per container

Precies wat er aangepast moet worden

Per wijziging: in welke container, welke tag of variabele, hoe het nu staat, waar het naartoe moet en hoe je test dat het werkt. De webcontainer hebben we zelf uitgelezen. Tag-ID's zie je in GTM terug in de adresbalk als je de tag opent, bijvoorbeeld …/tags/882. De servercontainer is niet openbaar. Daar gebruiken we de tag- en variabelenamen uit Jorns check.

Servercontainer

shby.shoeby.nl · draait op Google Cloud · namen uit Jorns check

S1

Stoppen met klantgegevens in cookies

Hoogste prioriteit
Waar
Tag setCookies.EnhancedConversionGuest
Nu
Zet naam, e-mail, telefoon en adres 30 dagen als leesbare cookies op shoeby.nl.
Aanpassen
Tag pauzeren en publiceren. Pas doen als W5 live staat, anders vallen de klantgegevens voor Google Ads en Meta weg.
Test
Testbestelling als gast. In de browser (DevTools > Application > Cookies) mogen geen nieuwe visitor…-cookies verschijnen.
S2

Bestaande cookies opruimen

Samen met S1
Waar
Nieuw tagsjabloon Cookie opruimen plus een tag op basis daarvan
Nu
Cookies die al gezet zijn blijven tot 30 dagen staan.
Aanpassen
Tag die dezelfde cookies overschrijft met een verloopdatum in het verleden. Naam, domein en pad exact overnemen uit de tag van S1. In de webcontainer zien we deze acht namen; controleer in S1 of het er meer zijn.
const setCookie = require('setCookie');
const getCookieValues = require('getCookieValues');
const namen = ['visitorEmail', 'visitorName', 'visitorLastName',
  'visitorPhone', 'visitorStreet', 'visitorPostalCode',
  'visitorCity', 'visitorCountry'];
namen.forEach(function (naam) {
  if (getCookieValues(naam).length) {
    setCookie(naam, '', {
      domain: data.cookieDomain,   // zelfde domein als in S1
      path: '/',
      'max-age': 0,
      secure: true,
      samesite: 'Lax'
    });
  }
});
data.gtmOnSuccess();
Rechten in het sjabloon: Reads cookie values en Sets a cookie voor deze namen. Trigger: elk page_view-verzoek van shoeby.nl. 35 dagen laten draaien, daarna tag en sjabloon verwijderen.
Test
Met een browser die de cookies nog heeft een pagina laden. Daarna zijn de visitor…-cookies weg.
S3

Snapchat alleen bij marketingtoestemming

Bewijs nodig
Waar
De vier Snapchat-servertags: PAGE_VIEW, VIEW_CONTENT, ADD_CART en PURCHASE
Nu
Gemeld als aangepast. We kunnen het niet zien.
Aanpassen
Exact dezelfde trigger of uitzondering als de Meta-servertag. Bestaat die niet, dan een triggervoorwaarde op de event data: ad_storage is gelijk aan granted. Die parameter stuurt de Google-tag in de webcontainer al mee.
Test
Preview van de servercontainer, twee keer: marketing geweigerd (geen Snapchat-tag vuurt) en marketing geaccepteerd (alle vier vuren).
S4

Variabele js.adRedaction repareren

Bewijs nodig
Waar
Variabele js.adRedaction
Nu
Er stond een toewijzing (cookiesMark = false) waar een vergelijking hoort. Gemeld als aangepast.
Aanpassen
cookiesMark === false. De variabele moet true geven als marketing niet geaccepteerd is.
Test
In de preview, bij het tabblad Variables: marketing geweigerd geeft true, geaccepteerd geeft false.
S5

Koppel-ID gelijk voor TikTok en Snapchat

Check
Waar
TikTok Events API-tag (CompletePayment) en Snapchat-servertag PURCHASE
Nu
Onbekend welke waarde in het veld Event ID staat.
Aanpassen
Event ID vullen met Event Data event_id. Dat is de waarde die de GA4-purchase uit de webcontainer meestuurt en die Meta al gebruikt. Daarmee horen W2 en W3 bij deze wijziging.
Test
In de preview dezelfde waarde zien bij browser en server. Na 48 uur in TikTok en Snapchat Events Manager: aankopen als ontdubbeld gemarkeerd.
S6

Toegang en sleutels

Nodig, niet urgent
Waar
Beheer > Gebruikersbeheer van de servercontainer, en de sleutelvelden in de Meta-, TikTok- en Snapchat-servertags
Nu
Sleutels staan als leesbare tekst in de tags.
Aanpassen
  1. Gebruikers nalopen. Iedereen die niet meer betrokken is eruit, publiceren alleen voor de beheerder.
  2. Per kanaal een nieuwe sleutel aanmaken op een systeemgebruiker van Shoeby. Meta via Bedrijfsinstellingen > Systeemgebruikers, TikTok en Snapchat via de pixelinstellingen. Nieuwe sleutel in de tag zetten, publiceren en daarna de oude intrekken.
  3. Later, bij Shopify: sleutels uit de tags halen. Omdat de container op Google Cloud draait, kan dat met een Firestore-lookupvariabele. De sleutel staat dan in Firestore met beperkte rechten. Een constante variabele is geen oplossing, want die is net zo leesbaar.
Test
Na het vervangen komen events in elk kanaal nog binnen (Events Manager, testevent). Daarna de oude sleutel intrekken.
S7

Enhanced Conversions en nieuwe klant

Geen wijziging nu
Waar
Google Ads-conversietag voor aankopen in de servercontainer
Aanpassen
Niets. Enhanced Conversions en nieuwe-klantrapportage blijven uit. Ze komen in het Shopify-meetfundament, met klantgegevens en het kenmerk nieuw of bestaand uit de order.

Webcontainer

GTM-TK64Z4J · live versie 280 · zelf uitgelezen op 6 oktober

W1

Meta Purchase2 echt uitzetten

Niet live
Waar
Tag-ID 882, Facebook Pixel-sjabloon, aangepast event Purchase2. Vuurt bij elke sendTransaction.
Nu
Staat in de live versie nog actief, naast de gewone Purchase.
Aanpassen
Pauzeren én de versie publiceren. Na twee weken verwijderen. Kijk ook of er in de servercontainer een Purchase2-tag staat, en zo ja, zet die ook uit.
Test
Meta Pixel Helper of Events Manager bij een testbestelling: alleen Purchase, geen Purchase2.
W2

TikTok-aankoop met koppel-ID

Niet live
Waar
Tag-ID 925, Aangepaste HTML met ttq.track("CompletePayment", …)
Nu
Geen event_id, dus TikTok kan browser en server niet koppelen.
Aanpassen
Een derde argument toevoegen. Gebruik dezelfde Event ID-variabele die in de Meta Purchase-tag bij Event ID staat; die gaat ook als event_id mee in de GA4-purchase. Laat de bestaande waarden staan.
<script>
ttq.track("CompletePayment", {
  value: "{{waarde, zoals nu}}",
  currency: "EUR",
  content_ids: "{{artikelnummers, zoals nu}}",
  content_type: "product",
  description: "order"
}, {
  event_id: "{{Event ID}}"  // zelfde als Meta Purchase
});
</script>
Test
TikTok Pixel Helper toont event_id. In de preview van de servercontainer staat dezelfde waarde.
W3

Snapchat-aankoop dezelfde koppel-ID

Aanpassen
Waar
Tag-ID 991, Snap Pixel-sjabloon, event PURCHASE, veld client_dedup_id
Nu
Gevuld met een eigen Unique Event ID-variabele (sjabloon). Die waarde gaat niet naar de server. Naar de server gaat de Event ID die Meta ook gebruikt.
Aanpassen
client_dedup_id vullen met dezelfde Event ID-variabele als de Meta Purchase-tag. transaction_id blijft het ordernummer.
Test
In de preview dezelfde waarde zien als bij de server-PURCHASE uit S5.
W4

Los veld analytics_storage gelijktrekken

Half goed
Waar
Aangepaste JavaScript-variabele die in de Google-tag (tag-ID 304, stuurt naar shby.shoeby.nl) als parameter analytics_storage wordt meegestuurd
Nu
statistics == 1 || marketing == 1: granted bij statistiek óf marketing.
Aanpassen
Alleen statistiek, net als de Consent Mode-tag (tag-ID 1010) die het al goed doet.
function () {
  var c = window.CookieConsent && window.CookieConsent.consent;
  return c && c.statistics === true ? "granted" : "denied";
}
In de servercontainer nakijken welke tags of triggers op Event Data analytics_storage sturen. Die gaan daarna vanzelf goed.
Test
Alleen marketing accepteren: de parameter moet denied zijn.
W5

Klantgegevens uit de datalaag in plaats van cookies

Vóór S1
Waar
De variabelen van het type eigen cookie: visitorCountry, visitorCity, visitorStreet, visitorLastName, visitorPhone, visitorPostalCode, visitorName en visitorEmail (cookie). Ze worden gebruikt door de Google Ads-gebruikersgegevens (Enhanced Conversions), de Meta Purchase-tags (advanced matching) en de user_data in de Google-tag.
Nu
Ze lezen de leesbare cookies uit S1. Het e-mailadres voor Google Ads komt al uit de datalaag (visitorEmail), de gehashte versie ook (visitorHashedEmail).
Aanpassen
  1. De webshop (Salesforce Commerce Cloud) zet op de bevestigingspagina, ook bij gastbestellingen, dezelfde velden in de datalaag. Dat is werk voor de ontwikkelaar van de webshop.
  2. Elke cookievariabele omzetten naar het type datalaagvariabele, met dezelfde variabelenaam. Dan blijven alle tags die ze gebruiken werken.
  3. Pas daarna S1 en S2.
Test
Testbestelling als gast. In de preview zijn de variabelen gevuld vanuit de datalaag, en in Google Ads blijft de dekking van Enhanced Conversions gelijk.
Volgorde. W1, W2, W3, W4, S3, S4 en S5 kunnen direct, in één ronde. W5 eerst, daarna S1 en S2 samen. S6 los daarvan. Per wijziging graag het versienummer plus een schermafbeelding uit de preview, met marketing wel en niet geaccepteerd.

04 · Alle punten

Jouw notitie naast wat wij live zien

#PuntJouw notitieWat wij live zien op 6 oktoberStatus
1Klantgegevens leesbaar in cookiesVraag om adviesDe tags lezen naam, e-mail, telefoon en adres uit leesbare cookies.Zie vraag 1
2Snapchat meet zonder marketingtoestemmingAangepastDe Snapchat-tags in de browser vuren alleen bij marketingtoestemming. De servertags zijn niet openbaar, die kunnen we niet zien.Bewijs nodig
3Fout in variabele voor advertentie­toestemmingAangepastIn de webcontainer staat de vergelijking goed. De servervariabele is niet openbaar.Bewijs nodig
4Statistiek­toestemming hangt ook af van marketingStaat goedDe toestemmingsinstelling voor Google klopt: alleen statistiek. Maar de Google-tag stuurt nog een los veld analytics_storage naar de server met de oude regel, statistiek óf marketing.Half goed
5Meta Purchase2 naast PurchaseGepauzeerdStaat in de live versie 280 nog actief op elke aankoop.Niet live
6Google Ads aankoop via browser en serverGeen dubbeltellingDe browsertag stuurt het ordernummer mee, waarop Google ontdubbelt.Akkoord
7Sleutels leesbaar in servercontainerVraag om adviesServercontainer is niet openbaar.Zie vraag 2
8Enhanced Conversions alleen in browserVraag: waar?Webcontainer: staat aan. De uitgeschakelde instelling zit aan de serverkant.Zie vraag 3
9Nieuwe of bestaande klantVraag om adviesStaat uit in de browsertag.Zie vraag 4
10Productrapportage alleen via serverPrima zoStaat uit in de browsertag, zoals bedoeld.Akkoord
11TikTok-aankoop zonder koppel-IDAangepastDe live TikTok-aankooptag stuurt nog geen event_id mee. TikTok kan browser en server dus nog niet aan elkaar koppelen.Niet live
12Snapchat-aankoop zonder koppel-IDAangepastDe browsertag stuurt nu een koppel-ID en het ordernummer mee. De koppel-ID komt uit een andere variabele dan de ID die naar de server gaat.Check server

Hoe we dit hebben gecontroleerd. De webcontainer van shoeby.nl is openbaar. We hebben op 6 oktober de gepubliceerde versie opgehaald (GTM-TK64Z4J, versie 280) en de tags, triggers en variabelen uitgelezen. Bij punt 5 en 11 kan het zijn dat de aanpassing wel in een werkruimte staat, maar nog niet is gepubliceerd. De servercontainer is niet openbaar. Die punten kunnen we pas toetsen met leestoegang of een export.

05 · Vervolg

Afspraken voor vandaag

  1. Ronde 1, direct: W1, W2, W3, W4, S3, S4 en S5. Dit is configuratie in GTM, zonder ontwikkelwerk aan de webshop.
  2. Ronde 2, klantgegevens: eerst W5 (webshop zet gegevens in de datalaag), daarna S1 en S2 samen. Wie pakt het ontwikkelwerk in de webshop op?
  3. Sleutels: S6, stap 1 en 2. Wie is eigenaar van de bedrijfsaccounts bij Meta, TikTok en Snapchat?
  4. Bewijs per wijziging: versienummer plus een schermafbeelding uit de preview, met marketing wel en niet geaccepteerd.
  5. Leestoegang tot de servercontainer voor Mediya: dan toetsen we de S-punten zelf.

Samenhang met Shopify. Punt 1, 7, 8 en 9 lossen we nu klein op en richten we in het Shopify-meetfundament structureel in: klantgegevens uit de order, sleutels in afgeschermde opslag, Enhanced Conversions aan de serverkant en het onderscheid tussen nieuwe en bestaande klanten.