SDK-Dokumentation ›

Debug-Konsole (cmpconsole)

DE EN

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.

Debug-Konsole, Tab Elemente: blockierte Scripts und Iframe vor der Einwilligung
Tab „Elemente“ vor der Einwilligung: Consent-Banner oben, Konsole unten angedockt, alle markierten Elemente sind blockiert.

Konsole öffnen

WegBeispielWirkung
URL-Parameterhttps://ihre-seite.de/artikel?cmpconsole
…?foo=1&cmpconsole
Öffnet die Konsole und merkt sich das im Browser (siehe Flag).
Hashhttps://ihre-seite.de/artikel#cmpconsoleWie der Parameter – praktisch, weil Hashes keinen neuen Seitenaufruf und keinen anderen Cache-Key erzeugen.
Persistentes FlaglocalStorage.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-APIcmp.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.

Tipp: Öffnen Sie die Konsole in einem privaten Fenster, um den Zustand vor der Einwilligung zu sehen. Die Konsole protokolliert ab dem ersten Moment mit – auch Ereignisse, die vor dem Öffnen passiert sind.

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) (oder cmp.console("close")) – dasselbe per JavaScript.
  • ?cmpconsole=0 bzw. #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.

BadgeBedeutung
blockiertElement wird von der CMP zurückgehalten (keine Einwilligung für Vendor/Zweck).
aktiviertWar blockiert und wurde nach Einwilligung freigegeben (mit Zeitpunkt).
erlaubtEinem Vendor zugeordnet, Einwilligung lag schon vor – sofort geladen.
LeaksEinem Vendor ohne Einwilligung zugeordnet, aber trotzdem geladen (z. B. vor der CMP eingebunden oder <img>-Pixel). Sollte 0 sein.
unbekanntThird-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 __gpp vorhanden sind, cmpStatus/displayStatus aus ping, 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_eu DSGVO, tcf_uk, ch, gpp_us US-Opt-out, notice_only, none), erkanntes Land, aktivierte Regime, Sprache, gdprApplies und ob der Browser GPC (Global Privacy Control) sendet.
  • Timings (ms seit Navigationsstart): DOMContentLoaded, cmp.js geladen, config.json geladen, 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 dem dataLayer, plus Reihenfolge der Aufrufe.
  • 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.

SpalteBedeutung
ZeitWann die CMP das Element zuerst gesehen hat (ms seit Navigationsstart).
Typscript, iframe, img, link.
DomainHost der Quelle; inline bei Inline-Scripts ohne src.
QuelleVollständige URL (src, data-cmp-src oder href).
VendorZugeordneter 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).
ZweckeAus 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.
Statusblockiert, 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.
Debug-Konsole nach „Alle akzeptieren“: alle Elemente aktiviert mit Zeitstempel
Nach „Alle akzeptieren“: die markierten Elemente sind aktiviert (mit Zeitpunkt der Freigabe). Hotjar bleibt blockiert, weil der Vendor nicht in der Property konfiguriert ist; drei per Tag-Manager eingefügte Scripts/Pixel sind unbekannt.

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.
Debug-Konsole, Tab Domains mit nicht zugeordneten Domains
Tab „Domains“: nicht zugeordnete Hosts stehen oben und lassen sich als Liste kopieren.

Unbekannte Domain als Custom Vendor anlegen

  1. Im Admin Custom Vendors → Neu öffnen.
  2. Key (z. B. hotjar), Name und Datenschutz-URL eintragen, unter Domains die kopierten Hosts eintragen (eine pro Zeile; example.com deckt auch alle Subdomains wie cdn.example.com ab), Cookie-Namen/Muster und Zwecke (functional, statistics, marketing oder IAB-IDs) sowie die Rechtsgrundlage wählen, Anlegen.
  3. In der Property unter Einstellungen → Custom Vendors dieser Property den Vendor anhaken und speichern.
  4. Seite mit ?cmpconsole in 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.

KategorieBeispiele
bootcmp.js loaded (mit document.readyState)
consoleKonsole wird nachgeladen
netconfig.json GET, config.json → 200 (313 ms), regime tcf_eu, lang de, v1, consent log POST → 201 (85 ms)
meteringSeitenaufruf wird serverseitig beim Laden der config.json gezählt (Grundlage der Abrechnung; Bots/Prefetch ausgenommen)
gcmGoogle Consent Mode consent default / consent update mit allen Signalen
tcfTC-String-Aktualisierung mit eventStatus: tcloaded, cmpuishown, useractioncomplete
tcfapiAufrufe 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
consentbanner required: no stored consent (bzw. neue Config-Version, abgelaufen …), stored consent valid → no banner, consent saved: 11 purposes, 5 vendors, 2 custom
readyCMP bereit
uiBanner angezeigt (Ebene 1/2) / ausgeblendet, Klicks auf Akzeptieren, Ablehnen, Einstellungen, Auswahl speichern
actionAPI-Aufrufe cmp.consentAll(), cmp.declineAll(), cmp.show()
block / unblock / elementElement blockiert / nach Consent aktiviert / erlaubt, unbekannt oder nicht blockiert
cookiesCookies abgelehnter Vendoren gelöscht (Muster)
errorConfig-Fehler, fehlender Property-Key, fehlgeschlagener Consent-Log, Konsole nicht ladbar
Debug-Konsole, Tab Log
Tab „Log“ mit Kategorie-Filtern.

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 Sie stub.js/cmp.js als 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 innerHTML oder document.write eingefügt. Stellen Sie auf manuelles Markup um.
  • Typ img: Pixel-Requests starten schon bei der src-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 in data-cmp-purposes genannten 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.js geladen? Ohne cmp.js gibt es keine Konsole. Im Log der Browser-Entwicklertools nach cmp-console.js suchen.
  • 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 #cmpconsole oder cmp.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.js hält nur einen kleinen Ringpuffer im Arbeitsspeicher (max. 500 Ereignisse, 600 Elemente). Es wird nichts gesendet oder gespeichert; einzig das Flag adcmp_console (sowie Höhe/Andockposition der Konsole) liegt im localStorage, 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()).