Was das VG Hannover entschieden hat
Geklagt hatte ein Zeitungsverlag gegen den Niedersächsischen Landesbeauftragten für den Datenschutz. Auslöser war eine Nutzerbeschwerde. Das Cookie-Banner bot auf der ersten Ebene nur „Alle akzeptieren“ und „Einstellungen“, und im Hintergrund lief der Google Tag Manager, bevor jemand irgendetwas angeklickt hatte. Die Behörde beanstandete beides. Der Verlag klagte, das Gericht wies die Klage ab und hielt den Bescheid für rechtmäßig.
Zwei Feststellungen, beide unangenehm konkret.
Ablehnen gehört auf die erste Ebene. Ein Banner, das die Ablehnung hinter „Einstellungen“ versteckt, ist rechtswidrig. Die Einwilligung muss sich genauso leicht verweigern wie erteilen lassen.
Der Google Tag Manager ist eigenständig einwilligungspflichtig. Nicht die Tags darin. Der Container selbst.
Das Testlabor der Aufsichtsbehörde hatte protokolliert, dass schon vor jeder Banner-Interaktion die IP-Adresse und Gerätedaten an Google-Server in den USA übermittelt wurden. Damit war für das Gericht der Tatbestand des § 25 Abs. 1 TDDDG erfüllt. Die Ausnahme in Abs. 2 Nr. 2 verlangt, dass der Zugriff unbedingt erforderlich ist, um den vom Nutzer ausdrücklich gewünschten Dienst bereitzustellen. Das verneinte das Gericht: Der GTM diene den Interessen des Betreibers, nicht denen der Nutzer, biete ihnen keine eigene Funktion und sei nicht alternativlos.
Für Marketing-Teams ist das eine ungewohnte Perspektive. Intern gilt der Tag Manager als Infrastruktur. Rechtlich ist er ein Drittdienst, auf den man auch verzichten könnte.
Was passiert, wenn gtm.js lädt
Der Standard-Einbau steht im <head>, meist direkt hinter dem Charset-Tag. Sobald der Parser dort ankommt, läuft eine Kette ab, an deren Ende Daten das Endgerät verlassen haben.
- Verbindungsaufbau zu
www.googletagmanager.com. DNS-Auflösung, TLS-Handshake. Der Handshake überträgt den Zielhost über SNI im Klartext, die TCP-Verbindung die IP-Adresse des Besuchers. GET /gtm.js?id=GTM-XXXXXX. Der Request trägt IP-Adresse, User-Agent,Accept-Languageund, je nach Referrer-Policy, die aufgerufene URL.- Ausführung im Seitenkontext. Der Container liest den
dataLayer, Bildschirmmaße, Sprache, gesetzte Cookies. Er entscheidet, was danach passiert. - Nachladen. Typischerweise folgt
gtag/js, dann der erste Treffer an/g/collect.
Schritt 1 und 2 genügen bereits. Kein Cookie, kein Klick, keine Einwilligung, und trotzdem sind IP-Adresse und Geräteeigenschaften bei einem US-Anbieter angekommen.
Ein Seitenaufruf, Standard-Snippet im `<head>`, Banner noch unberührt. Jeder Schritt zeigt, was das Endgerät verlässt.
Schritt 1/7 · 0 ms
Parser erreicht den head
kein RequestVerlässt das Endgerät
- nichts
Bis hierher ist alles unkritisch. Das Snippet steht im Markup und wartet auf Ausführung.
Beispielhafter Ablauf. Timings illustrativ, Requests und Header entsprechen dem Standard-Snippet.
Warum „kein Cookie“ nicht „kein § 25“ bedeutet
§ 25 Abs. 1 TDDDG kennt zwei Tatbestände: das Speichern von Informationen in der Endeinrichtung und den Zugriff auf Informationen, die dort bereits gespeichert sind. Cookies sind der bekannteste Fall, nicht der einzige.
Der Europäische Datenschutzausschuss hat das in den Guidelines 2/2023 zur technischen Reichweite von Art. 5 Abs. 3 ePrivacy-Richtlinie (Version 2.0, angenommen am 7. Oktober 2024) für Techniken ohne Cookie durchdekliniert: URL- und Pixel-Tracking, lokale Verarbeitung im Browser, Tracking allein über die IP-Adresse, Identifier in IoT-Kontexten. „Information“ ist dabei ausdrücklich nicht auf personenbezogene Daten begrenzt.
Wer also einwendet, der Container setze doch selbst gar nichts, verteidigt die falsche Hälfte der Norm.
Der Container-Mythos, und warum er nicht mehr trägt
„Der GTM ist neutral, er transportiert nur.“ Dieses Argument hat jahrelang Audits überlebt, weil es technisch halb stimmt: Ein leerer Container schreibt tatsächlich keine Analytics-Cookies. Nur beantwortet das eine Frage, die das Gesetz nicht stellt.
Das Gericht hat die Prüfung an zwei Punkten festgemacht, beide für Betreiber gut nachvollziehbar. Erstens die Zweckrichtung: Der Tag Manager erleichtert dem Betreiber die Verwaltung seiner Skripte, und für den Besucher, der eine Nachrichtenseite aufschlägt und einen Artikel lesen will, ändert er daran genau nichts. Zweitens die Erforderlichkeit. Tags lassen sich auch anders ausliefern, etwa direkt im Quellcode oder über eine europäische Alternative. Was ersetzbar ist, ist nicht unbedingt erforderlich.
Was Consent Mode nicht heilt
Hier liegt die teuerste Fehlannahme. Sie ist verbreitet, weil Google zwei Varianten anbietet und der Unterschied in der Oberfläche kaum sichtbar wird.
Im Basic Consent Mode laden die Google-Tags nicht, bevor der Nutzer mit dem Banner interagiert hat. Im Advanced Consent Mode laden sie beim Öffnen der Seite und senden im Zustand denied cookielose Pings. Beides steht so in Googles eigener Dokumentation. Advanced ist der bequemere Weg und liefert die Grundlage für Conversion-Modelling, deshalb steht er in den meisten Implementierungsleitfäden.
Genau dieser Zustand lag dem Hannoveraner Verfahren zugrunde. Requests vor der Interaktion, Übermittlung von IP-Adresse und Gerätedaten, Einwilligung noch offen. Dass die Pings cookielos sind, ändert am Tatbestand des § 25 Abs. 1 nichts: Der Zugriff auf die Endeinrichtung ist bereits erfolgt, der Datenabfluss in die USA ebenfalls.
Consent Mode ist ein Signalprotokoll für das Verhalten der Tags. Den Ladezeitpunkt des Containers steuert er nicht.
Fünf Irrtümer, gegen die Rechtslage gehalten
| Verbreitete Annahme | Wie das Gericht und die Norm das sehen |
|---|---|
| „Der GTM ist nur ein Container und verarbeitet selbst keine Daten.“ | Der Abruf von gtm.js übermittelt IP-Adresse und Gerätedaten. Das Gericht wertet den GTM als eigenständig einwilligungspflichtig. |
| „Ohne Cookie greift § 25 nicht.“ | § 25 Abs. 1 erfasst Speichern und Zugriff. Der EDSA rechnet auch IP-, Pixel- und URL-basierte Techniken dazu. |
| „Consent Mode V2 löst das Problem.“ | Advanced Mode lädt die Tags vor der Einwilligung. Das Signal steuert ihr Verhalten, nicht den Ladezeitpunkt des Containers. |
| „Der GTM ist technisch notwendig, sonst funktioniert unser Tracking nicht.“ | Erforderlich ist, was der Nutzer für den Dienst braucht. Tags lassen sich anders ausliefern, der GTM ist nach dem Urteil nicht alternativlos. |
| „Ein Banner mit ‚Alle akzeptieren‘ und ‚Einstellungen‘ reicht." | Ablehnen muss auf der ersten Ebene möglich sein, mit derselben Leichtigkeit wie das Akzeptieren. |
Fünf Fragen entlang der beiden Punkte aus dem Urteil. Antworten bleiben im Browser, nichts wird gesendet.
Noch offen: 5/5
Orientierung für die technische Prüfung, keine Rechtsberatung. Der Einzelfall gehört anwaltlich bewertet.
Drei Wege raus, und was sie kosten
Es gibt keine Variante ohne Preis. Wer etwas anderes verspricht, verkauft Compliance-Theater.
Weg 1: Container komplett hinter die CMP
Der GTM wird erst geladen, wenn eine Einwilligung vorliegt. Ein Dreizeiler im CMP-Callback, in jeder Consent-Lösung in einer Stunde erledigt.
Der Preis ist hoch. Bei DACH-typischen Consent-Raten zwischen 30 und 40 % sehen Sie zwei Drittel Ihres Traffics gar nicht mehr, auch nicht anonym. Kein Modelling, keine Ladezeit-Messung, keine Server-Fehler-Erkennung. Für Sites, deren Reporting reine Marketing-Attribution ist, geht das. Für alles mit Produktverantwortung nicht.
Weg 2: CMP-Gating mit Event-Queue
Der Container bleibt der zentrale Verteiler, wird aber erst nach dem Consent-Signal instanziiert. Damit Interaktionen, die vor der Antwort passieren, nicht verloren gehen, puffert eine kleine Queue sie im Speicher und spielt sie nach der Freigabe in den dataLayer ein.
Technisch der ehrlichste Kompromiss für reine Client-Side-Setups. Sie behalten die GTM-Oberfläche, verlieren keine frühen Events der einwilligenden Nutzer und laden vorher nichts von Google. Was bleibt: Ohne Einwilligung gibt es weiterhin keine Daten, und die Messung hängt weiter an Browser-Skripten, die Safari, Firefox und Adblocker beschneiden.
Weg 3: First-Party-Loader plus Server-Container
Der Loader kommt von Ihrer eigenen Subdomain, etwa sgtm.ihredomain.de, ausgeliefert aus einem Server-Container in einer EU-Region. Der Browser spricht mit Ihrer Infrastruktur, nicht mit googletagmanager.com. Erst der Server entscheidet, was er an welche Plattform weitergibt, bereinigt oder angereichert.
Das löst drei Dinge auf einmal: Der Third-Party-Abruf beim Seitenaufruf entfällt, die IP-Adresse endet auf Ihrem Server statt bei Google, und die Consent-Prüfung wandert an eine Stelle, die Sie kontrollieren und protokollieren können. Dazu kommt der Nebeneffekt, für den die meisten Teams das Projekt überhaupt budgetieren: Server-gesetzte Cookies umgehen das 7-Tage-Limit, das Safari ITP client-seitig gesetzten Cookies auferlegt.
Derselbe Container, drei Ladezeitpunkte. Die Zeile unter den Tabs ist der Vergleich, der Code darunter die Umsetzung.
- Request vor Einwilligung
- ja, mehrere
- Host beim Seitenaufruf
- googletagmanager.com
- Interaktionen vor dem Klick
- werden erfasst
- Cookie-Laufzeit in Safari
- 7 Tage (ITP)
Der Zustand aus dem Verfahren vor dem VG Hannover.
<head>
<meta charset="utf-8">
<!-- Laeuft, sobald der Parser hier ankommt. Ohne Consent-Pruefung. -->
<script>(function(w,d,s,l,i){
w[l]=w[l]||[];
w[l].push({'gtm.start': new Date().getTime(), event:'gtm.js'});
var f=d.getElementsByTagName(s)[0], j=d.createElement(s);
j.async=true;
j.src='https://www.googletagmanager.com/gtm.js?id='+i;
f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');</script>
</head>Die Auslieferung selbst ist unspektakulär. Ein Reverse-Proxy oder ein Edge-Worker reicht, der /metrics/* auf den Server-Container mappt und die Antwort mit einer eigenen Cache-Policy zurückgibt.
# nginx: Loader und Transport laufen unter der eigenen Domain.
# Kein Request an googletagmanager.com, kein Third-Party-Kontext.
location /metrics/ {
proxy_pass https://sgtm-container.internal:8080/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
# IP-Weitergabe ist eine bewusste Entscheidung, keine Voreinstellung.
# Für Zero-PII am Edge: Header nicht setzen oder auf /24 kürzen.
proxy_set_header X-Forwarded-For "";
proxy_hide_header Set-Cookie;
add_header Cache-Control "private, max-age=900" always;
}
// Cloudflare Worker, gleiche Aufgabe ohne eigenen Reverse-Proxy.
// Die Region des Containers bleibt EU, der Client sieht nur Ihre Domain.
export default {
async fetch(request, env) {
const url = new URL(request.url);
if (!url.pathname.startsWith('/metrics/')) return fetch(request);
const upstream = new URL(url.pathname.replace('/metrics', ''), env.SGTM_ORIGIN);
upstream.search = url.search;
const headers = new Headers(request.headers);
headers.delete('cf-connecting-ip');
headers.delete('x-forwarded-for');
headers.set('x-ds-region', 'eu');
return fetch(new Request(upstream, { method: request.method, headers, body: request.body }));
},
};
Was Server-Side nicht leistet
Ein Satz, der in jedem zweiten Sales-Deck fehlt: Server-Side Tagging ersetzt keine Einwilligung.
Der First-Party-Loader beendet den Third-Party-Abruf und den US-Transfer beim Seitenaufruf. Er macht aus Remarketing kein einwilligungsfreies Verfahren. Wer über den Server-Container Conversions an Google Ads oder Meta schickt, verarbeitet weiterhin personenbezogene Daten für Werbezwecke und braucht dafür eine Rechtsgrundlage. Auch ein eigener Loader, der ohne Consent lädt und Nutzer-Identifier liest, fällt unter § 25 Abs. 1.
Was sich ändert, ist die Beweislage. Sie können zeigen, welcher Request wohin ging, welches Feld vorher entfernt wurde und welcher Consent-Zustand dabei galt. Nachweisen muss das ohnehin der Verantwortliche, nicht die Behörde, so steht es in Art. 7 Abs. 1 DSGVO.
Fünf Schritte bis zum nächsten Release
Wenn der Digital Omnibus kommt
In Brüssel liegt seit November 2025 ein Vorschlag, der die Cookie-Regeln aus der ePrivacy-Richtlinie in die DSGVO überführen soll, unter anderem als neuer Art. 88a. Vorgesehen sind eine Ablehnung per Einzelklick und Sperrfristen, bevor dieselbe Einwilligung erneut abgefragt werden darf. Stand August 2026 verhandeln Rat, Parlament und Kommission noch, ein Abschluss wird für Ende 2026 erwartet.
Zwei Dinge folgen daraus. Geltendes Recht ist es nicht, Planungsgrundlage auch nicht. Und die Richtung entlastet niemanden, der heute vor der Einwilligung lädt: Die Ablehnung per Einzelklick ist genau die Anforderung, die das VG Hannover schon aus geltendem Recht abgeleitet hat.
Wer jetzt sauber baut, baut in dieselbe Richtung.
Die Architektur ist dabei unabhängig vom Stack. Ob der Shop auf Shopify oder Shopware läuft, das Frontend Next.js, Astro oder TYPO3 heißt: Der Loader liegt auf Ihrer Subdomain, der Server-Container in einer EU-Region, und die Consent-Prüfung sitzt an einer Stelle, die Sie protokollieren. Wie das mit einer konkreten CMP aussieht, steht im Usercentrics-Guide für Server-Side GTM; die Wirtschaftlichkeit rechnet der Consent-Loss-Rechner vor.
