Blog · Shopify
Shopify mit Checkout Extensibility sauber tracken
Seit Checkout Extensibility läuft Tracking im Shopify-Checkout nur noch in einer Sandbox. Das ist gut für Sicherheit und Ladezeit, aber es ändert, wie man misst und wie man testet.
Was sich geändert hat
Früher klebte man Skripte in checkout.liquid oder in „Additional Scripts“. Das gibt es nicht mehr. Im Checkout bleiben zwei Wege: App-Pixel und Custom Pixel. Shopify lädt App-Pixel in einer strikten Sandbox (Web Worker) und Custom Pixel in einer „lax“ Sandbox, einem iframe mit allow-scripts und allow-forms. Beide haben keinen Zugriff auf das DOM der Seite.
In meinen Projekten nutze ich für den Checkout ein einziges Custom Pixel, das den Google Tag Manager lädt. Apps setze ich nur ein, wenn es nicht anders geht. Der Grund ist Kontrolle: Apps dokumentieren selten, welche Bibliotheken sie nachladen. Ich habe erlebt, dass sich App-Skripte und eigenes Tracking gegenseitig gestört haben, etwa bei Meta-Conversions. Die Fehlersuche dauerte länger als jede Implementierung.
Die Grenzen der Sandbox
Fast jedes Problem im Custom Pixel lässt sich auf eine dieser fünf Grenzen zurückführen:
- Kein DOM. Klicks, Formulare oder Elemente lassen sich nicht direkt auslesen. Was Sie messen können, kommt aus den Shopify-Events (
analytics.subscribe) und deminit-Objekt. - Falsche URL. GA4 und andere Tags sehen die URL der Sandbox, nicht die des Shops. Die echte URL steht im Event-Kontext und muss aktiv als
page_locationmitgegeben werden. Fehlt sie, fehlen auch UTM-Parameter und Klick-IDs. - Cookies nur über eine API.
document.cookiemeint das iframe, nicht den Shop. Cookies der Hauptseite liest man überbrowser.cookie.get(), und das ist asynchron: Es liefert ein Promise, keinen String. - Consent kommt von Shopify. Der Einwilligungsstatus steht in
init.customerPrivacyund ändert sich über das EventvisitorConsentCollected. Wer zusätzlich das CMP-Cookie selbst parst, baut eine zweite Wahrheit. - Wenig Werkzeug. Die Versionshistorie im Admin ist kurz, und getestet wird am veröffentlichten Pixel. Ich führe den Pixel-Code deshalb in Git und veröffentliche nur, was dort committet ist.
Ein Fehler, der lehrreich war
In einem Projekt sollte nur ein redundantes Consent-Skript aus dem Pixel entfernt werden. Beim Testen fielen Sprünge im Consent-Status auf. Ein schneller Workaround las daraufhin zusätzlich das CMP-Cookie aus. Weil browser.cookie.get() ein Promise liefert, wurde das Ergebnis als leerer Consent gedeutet. Ab da gingen Checkout-Events mit „abgelehnt“ raus, obwohl Nutzer zugestimmt hatten. Ein Rollback hat es behoben.
Drei Regeln, die ich daraus mitgenommen habe:
- Consent nur aus einer Quelle lesen, im Pixel aus
init.customerPrivacyund dem Consent-Event. - Änderungen an Consent-Logik end-to-end testen, bis zum ausgehenden Request im sGTM, nicht nur bis zum Data Layer.
- Marketing und Data vor jedem Deployment informieren, auch bei „kleinen“ Änderungen.
Ein zweites Muster sehe ich häufig im Theme: Liquid-Werte, die ohne Anführungszeichen in einen dataLayer.push geschrieben werden. Für manche Kunden entsteht dadurch ungültiges JavaScript. Der ganze Push bricht ab, es gibt keinen page_view und keine GA4-Session. Werte aus Liquid gehören immer durch | json.
QA: in welchem Fenster Sie suchen müssen
Der häufigste Satz beim Testen ist „der Data Layer ist leer“. Meist schaut man nur in das falsche Fenster. Jedes Custom Pixel läuft in einem eigenen iframe mit eigenem window, eigenem dataLayer und eigenem GTM.
- Chrome DevTools öffnen, Tab Console.
- Oben links im Kontext-Menü (Standard:
top) das iframe des Pixels wählen. Shopify benennt es nach dem Musterweb-pixel-sandbox-CUSTOM-…. Jedes Custom Pixel erscheint als eigener Eintrag, App-Pixel laufen als Worker. - Im richtigen Kontext
dataLayereingeben. Jetzt sehen Sie die Events, die das Pixel an GTM übergibt. - Im Tab Network nach der Domain Ihres Server-Containers filtern. Dort prüfen Sie den Request selbst: Event-Name,
page_location, Parameter und die Consent-Felder (gcs,gcd). - Im sGTM-Preview kontrollieren, welche Tags feuern und was sie an die Plattformen senden.
Der GTM-Vorschaumodus des Web-Containers verbindet sich mit der Sandbox nach meiner Erfahrung nicht zuverlässig. Ich teste deshalb über Console, Network und sGTM-Preview.
Checkliste vor dem Go-live
page_locationkommt aus dem Event-Kontext, nicht aus der Sandbox- Consent stammt aus
init.customerPrivacy, kein eigenes Cookie-Parsing - Jeder
browser.cookie-Zugriff wird mitawaitgelesen purchasefeuert einmal, auch bei Neuladen der Danke-Seite- Pixel-Code liegt versioniert in Git
- Keine App sendet dieselben Events zusätzlich
Quellen: Shopify: Web Pixels API · Shopify: Sandbox-Umgebungen