Consent Gate: Nichts Optionales läuft, bis der Nutzer zustimmt
Die Regel aus dem Video in einem Satz: Keine Tracking-Pixel, Analysetools oder Skripte von Drittanbietern werden geladen, bis der Nutzer im Cookie-Banner auf „Akzeptieren" klickt. Ein Banner, der erscheint, nachdem der Pixel bereits gefeuert wurde, behebt nichts. Dieses Skill baut den Warte-Teil.
Keine Rechtsberatung. Schreiben Sie niemals „vollständig konform" in Code, Texte oder Berichte. Beschreiben Sie, was die App jetzt tut und was getestet wurde.
Bevor Sie etwas anfassen
- Führen Sie ein Audit durch. Falls für diese App kein
consent-audit-Report vorliegt, führen Sie diesen zuerst aus. Sie benötigen das Inventar: welche Anbieter, wo sie starten, was sie senden. - Fragen Sie den Eigentümer eine Frage pro Tracker: behalten, gaten oder entfernen? Wenn ein Tracker nicht für Entscheidungen oder Werbung genutzt wird, ist Entfernen besser als Gaten. Eine Seite, die nur notwendige Speicherung benötigt, braucht gar kein Banner; fügen Sie keines hinzu.
- Wissen Sie, was die Veröffentlichung freigibt. Gehostete Builder (Lovable usw.) veröffentlichen alle unveröffentlichten Änderungen gemeinsam. Listen Sie diese auf und holen Sie eine Freigabe ein, bevor Sie veröffentlichen.
- Schützen Sie Erstanbieterdaten. Das Gaten von Trackern darf sich nicht auf Login, Zahlungen oder die eigenen Datenbankschreibvorgänge der App (Schülerarbeiten, Fortschritt, Formulare) auswirken. Halten Sie dies im Bericht fest.
Was „gegatet" bedeutet (die Checkliste, die der Fix erfüllen muss)
Laden
- Ein zentraler Lader (
src/lib/consent.ts, siehereferences/consent.ts). Kein Pixel, GTM, gtag, PostHog oder Replay-<script>inindex.html, dem Root-Layout odermain.tsx. - Optionale Skripte werden nicht abgerufen, nicht nur nicht initialisiert: dynamisches
import()oder Script-Injektion erfolgt erst nach Opt-In. - Es werden keine in der Warteschlange befindlichen Events wiedergegeben: Seitenaufrufe vor der Einwilligung werden verworfen, nicht nachträglich gesendet.
- Serverseitige Weiterleitungen (Meta Conversions API,
/api/track, Edge-Funktionen) prüfen dieselbe gespeicherte Entscheidung, die mit der Anfrage gesendet wird. - Host-injizierte Analysen werden an der Quelle deaktiviert (Lovable → Einstellungen → Besucheranalysen aus; Vercel/Netlify/Cloudflare-Analysen aus) oder vor der Injektion gegatet. Das Entfernen eines Skripts nach dem Laden ist zu spät, weil die erste Anfrage bereits abgesendet wurde.
- Google Consent Mode (falls GA/Ads bleiben):
gtag('consent','default',{ad_storage:'denied',analytics_storage:'denied',ad_user_data:'denied',ad_personalization:'denied'})und das gtag-Skript selbst wartet in diesem Setup trotzdem auf Opt-In. Consent Mode „basic", nicht „advanced", da Advanced cookielose Pings vor der Einwilligung sendet.
Der Banner
- Optionale akzeptieren und Optionale ablehnen sind gleich prominent: gleiche Größe, gleicher Stil, gleiche Klickzahl. Plus eine Einstellungen-Option.
- Kategorie-Toggles (Analytik, Werbung usw.) beginnen deaktiviert.
- Das Schließen des Banners (X / Escape) bedeutet Ablehnen.
- Die Entscheidung wird mit einer Version und einer Ablaufzeit (6 bis 12 Monate) gespeichert. Eine Änderung der Anbieterliste erhöht die Version und fragt erneut.
- Ein dauerhafter „Datenschutzeinstellungen"-Link in der Fußzeile öffnet die Einstellungen erneut.
- Der Widerruf stoppt zukünftige Aufrufe und löscht app-eigene optionale Cookies und Speicher (
_ga*,_fbp,_gcl_au,_ttp,ph_*,ajs_*,_hj*,_clck), ohne die Authentifizierung zu beeinträchtigen. - Global Privacy Control (
navigator.globalPrivacyControl === true) wird als Ablehnen für Werbung/Verkauf/Weitergabe behandelt, und der Banner sagt, dass sie beachtet wurde.
Was gesendet wird, auch nach Zustimmung
- Keine E-Mails, Telefonnummern, Namen oder Geburtsdaten in Pixel- oder Analyse-Paketen (kein Meta Advanced Matching, kein
identify(email)). Verwenden Sie eine undurchsichtige ID nur, wenn wirklich nötig. - URLs werden ohne
?queryund#fragmentgesendet (Geschenkcodes, Reset-Tokens, Suchbegriffe). Wenn ein Anbieter diese nicht entfernen kann, entfernen Sie den Anbieter. - Nichts aus Quizantworten, Chat-Inhalten, Gesundheits-/Finanz-/Geburtsdaten oder Formularfeldern.
- Videoseiten: kein Werbepixel auf Seiten, die Lektions- oder Kursvideos abspielen (Risiko durch den US Video Privacy Protection Act), es sei denn, die Rechtsabteilung sagt etwas anderes.
Hinweis
- Eine Datenschutz-/Cookie-Hinweisseite unter einer öffentlichen Route, verlinkt in der Fußzeile und auf der Registrierungs-/Login-Seite, die die tatsächlichen Anbieter und Kategorien auflistet. Verwenden Sie nur den tatsächlichen Betreibernamen und die Kontakt-E-Mail; erfinden Sie niemals Adressen, Datenschutzbeauftragte oder rechtliche Behauptungen.
Implementierung
- Lokaler Code / Claude Code: Kopieren Sie
references/consent.tsin die App, registrieren Sie jeden optionalen Anbieter alsloader, löschen Sie die hartcodierten Tags, bauen Sie den Banner mit den eigenen Komponenten der App und verknüpfen Sie den Fußzeilen-Link. Halten Sie das Diff klein und im Stil der App. - Lovable / Bolt / v0 / Replit (agentenbasiert): Fügen Sie den Fix-Prompt aus
~/.claude/skills/consent-audit/references/prompts.mdein (oder den Remove-Prompt). Überprüfen Sie es dann selbst; vertrauen Sie nicht der Zusammenfassung des Agenten.
Beweisen (erforderlich, bevor Sie es als erledigt melden)
Führen Sie diese Tests gegen die Vorschau und dann erneut gegen die Live-URL nach der Veröffentlichung durch. Verwenden Sie im integrierten Browser von Claude einen neuen Tab mit geleertem Speicher, dann read_network_requests und javascript_tool (document.cookie, localStorage):
| Test | Bestanden, wenn |
|---|---|
| Neuer Besuch, kein Klick | 0 Anfragen an Werbe-, Analyse- oder Replay-Domains; keine optionalen Cookies oder Speicher |
| Ablehnen, dann 2 Seitennavigationen | immer noch 0; Banner bleibt weg; Entscheidung gespeichert |
| Nur Analyse akzeptieren | Analyse lädt; Werbepixel nicht |
| Neuladen | Entscheidung gemerkt; kein Banner |
| Widerruf über Fußzeilen-Link | zukünftige Aufrufe gestoppt; optionale Cookies gelöscht; noch eingeloggt |
GPC an (navigator.globalPrivacyControl forciert true) | Werbung ohne Klick abgelehnt |
| Clientseitige Navigation (SPA) | kein Tracker schleicht sich bei Routenwechsel ein |
| Anmelden mit einem Testkonto | keine E-Mail oder Benutzer-ID in einer Tracker-Anfrage |
| Build + Typprüfung | bestanden |
Bericht: geänderte Dateien, Ergebnis jedes Tests mit Beweisen (gesehene Domains oder „keine"), nicht durchgeführte Tests und warum, damit veröffentlichte unveröffentlichte Änderungen und „Keine Rechtsberatung. Lassen Sie sich von einem Rechtsbeistand beraten, wenn Sie Werbung schalten oder Besucher aus Kalifornien/EU bedienen."