Skip to content

Tracking & Consent ​

Die Reihenfolge ist verbindlich und nicht verhandelbar:

text
CookieConsent v3
    → Google Consent Mode v2 (Defaults: denied)
    → Google Tag Manager
        → GA4
        → optional Google Ads

GA4 und Google Ads werden ausschließlich als Tags im GTM-Container konfiguriert, niemals parallel im Quelltext eingebaut.

ThemaInhalt
ConsentBanner, Kategorien, Texte, Widerruf, Fassungsnummer
Tag ManagerContainer, Basic gegenüber Advanced, serverseitiges GTM
Was geprüft istdie 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.

ZustandDialogTag Manager
features.cookieConsent: falseneinnein
Flag an, kein Verbraucher, developmentVorschau¹nein
Flag an, kein Verbraucher, preview oder productionneinnein
Flag an, Tracking an, PUBLIC_ENVIRONMENT ≠ productionjanein
Flag an, Tracking an, production, keine Entscheidungjanein²
Flag an, Tracking an, production, nur notwendigeneinnein²
Flag an, Tracking an, production, Statistik oder mehrneinja

¹ 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 ​

DateiZweck
src/lib/tracking/consent.tsKategorien → Consent-Mode-Signale, Ausgangszustand
src/lib/tracking/consumers.tswer eine Kategorie verbraucht — der Erweiterungspunkt
src/lib/tracking/plan.tsder Ladeplan: ob und wie geladen wird
src/lib/tracking/gtm.tsSkript-Adresse des Tag Managers
src/lib/tracking/texts.tsdie Bannertexte, abgeleitet aus der Konfiguration
src/lib/tracking/ui.tsdie Konfiguration von CookieConsent
src/lib/tracking/client.tsEinstiegspunkt; lädt die Oberfläche nur bei Bedarf nach
src/lib/tracking/consent-ui.tsstartet CookieConsent und meldet Entscheidungen zurück
src/components/tracking/Consent.astroentscheidet, ob überhaupt etwas ausgegeben wird
src/components/tracking/ConsentBoot.astrodas Inline-Skript im Kopf
src/styles/consent.cssDesign 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.