dataLayer erklärt: so funktioniert er im Google Tag Manager
Der dataLayer ist die Schnittstelle zwischen Website und Google Tag Manager. Mit Beispielen für generate_lead und purchase und den typischen Fehlern.

Was ist der dataLayer?
Der dataLayer, auf Deutsch Datenschicht, ist eine JavaScript-Liste auf deiner Website, über die die Seite dem Google Tag Manager mitteilt, was gerade passiert und welche Werte dazu gehören. Ein Formular wurde abgeschickt, eine Bestellung abgeschlossen, ein Produkt angesehen: Die Website schreibt das als Eintrag in den dataLayer, und der Google Tag Manager liest es aus. Anhand der Einträge entscheidet er, welche Tags auslösen und welche Werte etwa an Google Analytics 4 oder Google Ads gehen.
Der Vorteil des dataLayer ist die Trennung von Darstellung und Daten. Ohne Data Layer müsste der Google Tag Manager Informationen aus dem sichtbaren Seiteninhalt herauslesen, etwa den Bestellwert aus einer Tabelle auf der Bestätigungsseite. Das bricht, sobald jemand das Layout ändert. Mit dem dataLayer übergibt die Website die Werte in einer festen Form, unabhängig davon, wie die Seite aussieht. Das macht Tracking stabiler und Änderungen am Design ungefährlicher.
Wie der dataLayer im Google Tag Manager funktioniert
Technisch ist der dataLayer ein gewöhnliches Array mit dem Namen dataLayer im globalen Fensterobjekt. Angelegt wird er mit der Zeile window.dataLayer = window.dataLayer || [], die vorhandene Einträge übernimmt und sonst eine leere Liste erstellt. Der Container-Code des Google Tag Managers nutzt dieselbe Liste. Beim Laden verarbeitet er alles, was schon drin steht, und überwacht danach jeden neuen Eintrag.
Intern führt der Google Tag Manager ein Datenmodell. Jeder neue Eintrag wird mit dem bisherigen Stand zusammengeführt. Ein Wert, den du einmal hineinschreibst, bleibt also bis zum nächsten Seitenaufruf erhalten, solange er nicht überschrieben wird. Das ist praktisch für Werte wie Seitentyp oder Sprache, kann aber bei Bestelldaten zu Problemen führen, wenn alte Produktdaten im Datenmodell stehen bleiben und in den nächsten Kauf rutschen.
Die eingebauten Seitenaufruf-Trigger hängen ebenfalls am dataLayer. Der Google-Tag-Manager-Container schreibt beim Laden selbst Ereignisse hinein: gtm.js für den Seitenaufruf, gtm.dom, sobald das Dokument aufgebaut ist, und gtm.load, wenn das Fenster vollständig geladen ist. Die Trigger Seitenaufruf, DOM bereit und Fenster geladen reagieren genau auf diese Einträge. Noch früher lösen die Trigger Einwilligungsinitialisierung und Initialisierung aus.
| Ereignis im dataLayer | Zeitpunkt | Trigger im Google Tag Manager |
|---|---|---|
| gtm.init_consent | Als Allererstes, vor allen anderen Triggern | Einwilligungsinitialisierung |
| gtm.init | Direkt danach, vor dem Seitenaufruf | Initialisierung |
| gtm.js | Sobald der Container-Code lädt | Seitenaufruf |
| gtm.dom | Wenn das HTML-Dokument aufgebaut ist | DOM bereit |
| gtm.load | Wenn die Seite mit Bildern und Skripten vollständig geladen ist | Fenster geladen |
Die Reihenfolge im dataLayer entscheidet, ob Werte rechtzeitig da sind. Werte, die schon beim ersten Seitenaufruf gebraucht werden, etwa Seitentyp, Sprache oder ob ein Kunde eingeloggt ist, gehören in einen Eintrag vor dem Container-Code. Dann stehen sie bereit, wenn das Google-Tag für GA4 beim Seitenaufruf auslöst. Ereignisse, die erst durch eine Handlung entstehen, also Anfrage, Kauf oder Klick, schreibt die Seite in dem Moment, in dem sie passieren. Wird ein Wert für den Seitenaufruf erst nach dem Container geschrieben, ist er beim ersten Treffer noch leer, und genau dieser Treffer fehlt später in den Berichten.
Passend dazu: Cross-Domain-Tracking in GA4 richtig einrichten
dataLayer.push mit Beispielen
Neue Einträge schreibst du mit dataLayer.push, einer Funktion, die einen Eintrag an das Ende der Liste hängt. Entscheidend ist der Schlüssel event. Nur ein Eintrag mit event erzeugt im Google Tag Manager ein Ereignis, auf das ein Trigger vom Typ benutzerdefiniertes Ereignis reagieren kann. Ein Eintrag ohne event aktualisiert nur das Datenmodell.
Ein Beispiel für eine Anfrage: Nach dem erfolgreichen Absenden des Kontaktformulars ruft die Website dataLayer.push({event: 'generate_lead', form_name: 'kontakt', lead_type: 'angebot'}) auf. Im Google Tag Manager legst du einen Trigger für das benutzerdefinierte Ereignis generate_lead an und hängst das GA4-Ereignis-Tag und das Conversion-Tag für Google Ads daran. Der Formularname kommt über eine Variable als Parameter mit.
Ein Beispiel für einen Kauf: Auf der Bestellbestätigung schreibt der Shop zuerst dataLayer.push({ecommerce: null}), um alte Werte zu leeren. Danach folgt dataLayer.push({event: 'purchase', ecommerce: {transaction_id: 'B-10482', value: 89.90, currency: 'EUR', items: [{item_id: 'K-12', item_name: 'Handmühle', price: 89.90, quantity: 1}]}}). Das GA4-Ereignis-Tag kann die E-Commerce-Daten direkt aus dem dataLayer übernehmen, Google Ads bekommt Wert, Währung und Transaktions-ID über Variablen.
- event: der Name des Ereignisses, exakt so, wie der Trigger ihn erwartet.
- Parameter: zusätzliche Werte wie form_name, die Tags mitschicken sollen.
- ecommerce: das Objekt mit Bestell- und Produktdaten im Format, das GA4 erwartet.
- transaction_id: eine eindeutige Bestellnummer, mit der doppelte Käufe erkannt werden.
Datenschichtvariablen im Google Tag Manager
Um einen Wert aus dem dataLayer in einem Tag zu verwenden, legst du im Google Tag Manager eine benutzerdefinierte Variable vom Typ Datenschichtvariable an. Als Name trägst du den Schlüssel ein, zum Beispiel form_name. Für verschachtelte Werte nutzt du die Punktschreibweise, also ecommerce.value oder ecommerce.transaction_id. Die Variable liefert dann bei jedem Ereignis den aktuellen Wert aus dem Datenmodell.
Für Datenschichtvariablen lohnt sich etwas Ordnung. Lege einen Standardwert fest, wenn ein Wert fehlen kann, und benenne sie nachvollziehbar, etwa mit dem Präfix DL. Wer nach Monaten in den Google-Tag-Manager-Container schaut, sieht dann sofort, woher ein Wert stammt. Prüfe außerdem, ob ein Tag den Wert als Zahl oder als Text erwartet. Ein Bestellwert mit Komma statt Punkt wird von Google Ads und GA4 nicht als Zahl erkannt.
Passend dazu: Consent Mode: Warum nach der Zustimmung Daten fehlen
Welche typischen Fehler gibt es beim Data Layer?
Die meisten Probleme entstehen nicht im Google Tag Manager, sondern im Code der Website. Sie bleiben oft lange unbemerkt, weil die Seite normal funktioniert und nur die Daten fehlen oder doppelt ankommen.
- Überschreiben: Steht nach dem Container-Code noch einmal dataLayer = [], verliert der Google Tag Manager die Verbindung, und spätere Einträge verpuffen.
- ecommerce nicht geleert: Ohne ecommerce: null vor dem neuen Eintrag mischen sich Produkte aus einer früheren Aktion in den Kauf.
- Falscher Ereignisname: Generate_Lead und generate_lead sind für den Trigger zwei verschiedene Ereignisse.
- Push zu früh: Das Ereignis wird beim Klick auf Absenden geschrieben, nicht erst nach der erfolgreichen Antwort des Servers.
- Personenbezogene Daten: E-Mail-Adresse oder Name landen im dataLayer und werden von einem Tag mitgeschickt.
Prüfen kannst du den dataLayer in der Vorschau des Google Tag Managers. Links siehst du die Liste der Ereignisse, und für jedes zeigt der Reiter Datenschicht den Stand des Datenmodells zu diesem Zeitpunkt. In der Browser-Konsole kannst du außerdem einfach dataLayer eintippen und die komplette Liste ansehen.
Praxisbeispiel: Handwerksbetrieb mit Kontaktformular
Ein Elektrobetrieb nutzt ein Formular, das ohne Neuladen der Seite abschickt. Der Formular-Trigger des Google Tag Managers greift dabei nicht zuverlässig, und eine Dankeseite gibt es nicht. Die Lösung ist ein einzelner dataLayer.push im Erfolgsfall des Formulars mit dem Ereignis generate_lead und dem Formularnamen. Seitdem zählen Google Analytics 4 und Google Ads nur Anfragen, die wirklich beim Betrieb angekommen sind, und keine Klicks auf einen Knopf, bei denen eine Pflichtangabe fehlte.
Ein kleiner Onlineshop mit WooCommerce zeigt den zweiten typischen Fall. Ein Plugin schreibt die Kaufdaten in den dataLayer, ein weiteres Plugin für Google Ads ebenfalls. In GA4 erscheinen manche Käufe doppelt, und in einzelnen Bestellungen tauchen Produkte auf, die nur angesehen, aber nicht gekauft wurden. Die Ursache sind zwei Einträge mit purchase und ein ecommerce-Objekt, das vorher nicht geleert wurde. Nach dem Aufräumen gibt es nur noch eine Quelle für den Kauf, die das Objekt vorher leert und eine eindeutige transaction_id mitschickt. Die Zahlen in GA4 und Google Ads passen danach wieder zu den Bestellungen im Shop.
dataLayer sauber einrichten lassen
Trackum öffnet deine Seite in einem echten Browser, erkennt Formulare und Shop, setzt geprüfte Bausteine im Google Tag Manager ein und testet jedes Ereignis in der Vorschau, mit und ohne Einwilligung, bevor etwas live geht. Die Einrichtung mit Google Analytics 4, Consent Mode v2 und bis zu 15 Ereignissen kostet einmalig 150 € zzgl. MwSt. Wenn du schon einen Google Tag Manager hast und wissen willst, ob die Ereignisse stimmen, zeigt der Gratis-Check für 0 € und ohne Anmeldung die Befunde mit Festpreis.
Häufige Fragen
Was ist der dataLayer einfach erklärt?
Der dataLayer ist eine JavaScript-Liste auf deiner Seite, in die die Website Informationen und Ereignisse schreibt. Der Google Tag Manager liest diese Liste und entscheidet anhand der Einträge, welche Tags auslösen und welche Werte sie mitschicken.
Muss der dataLayer vor dem Google Tag Manager stehen?
Die Zeile, die den dataLayer anlegt, sollte vor dem Container-Code stehen, wenn du dort schon Werte für den ersten Seitenaufruf übergeben willst. Spätere Einträge mit dataLayer.push funktionieren auch danach, solange niemand das Array neu anlegt.
Warum löst mein Trigger trotz dataLayer.push nicht aus?
Meist stimmt der Ereignisname nicht exakt, denn der Trigger für benutzerdefinierte Ereignisse unterscheidet Groß- und Kleinschreibung. Ein zweiter häufiger Grund ist ein Push ohne den Schlüssel event, der zwar Werte speichert, aber kein Ereignis auslöst.
Darf ich E-Mail-Adressen in den dataLayer schreiben?
Technisch ja, aber Google Analytics verbietet das Senden personenbezogener Daten wie E-Mail-Adressen. Schreib nur hinein, was du wirklich brauchst, und achte darauf, dass kein Tag solche Werte ungewollt weitergibt.
Quellen
- Google for Developers: Die Datenschicht (dataLayer) developers.google.com
- Google-Tag-Manager-Hilfe: Trigger für Seitenaufrufe support.google.com
- Google-Tag-Manager-Hilfe: Trigger für benutzerdefinierte Ereignisse support.google.com
- Google for Developers: E-Commerce in GA4 messen developers.google.com
- Google-Analytics-Hilfe: Keine personenbezogenen Daten senden support.google.com
Weiterlesen
Cross-Domain-Tracking in GA4 richtig einrichten
Liegen Shop und Kasse auf verschiedenen Domains, verliert der Kauf seine Quelle. So trägst du beide Domains im Google-Tag ein und prüfst, ob der Parameter _gl ankommt.
TechnikConsent Mode: Warum nach der Zustimmung Daten fehlen
Ein Tag, der beim Laden der Seite blockiert war, wird nach der Zustimmung nicht automatisch nachgeholt. So entsteht die Lücke zwischen Cookie-Banner und Tag Manager, und so schließt du sie.
TechnikConversion-Wert richtig übergeben: GA4, Google Ads, Meta
Zeigt jedes System einen anderen Umsatz, liegt es meist am Wert: mal mit, mal ohne Versand. So legst du die Regel fest und setzt sie in GA4, Google Ads und Meta gleich um.
TechnikGA4 in Single-Page-Apps: Seitenaufrufe richtig zählen
Single-Page-Apps wechseln Inhalte ohne Neuladen, ein normaler Google-Tag zählt nur den ersten Aufruf. Wähle die erweiterte Messung oder eigene page_view-Ereignisse, nie beides.
Core Web Vitals: wie Tracking und Cookie-Banner sie beeinflussen
LCP, INP und CLS hängen nicht nur an Bildern und Theme. Auch Tag Manager, Pixel und Cookie-Banner wirken mit. So misst du sauber und verbesserst gezielt.
TechnikGoogle Tag oder Google Tag Manager: was du wirklich brauchst
Der Google Tag und der Google Tag Manager klingen fast gleich, sind aber zwei verschiedene Werkzeuge. So entscheidest du und vermeidest doppelte Einbindung.