Die Debug-Konsole ist ein einblendbares Diagnose-Panel direkt in cmp.js. Sie zeigt auf Ihrer eigenen Seite, was die CMP gerade tut: welches Regime erkannt wurde, welche Einwilligung vorliegt, welche Scripts, Iframes und Pixel blockiert oder nach Consent freigegeben wurden, welche Third-Party-Domains noch keinem Vendor zugeordnet sind und alle Ereignisse seit dem Laden der Seite (TCF-Events, Banner, Klicks, Consent-Speicherung, Netzwerk).
Sie ist für Website-Betreiber, Agenturen und Entwickler gedacht, um eine Einbindung zu prüfen, Tags korrekt zu blockieren und Support-Fälle zu klären. Für Besucher bleibt sie unsichtbar, solange sie nicht explizit geöffnet wird.
Konsole öffnen
| Weg | Beispiel | Wirkung |
|---|---|---|
| URL-Parameter | https://ihre-seite.de/artikel?cmpconsole…?foo=1&cmpconsole | Öffnet die Konsole und merkt sich das im Browser (siehe Flag). |
| Hash | https://ihre-seite.de/artikel#cmpconsole | Wie der Parameter – praktisch, weil Hashes keinen neuen Seitenaufruf und keinen anderen Cache-Key erzeugen. |
| Persistentes Flag | localStorage.adcmp_console = "1" | Die Konsole öffnet sich auf jeder Seite dieser Domain, bis Sie sie schließen. Wird durch die beiden Wege oben automatisch gesetzt. |
| JavaScript-API | cmp.console() | Öffnet die Konsole sofort und setzt ebenfalls das Flag. Verfügbar, sobald cmp.js geladen ist – auch wenn die Config nicht geladen werden konnte. Davor per Queue: cmp.q.push(["console"]). |
Der Parameter funktioniert auch mit Wert, z. B. ?cmpconsole=1. Die Konsole ist ein eigenes Script (/cmp/v1/cmp-console.js), das erst beim Öffnen nachgeladen wird – cmp.js selbst wird dadurch kaum größer.
Schließen und deaktivieren
- ✕ oben rechts schließt die Konsole und entfernt das Flag
adcmp_console– beim nächsten Seitenaufruf ist sie weg. cmp.console(false)(odercmp.console("close")) – dasselbe per JavaScript.?cmpconsole=0bzw.#cmpconsole=off– öffnet sie nicht und löscht das Flag (z. B. für einen Link an Kollegen).localStorage.removeItem("adcmp_console")– manuell.- — minimiert die Konsole zu einer kleinen Pille mit Zählern (bleibt aktiv), ⬆/⬇ dockt sie oben oder unten an. Höhe per Ziehen am oberen Rand änderbar; Höhe und Position werden gemerkt.
Aufbau
Kopfzeile: Version von cmp.js und Konsole, Zähler-Badges (Klick filtert die Elemente-Liste), JSON kopieren, Andocken, Minimieren, Schließen. Darunter fünf Tabs und ein Suchfeld, das in jedem Tab filtert (Domain, URL, Vendor, Log-Text …). Während die Konsole offen ist, reserviert sie unten bzw. oben Platz, damit Consent-Banner und „Privatsphäre-Einstellungen“-Button bedienbar bleiben. Auf dem Smartphone werden Tabellen als Karten dargestellt.
| Badge | Bedeutung |
|---|---|
| blockiert | Element wird von der CMP zurückgehalten (keine Einwilligung für Vendor/Zweck). |
| aktiviert | War blockiert und wurde nach Einwilligung freigegeben (mit Zeitpunkt). |
| erlaubt | Einem Vendor zugeordnet, Einwilligung lag schon vor – sofort geladen. |
| Leaks | Einem Vendor ohne Einwilligung zugeordnet, aber trotzdem geladen (z. B. vor der CMP eingebunden oder <img>-Pixel). Sollte 0 sein. |
| unbekannt | Third-Party-Element, dessen Domain zu keinem Vendor passt – wird nicht blockiert. |
Tab „Status“
- CMP: SDK-Version, CMP-ID, CMP-Version, ob
__tcfapi, der__tcfapiLocator-Frame und__gppvorhanden sind,cmpStatus/displayStatusausping, TCF-Policy- und GVL-Version, ob die CMP ready ist und ob das Banner sichtbar ist. - Property / Konfiguration: Property-Key, API-Basis, Config-Version und Veröffentlichungszeitpunkt, Seite, Publisher-Land, Anzahl GVL-Vendoren/Custom Vendors/Zwecke.
- Regime & Region: erkanntes Regime (
tcf_euDSGVO,tcf_uk,ch,gpp_usUS-Opt-out,notice_only,none), erkanntes Land, aktivierte Regime, Sprache,gdprAppliesund ob der Browser GPC (Global Privacy Control) sendet. - Timings (ms seit Navigationsstart): DOMContentLoaded,
cmp.jsgeladen,config.jsongeladen, CMP ready, Banner angezeigt, Consent gespeichert, Load-Event. - Blocker: ob die Auto-Block-Hooks aktiv sind, Zählerstände und ggf. verworfene alte Einträge (Puffer: 500 Ereignisse / 600 Elemente).
- Google Consent Mode v2: alle Signale (
ad_storage,ad_user_data,ad_personalization,analytics_storage…) mit Default- und letztem Update-Wert aus demdataLayer, plus Reihenfolge der Aufrufe.
Tab „Consent“
- Entscheidung: noch keine / alles akzeptiert / teilweise / abgelehnt, Zeitpunkt, Consent-ID (für Nachweis und Support) und maximale Gültigkeit.
- Zwecke (IAB TCF 1–11) mit Einwilligung und berechtigtem Interesse, besondere Merkmale (Standortdaten, Geräte-Scan), GVL-Vendoren mit Einwilligung, berechtigtem Interesse und Zwecken, Custom Vendors mit Domains, Zwecken und Opt-in.
- TC-String im Rohformat und dekodiert (Version, erstellt/aktualisiert, CMP-ID, Consent-Screen, Sprache, GVL-/Policy-Version, Publisher-Land, freigegebene Zwecke und Vendoren) – direkt vergleichbar mit Tools wie dem IAB TC-String-Decoder.
- GPP-String (nur im US-Regime).
Tab „Elemente“
Jedes Script, Iframe, Bild und Stylesheet eines Drittanbieters, das die CMP gesehen hat. Filter-Chips oben (Alle / Blockiert / Aktiviert / Erlaubt / Leaks / Unbekannt) und das Suchfeld schränken die Liste ein.
| Spalte | Bedeutung |
|---|---|
| Zeit | Wann die CMP das Element zuerst gesehen hat (ms seit Navigationsstart). |
| Typ | script, iframe, img, link. |
| Domain | Host der Quelle; inline bei Inline-Scripts ohne src. |
| Quelle | Vollständige URL (src, data-cmp-src oder href). |
| Vendor | Zugeordneter Vendor: IAB-Vendor mit Name und GVL-ID (aus data-cmp-vendor oder Domain-Zuordnung) bzw. Custom Vendor (aus data-cmp-custom oder dessen Domains). |
| Zwecke | Aus data-cmp-purposes, falls gesetzt. |
| Methode |
manuell (Markup) – vom Betreiber markiert: type="text/plain" mit data-cmp-vendor/data-cmp-custom/data-cmp-purposes oder <iframe data-cmp-src>. Zuverlässigste Methode.Auto-Block (Hook) – dynamisch per JavaScript eingefügt ( appendChild/insertBefore) und automatisch anhand der Domain abgefangen, ohne Markup-Änderung.Observer (am Hook vorbei) – per innerHTML/Parser eingefügt und vom MutationObserver erst nach dem Einfügen gesehen; bei Scripts ist der Request dann u. U. schon gestartet.vor CMP im DOM – stand im HTML vor cmp.js bzw. war schon geladen, als die CMP startete; kann nicht mehr gestoppt werden.
|
| Status | blockiert, aktiviert @ 4265 ms (Zeitpunkt der Freigabe), erlaubt, nicht blockiert oder unbekannt. Darunter der Grund, z. B. vendor:755, custom:youtube, purposes:8, host:hotjar. Warnung „nicht in der Property konfiguriert – bleibt blockiert“: siehe Troubleshooting. |
Tab „Domains“
Fasst Elemente und alle tatsächlich geladenen Ressourcen (Resource Timing: auch Requests, die Scripts selbst per fetch/XHR/Pixel auslösen) pro Domain zusammen. Eigene Domain und CMP-Domain werden ausgeblendet.
- Nicht zugeordnete Domains (oben): Drittanbieter-Domains, die zu keinem Vendor passen und deshalb nicht blockiert werden. Mit Liste kopieren erhalten Sie alle Hosts zeilenweise.
- Zugeordnete Domains: mit Vendor, Einwilligungsstatus, Anzahl Elemente und Requests, Zeitpunkt des ersten Requests und Initiator (script, img, iframe, fetch …). Der Hinweis „Request vor/ohne Einwilligung“ markiert Vendoren, deren Domain ohne Einwilligung oder vor dem Consent-Zeitpunkt angefragt wurde.
Unbekannte Domain als Custom Vendor anlegen
- Im Admin Custom Vendors → Neu öffnen.
- Key (z. B.
hotjar), Name und Datenschutz-URL eintragen, unter Domains die kopierten Hosts eintragen (eine pro Zeile;example.comdeckt auch alle Subdomains wiecdn.example.comab), Cookie-Namen/Muster und Zwecke (functional,statistics,marketingoder IAB-IDs) sowie die Rechtsgrundlage wählen, Anlegen. - In der Property unter Einstellungen → Custom Vendors dieser Property den Vendor anhaken und speichern.
- Seite mit
?cmpconsolein einem privaten Fenster neu laden (die öffentliche Config wird bis zu 2 Minuten gecacht): Die Elemente erscheinen jetzt als blockiert mit Methode Auto-Block (Hook), und der Vendor steht im Banner zur Auswahl.
Für IAB-Vendoren ist kein Custom Vendor nötig: Markieren Sie das Tag mit data-cmp-vendor="GVL-ID" und nehmen Sie den Vendor in die Vendor-Auswahl der Property auf.
Tab „Log“
Chronologisches Protokoll ab dem Laden von cmp.js mit relativer Zeit (ms) und Uhrzeit. Kategorien lassen sich per Chip filtern; Details (JSON) stehen unter der Meldung.
| Kategorie | Beispiele |
|---|---|
boot | cmp.js loaded (mit document.readyState) |
console | Konsole wird nachgeladen |
net | config.json GET, config.json → 200 (313 ms), regime tcf_eu, lang de, v1, consent log POST → 201 (85 ms) |
metering | Seitenaufruf wird serverseitig beim Laden der config.json gezählt (Grundlage der Abrechnung; Bots/Prefetch ausgenommen) |
gcm | Google Consent Mode consent default / consent update mit allen Signalen |
tcf | TC-String-Aktualisierung mit eventStatus: tcloaded, cmpuishown, useractioncomplete |
tcfapi | Aufrufe anderer Scripts an __tcfapi (z. B. addEventListener, getTCData, ping) – zeigt, welche Ad-Tags die CMP abfragen |
gpp | __gpp installiert, GPC erkannt, US-Opt-out gesetzt/aufgehoben |
consent | banner required: no stored consent (bzw. neue Config-Version, abgelaufen …), stored consent valid → no banner, consent saved: 11 purposes, 5 vendors, 2 custom |
ready | CMP bereit |
ui | Banner angezeigt (Ebene 1/2) / ausgeblendet, Klicks auf Akzeptieren, Ablehnen, Einstellungen, Auswahl speichern |
action | API-Aufrufe cmp.consentAll(), cmp.declineAll(), cmp.show() |
block / unblock / element | Element blockiert / nach Consent aktiviert / erlaubt, unbekannt oder nicht blockiert |
cookies | Cookies abgelehnter Vendoren gelöscht (Muster) |
error | Config-Fehler, fehlender Property-Key, fehlgeschlagener Consent-Log, Konsole nicht ladbar |
JSON kopieren
JSON kopieren legt einen vollständigen Schnappschuss in die Zwischenablage: Seite, SDK-Version, Property, Regime, Land, Sprache, Consent-Zustand inkl. TC- und GPP-String, Zähler, alle Elemente und alle Ereignisse mit absoluten Zeitstempeln. Ideal für Support-Anfragen – bitte einfach an den Support schicken. Den gleichen Schnappschuss liefert __adcmpConsole.snapshot() in der Browser-Konsole.
Troubleshooting
Ein Script lädt vor der Einwilligung
- Status nicht blockiert mit Methode vor CMP im DOM: Das Tag steht im HTML vor
cmp.js. Binden Siestub.js/cmp.jsals Erstes im<head>ein oder markieren Sie das Tag manuell (type="text/plain"+data-cmp-vendor/data-cmp-custom). - Methode Observer (am Hook vorbei): Das Tag wurde per
innerHTMLoderdocument.writeeingefügt. Stellen Sie auf manuelles Markup um. - Typ
img: Pixel-Requests starten schon bei dersrc-Zuweisung. Erzeugen Sie das Pixel aus einem blockierten<script type="text/plain" data-cmp-vendor="…">. - Status unbekannt: Die Domain ist keinem Vendor zugeordnet – siehe nächster Punkt.
- Im Tab Domains „Request vor/ohne Einwilligung“, aber kein Element in der Liste: Der Request wurde von einem anderen (erlaubten oder unbekannten) Script selbst ausgelöst, z. B. per
fetch. Blockieren Sie das auslösende Script (Spalte Initiator gibt einen Hinweis).
Ein Script bleibt trotz Einwilligung blockiert
- Warnung „nicht in der Property konfiguriert – bleibt blockiert“: Die Domain steht in der eingebauten Tracker-Liste (z. B. Hotjar, YouTube, Google Maps), der Vendor ist aber nicht Teil Ihrer Property. Besucher können ihm daher nicht zustimmen. Legen Sie ihn als Custom Vendor an bzw. haken Sie ihn in den Property-Einstellungen an (Anleitung) – danach erscheint er im Banner und wird nach Einwilligung freigegeben.
- Grund
purposes:…: Es fehlt die Einwilligung für mindestens einen der indata-cmp-purposesgenannten Zwecke. - Im Tab Consent prüfen, ob für den Vendor wirklich eine Einwilligung vorliegt (z. B. nur teilweise akzeptiert).
Eine Domain wird als unbekannt angezeigt
- Sie passt weder zu einem Custom Vendor der Property noch zur eingebauten Tracker-Liste. Legen Sie einen Custom Vendor an (Anleitung) oder markieren Sie das Tag mit
data-cmp-vendor. - Unkritische Domains (eigenes CDN, Schriftarten, die Sie ohnehin als notwendig einstufen) dürfen unbekannt bleiben – sie werden nicht blockiert.
- Nach dem Anlegen noch unbekannt? Vendor in den Property-Einstellungen angehakt? Bis zu 2 Minuten Cache abwarten, privates Fenster nutzen, Schreibweise der Domain prüfen (ohne
https://und Pfad).
Die Konsole erscheint nicht
- Wird
cmp.jsgeladen? Ohnecmp.jsgibt es keine Konsole. Im Log der Browser-Entwicklertools nachcmp-console.jssuchen. - Eine Content Security Policy muss Scripts von der CMP-Domain erlauben (wie für
cmp.js). - Manche Seiten entfernen Query-Parameter per Redirect – nutzen Sie dann
#cmpconsoleodercmp.console().
Banner erscheint nicht / Status „noch nicht initialisiert“
Im Log nach error und config.json → … suchen: 404 = falscher Property-Key oder keine veröffentlichte Konfiguration; Regime none = für dieses Land ist kein Banner konfiguriert.
Technik & Datenschutz
cmp.jshält nur einen kleinen Ringpuffer im Arbeitsspeicher (max. 500 Ereignisse, 600 Elemente). Es wird nichts gesendet oder gespeichert; einzig das Flagadcmp_console(sowie Höhe/Andockposition der Konsole) liegt imlocalStorage, wenn Sie die Konsole öffnen.- Die Konsole wird erst beim Öffnen von der CMP-Domain nachgeladen (
/cmp/v1/cmp-console.js, versioniert), rendert in einem Shadow DOM (keine Style-Konflikte mit Ihrer Seite) und zeigt alle Seiteninhalte nur als Text an. - Sie ändert keine Einwilligung und blockiert nichts – sie beobachtet nur. Ihre eigenen API-Abfragen erscheinen nicht im Log.
- Globale Objekte:
window.__adcmpDebug(Puffer),window.__adcmpConsole(open(),close(),refresh(),snapshot()).