LW IT Solutions logo LW IT Solutions logo LW IT Solutions
« Blog-Übersicht /Digital Analytics / Einwilligungsstatus je Ereignis im GA4-BigQuery-Export auslesen
Diesen Artikel in anderen Sprachen lesen:

Einwilligungsstatus je Ereignis im GA4-BigQuery-Export auslesen

Einwilligungsstatus je Ereignis im GA4-BigQuery-Export auslesen
Inhalt
  1. 1. Rohwerte zuerst ansehen
  2. 2. Die NULL-Falle mit vier Testwerten
  3. 3. Den Nenner der Quote offenlegen
  4. 4. Auffälligkeiten untersuchen
  5. Fragen und Antworten
  6. Quellen

Im GA4-BigQuery-Export enthält privacy_info Angaben zum Speicherstatus eines exportierten Ereignisses. Das hilft bei der technischen Kontrolle der Einwilligungssignale. Der Datensatz ersetzt jedoch weder ein CMP-Protokoll noch den Nachweis einer konkreten Entscheidung am Banner.

Der häufigste SQL-Fehler dabei: analytics_storage != 'Yes' schließt NULL-Werte aus. Ein Vergleich mit NULL ergibt keinen wahren Wert; WHERE behält nur wahre Bedingungen.

1. Rohwerte zuerst ansehen

Die Felder analytics_storage und ads_storage sind Zeichenketten. Google dokumentiert Yes, No und Unset. Ein tatsächlich vorliegendes SQL-NULL bleibt zusätzlich als fehlender Wert erkennbar. 'Unset' und NULL sind im Vergleich nicht austauschbar. Die Punktnotation greift auf das jeweilige Feld im Record zu.

Projekt, Dataset und Beispielzeitraum vor der Ausführung anpassen. Die Gruppierung zeigt zunächst alle vorhandenen Kombinationen, ohne unbekannte Werte als Ablehnung einzusortieren.

SELECT
  event_date,
  privacy_info.analytics_storage AS analytics_storage,
  privacy_info.ads_storage AS ads_storage,
  COUNT(*) AS event_count
FROM `project_id.analytics_XXXXXX.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260801' AND '20260831'
GROUP BY 1, 2, 3
ORDER BY event_date, event_count DESC;
Yes, No, Unset und SQL-NULL unterscheiden. Nur wahre Vergleichsergebnisse passieren einen WHERE-Filter.
Yes, No, Unset und SQL-NULL unterscheiden. Nur wahre Vergleichsergebnisse passieren einen WHERE-Filter.

2. Die NULL-Falle mit vier Testwerten

Dieses kleine GoogleSQL-Beispiel braucht keine Analytics-Daten. Es macht die Unterschiede zwischen ausdrücklichem No, nicht Yes und nicht Yes einschließlich NULL sichtbar.

WITH sample AS (
  SELECT state
  FROM UNNEST(ARRAY<STRING>['Yes', 'No', 'Unset', NULL]) AS state
)
SELECT state,
  state = 'No' AS equals_no,
  state != 'Yes' AS not_yes,
  state IS DISTINCT FROM 'Yes' AS not_yes_including_null
FROM sample;

Für No und Unset ist != 'Yes' wahr. Für NULL ist das Ergebnis NULL; die Zeile verschwindet in einem entsprechenden WHERE-Filter. IS DISTINCT FROM 'Yes' schließt dagegen auch NULL ein. Das bedeutet technisch „nicht Yes, einschließlich fehlend“, nicht „ausdrückliche Ablehnung“.

Auch No beweist keinen Klick auf „Ablehnen“: Ein voreingestellter verweigerter Speicherstatus kann schon vor einer Bannerentscheidung gelten. Ursachen unbekannter Werte lassen sich aus diesem Feld allein nicht ableiten.

3. Den Nenner der Quote offenlegen

Die folgende Abfrage trennt bekannte, nicht gesetzte, fehlende und unerwartete Werte. SAFE_DIVIDE liefert bei einem Nenner von null NULL statt eines Rechenfehlers. Die Quoten liegen zwischen 0 und 1; die Darstellung als Prozent erfordert eine entsprechende Formatierung.

WITH source AS (
  SELECT privacy_info.analytics_storage AS state
  FROM `project_id.analytics_XXXXXX.events_*`
  WHERE _TABLE_SUFFIX BETWEEN '20260801' AND '20260831'
)
SELECT
  COUNT(*) AS exported_events,
  COUNTIF(state = 'Yes') AS yes_events,
  COUNTIF(state = 'No') AS no_events,
  COUNTIF(state = 'Unset') AS unset_events,
  COUNTIF(state IS NULL) AS null_events,
  COUNTIF(state NOT IN ('Yes', 'No', 'Unset')) AS other_events,
  SAFE_DIVIDE(COUNTIF(state = 'Yes'), COUNT(*)) AS yes_share_all_events,
  SAFE_DIVIDE(
    COUNTIF(state = 'Yes'),
    COUNTIF(state IN ('Yes', 'No'))
  ) AS yes_share_known_events
FROM source;

Bei je einem Ereignis mit Yes, No, Unset und NULL beträgt der Yes-Anteil aller Ereignisse 25 %. Unter den beiden bekannten Zuständen sind es 50 %. Beide Zahlen können richtig berechnet sein, beantworten aber unterschiedliche Fragen. Die Anteile unbekannter Werte müssen daneben sichtbar bleiben.

Beide Werte sind ereignisgewichtet: Ein Besuch mit vielen Ereignissen zählt stärker als ein Besuch mit wenigen. Im Basic Consent Mode können nicht freigegebene Besuche vollständig im Export fehlen. Eine tatsächliche Entscheidungsquote am Banner benötigt deshalb eine passend definierte CMP-Datenbasis, einschließlich Zeitraum, Bezugsgröße und Umgang mit Wiederholungen.

4. Auffälligkeiten untersuchen

  • Seite und Ereignis: Häufen sich unbekannte Zustände auf einem bestimmten Template oder bei einem nur serverseitig erzeugten Ereignis?
  • Zeit: Fällt eine Änderung mit einem Release oder einer CMP-Anpassung zusammen?
  • Gerät und Quelle: Bleibt ein Unterschied bestehen, wenn Ereignismix und Datenverfügbarkeit vergleichbar sind?

Diese Muster sind Untersuchungshinweise, keine eindeutigen Ursachenbeweise. Tag-Konfiguration, Consent-Initialisierung, Netzwerkanfragen und gegebenenfalls serverseitige Weitergabe müssen den Befund bestätigen.

Ein Besuch kann mehrere Speicherzustände durchlaufen. Eine dauerhaft gleiche Pseudokennung über verweigerte und freigegebene Ereignisse ist dabei nicht garantiert. Ohne passende Kennungen lassen sich frühere Ereignisse nicht verlässlich zu einer Sitzung zusammensetzen; ein Join über fehlende Kennungen ist kein Ersatz.

Fragen und Antworten

Warum _TABLE_SUFFIX statt nur event_date?

Bei diesen Wildcard-Tagestabellen begrenzt ein konstanter Suffixbereich die berücksichtigten Tabellen. Die Datumszeichenketten schließen events_intraday_… aus. Ein Filter nur auf event_date ersetzt diese Tabellenauswahl nicht. Der tatsächliche Umfang und die Kosten sind vorab zu prüfen; ein Monat ist nicht automatisch günstig.

Ist COALESCE eine fachliche Einordnung?

Nein. COALESCE(state, 'missing') gibt NULL lediglich eine sichtbare Beschriftung. Ob der Wert aus fehlender Konfiguration, einem anderen Erfassungsweg oder einer sonstigen Ursache stammt, ist damit nicht geklärt.

Warum explizite Spalten?

Benannte Spalten begrenzen die Abhängigkeit vom Exportschema. Neue Felder verändern dann nicht automatisch die Form des Ergebnisses. Änderungen benötigter Feldtypen oder fehlende Felder können weiterhin Anpassungen verlangen.

Quellen

Lukas Wojcik

Lukas Wojcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Kontakt

Eine Frage oder eine Idee für ein Webprojekt? Schreib mir kurz, worum es geht. Das Formular nutzt reCAPTCHA zum Schutz vor Spam.

Kommentar schreiben

Abweichende Zahlen aus anderen Konten und Rückfragen zur Einrichtung sind hier willkommen.

Die E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind mit einem Stern versehen.