Erscheinungsbild
Tracking & Consent
Die Reihenfolge ist verbindlich und nicht verhandelbar:
text
CookieConsent v3
→ Google Consent Mode v2 (Defaults: denied)
→ Google Tag Manager
→ GA4
→ optional Google AdsGA4 und Google Ads werden ausschließlich als Tags im GTM-Container konfiguriert, niemals parallel im Quelltext eingebaut.
| Thema | Inhalt |
|---|---|
| Consent | Banner, Kategorien, Texte, Widerruf, Fassungsnummer |
| Tag Manager | Container, Basic gegenüber Advanced, serverseitiges GTM |
| Was geprüft ist | die automatisierten Szenarien und was sie garantieren |
Der Grundsatz
Vor der Entscheidung entsteht keine Anfrage an Google.
In der Vorgabe — Basic Consent Mode — wird der Tag Manager erst geladen, wenn mehr als die notwendige Kategorie erlaubt wurde. Wer nur „Nur notwendige" wählt, löst keine einzige Verbindung zu einem Google-Server aus. Siehe ADR 0008.
Einschalten
Tracking wird ausschließlich in project.config.ts eingeschaltet:
ts
features: {
cookieConsent: true, // Schalter der Consent-Schicht
},
tracking: {
enabled: true, // macht GTM zum Verbraucher der Kategorien
containerId: 'GTM-XXXXXXX',
consentMode: 'basic', // 'advanced' nur bewusst
ga4: true,
googleAds: false,
},
consent: {
categories: ['necessary', 'analytics'],
revision: 1,
},Das Schema erzwingt, dass diese Werte zusammenpassen: GA4 ohne die Kategorie analytics bricht den Build ab, ebenso Tracking ohne Container-ID oder ohne Consent-Schicht. Die vollständige Liste steht unter Feature Flags.
Der Schalter ist das Feature-Flag, nicht der Tag Manager
features.cookieConsent entscheidet, ob es eine Consent-Schicht gibt. Sie gehört nicht Google: Kommen später eingebettete Videos, eine Karte oder ein Captcha dazu, tragen sie sich in src/lib/tracking/consumers.ts ein und füllen denselben Dialog.
Angeboten wird eine Kategorie nur, wenn sie in consent.categories und einen Verbraucher hat. Steht „Marketing" in der Konfiguration, aber es gibt nichts, was Marketing-Cookies setzt, verschwindet die Kategorie aus dem Dialog — und kommt zurück, sobald das zugehörige Feature eingeschaltet wird.
| Zustand | Dialog | Tag Manager |
|---|---|---|
features.cookieConsent: false | nein | nein |
Flag an, kein Verbraucher, development | Vorschau¹ | nein |
Flag an, kein Verbraucher, preview oder production | nein | nein |
Flag an, Tracking an, PUBLIC_ENVIRONMENT ≠ production | ja | nein |
Flag an, Tracking an, production, keine Entscheidung | ja | nein² |
Flag an, Tracking an, production, nur notwendige | nein | nein² |
Flag an, Tracking an, production, Statistik oder mehr | nein | ja |
¹ Bleibt nur die nicht abwählbare Kategorie übrig, ist der Dialog keine Frage: Beide Schaltflächen bewirken dasselbe. Er erscheint deshalb nur in development — zum Ansehen und Gestalten — und sagt in seinem Text auch, dass er eine Vorschau ist.
² Im Advanced Mode lädt der Container bereits hier — mit verweigerten Signalen.
Außerhalb der Produktion erscheint der Dialog, aber es lädt nichts: So lässt er sich ansehen und gestalten, ohne dass ein Vorschaustand dieselben Messkonten füllt wie die echte Website.
Wo was liegt
| Datei | Zweck |
|---|---|
src/lib/tracking/consent.ts | Kategorien → Consent-Mode-Signale, Ausgangszustand |
src/lib/tracking/consumers.ts | wer eine Kategorie verbraucht — der Erweiterungspunkt |
src/lib/tracking/plan.ts | der Ladeplan: ob und wie geladen wird |
src/lib/tracking/gtm.ts | Skript-Adresse des Tag Managers |
src/lib/tracking/texts.ts | die Bannertexte, abgeleitet aus der Konfiguration |
src/lib/tracking/ui.ts | die Konfiguration von CookieConsent |
src/lib/tracking/client.ts | Einstiegspunkt; lädt die Oberfläche nur bei Bedarf nach |
src/lib/tracking/consent-ui.ts | startet CookieConsent und meldet Entscheidungen zurück |
src/components/tracking/Consent.astro | entscheidet, ob überhaupt etwas ausgegeben wird |
src/components/tracking/ConsentBoot.astro | das Inline-Skript im Kopf |
src/styles/consent.css | Design Tokens auf die Variablen von CookieConsent gelegt |
Die Entscheidung, ob und wann geladen wird, fällt zur Bauzeit in plan.ts und steht als JSON im ausgelieferten HTML. Das Skript im Browser führt nur aus. Deshalb lässt sich das Verhalten ohne Browser prüfen — und im gebauten HTML nachlesen.
Kein pauschales Compliance-Versprechen
Der Starter ist technisch consent-ready. Ob ein konkretes Projekt datenschutzkonform ist, hängt von Konfiguration, Texten und rechtlicher Prüfung ab und wird hier nicht behauptet.