Einwilligungsstatus je Ereignis im GA4-BigQuery-Export auslesen

Inhalt
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;

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.