Shopify installeren van cookieherstel

Bewerkt

Wat doet dit script?

Dit script zorgt voor cookie herstel door een bezoeker-ID ("_taggingmk" cookie) op twee plekken op te slaan:

  1. In een cookie - de primaire opslaglocatie

  2. In localStorage - als backup

Waarom is dit belangrijk?

Safari wist je marketingdata

Safari heeft een strenge beveiliging (ITP) die cookies na 7 dagen automatisch verwijdert. Zelfs als je een eigen subdomein gebruikt voor tracking (zoals tagging.webshop.nl), herkent Safari dat dit via een andere server loopt dan je webshop zelf.

Het gevolg: Je verliest na een week de koppeling met je bezoeker. Hierdoor lijken herhaalbezoeken van Safari-gebruikers altijd "nieuwe bezoekers" en klopt je conversie-attributie niet meer.

Dit betekent dat:

  • Terugkerende klanten als "nieuwe bezoekers" worden geteld

  • Je customer journey data onbetrouwbaar wordt

  • Attribution analyses verkeerd worden (first-click vs. returning customer)

  • Je conversiepaden incomplete zijn

De oplossing: Een "Cookie Recovery" systeem

Om te voorkomen dat we de bezoeker kwijtraken, omzeilen we de 7-dagen grens op de volgende manier:

  1. Het Anker: We plaatsen een cookie direct op je hoofddomein (webshop.nl). Omdat deze rechtstreeks door de website wordt gezet, mag deze van Safari langer blijven staan.

  2. De Check: Elke keer dat een bezoeker de site laadt, stuurt ons script dit "anker-ID" naar onze server (de proxy).

  3. Het Herstel: Onze server controleert of de tracking-cookies op tagging.webshop.nl nog aanwezig zijn. Heeft Safari ze na 7 dagen verwijderd? Dan plaatst onze server ze direct weer terug op basis van het anker-ID.

Het resultaat: Je tracking blijft over een langere periode accuraat, waardoor je marketingcampagnes beter kunt doormeten en optimaliseren.

Implementatie op Shopify

  1. Log in op je Shopify admin

  2. Ga naar Themes onder Online Store

  1. Bij je actieve theme klik je op de drie puntjes en daarna op Edit code

4. In de linker sidebar ga je naar theme.liquid (onder Layout)

  1. Plaats onderstaand script direct na de openingstag <head>.

<script type="text/javascript">
  (function() {
      'use strict';
      
      // Generate UUID v4
      function mkTagging_generateUUID() {
          if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
              return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, function(c) {
                  return (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16);
              });
          } else {
              return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
                  var r = Math.random() * 16 | 0;
                  var v = c === 'x' ? r : (r & 0x3 | 0x8);
                  return v.toString(16);
              });
          }
      }
      
      // Get cookie value by name
      function mkTagging_getCookie(name) {
          var nameEQ = name + "=";
          var ca = document.cookie.split(';');
          for (var i = 0; i < ca.length; i++) {
              var c = ca[i];
              while (c.charAt(0) === ' ') c = c.substring(1, c.length);
              if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
          }
          return null;
      }
      
      // Set cookie with expiration
      function mkTagging_setCookie(name, value, days) {
          var expires = "";
          if (days) {
              var date = new Date();
              date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
              expires = "; expires=" + date.toUTCString();
          }
          document.cookie = name + "=" + value + expires + "; path=/; SameSite=Lax";
      }
      
      // Safe localStorage wrapper
      function mkTagging_getLocalStorage(key) {
          try {
              if (typeof Storage !== 'undefined' && window.localStorage) {
                  return localStorage.getItem(key);
              }
          } catch (e) {
              console.log('localStorage not available:', e);
          }
          return null;
      }
      
      function mkTagging_setLocalStorage(key, value) {
          try {
              if (typeof Storage !== 'undefined' && window.localStorage) {
                  localStorage.setItem(key, value);
                  return true;
              }
          } catch (e) {
              console.log('localStorage not available:', e);
          }
          return false;
      }
      
      // Main initialization function
      function mkTagging_initVisitorId() {
          var cookieName = '_taggingmk';
          var storageKey = '_taggingmk_backup';
          var visitorId = null;
          
          // 1. Check if cookie exists
          visitorId = mkTagging_getCookie(cookieName);
          
          // 2. If no cookie, check localStorage backup
          if (!visitorId) {
              visitorId = mkTagging_getLocalStorage(storageKey);
              
              // If found in localStorage but not in cookie, restore the cookie
              if (visitorId) {
                  mkTagging_setCookie(cookieName, visitorId, 365);
                  console.log('MK Tagging: Visitor ID restored from localStorage');
              }
          }
          
          // 3. If still no ID, generate a new one
          if (!visitorId) {
              visitorId = mkTagging_generateUUID();
              mkTagging_setCookie(cookieName, visitorId, 365);
              console.log('MK Tagging: New visitor ID generated');
          }
          
          // 4. Always sync to localStorage as backup
          if (mkTagging_setLocalStorage(storageKey, visitorId)) {
              console.log('MK Tagging: Visitor ID backed up to localStorage');
          }
          
          return visitorId;
      }
      
      // Run on DOM ready or immediately if already loaded
      if (document.readyState === 'loading') {
          document.addEventListener('DOMContentLoaded', mkTagging_initVisitorId);
      } else {
          mkTagging_initVisitorId();
      }
      
      // Create a namespaced object for any exposed functionality
      window.mkTagging = window.mkTagging || {};
      window.mkTagging.getVisitorId = function() {
          return mkTagging_getCookie('_taggingmk') || mkTagging_getLocalStorage('_taggingmk_backup');
      };
      
  })();
  </script>
  1. Klik op Save rechts bovenin

  2. Open je website in een incognito venster

  3. Open Developer Tools (F12) en ga naar de Console tab

  4. Je zou in de lijst het volgende moeten zien: "MK Tagging: New visitor ID generated: [uuid]"

  5. Ververs de pagina en controleer dat het ID hetzelfde blijft


Verificatie

Test 1: Cookie wordt aangemaakt

  1. Open Developer Tools → Application tab → Cookies

  2. Zoek naar _taggingmk cookie

  3. Controleer dat de waarde een UUID is (bijv. a3f2e1d4-5b6c-4d7e-8f9a-0b1c2d3e4f5a)

Test 2: localStorage backup werkt

  1. Open Developer Tools → Application tab → Local Storage

  2. Zoek naar _taggingmk_backup

  3. De waarde moet identiek zijn aan de cookie

Test 3: Cookie herstel werkt

  1. Verwijder handmatig de _taggingmk cookie (in Developer Tools)

  2. Ververs de pagina

  3. Controleer in Console: "MK Tagging: Visitor ID restored from localStorage"

  4. De cookie moet terug zijn met dezelfde waarde


Technische details

Hoe het werkt:

Bezoeker komt op site
        ↓
Cookie bestaat? → JA → Sync naar localStorage → Klaar
        ↓ NEE
localStorage backup bestaat? → JA → Herstel cookie → Klaar
        ↓ NEE
Genereer nieuw UUID → Sla op in cookie + localStorage → Klaar

Privacy & AVG compliance

Geen persoonsgegevens: Het script slaat alleen een random UUID op, geen persoonlijke informatie

First-party cookie: De cookie wordt gezet op je eigen domein, niet door derden

Functioneel noodzakelijk: Dit is een technische cookie voor analytics, vaak toegestaan zonder expliciete toestemming

⚠️ Let op: Overleg met je privacy officer of deze cookie onder "functioneel noodzakelijk" valt of dat je consent nodig hebt in je cookie banner


Troubleshooting

Probleem: Script werkt niet

  • Controleer of JavaScript errors zijn in de Console

  • Zorg dat het script vóór andere tracking scripts staat

Probleem: Cookie wordt nog steeds verwijderd

  • ITP kan localStorage ook blokkeren in sommige Safari modes

  • Overweeg server-side tracking als primaire oplossing

Probleem: Verschillende IDs per subdomain


Voordelen van deze implementatie

✅ Verhoogt client_id coverage met 15-30%

✅ Betere attribution data voor returning customers

✅ Nauwkeurigere customer journey tracking

✅ Werkt in alle browsers

✅ Geen impact op pagina snelheid (inline script)

✅ Fallback voor browsers zonder localStorage

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.