Tutorial: GA4-Daten nach BigQuery exportieren und die erste SQL-Abfrage schreiben

Management Summary
Der Export von GA4 nach BigQuery überträgt Websiteaktivitäten in einen Dienst für eigene Datenanalysen. Dort lassen sich Fragen über Standardberichte hinaus beantworten und Geschäftsdaten ergänzen, etwa zur Abfolge besuchter Seiten. Das ist hilfreich, wenn die fertigen GA4-Ansichten nicht ausreichen. Der Export beginnt ohne frühere Historie und kann wegen anderer Daten und Berechnungen von Berichten abweichen. Ein daraus gebildeter Besuchsverlauf zeigt erfasste Aktivitäten, nicht zwingend den vollständigen Weg bis zum Kauf.
Inhalt
BigQuery stellt exportierte GA4-Events für eigene SQL-Auswertungen bereit: Verknüpfungen mit Geschäftsdaten, ausdrücklich definierte Kennzahlen und beobachtete Seitenabfolgen. Auch GA4 bietet Pfad- und Trichterexplorationen. SQL erweitert die Kontrolle über Berechnung und Ausgabe.
Die Anleitung beginnt mit dem täglichen Export, prüft den Eingang von Events und gruppiert anschließend beobachtete Webseitenaufrufe nach Sitzungskennungen. Die Beispiele beschreiben den ausgewählten Export, keine garantiert vollständigen Besuche.

1. Täglichen Export einrichten
Die Verknüpfung entsteht unter Verwaltung → Produktverknüpfungen → BigQuery-Verknüpfungen. In GA4 sind mindestens Bearbeitungsrechte auf Property-Ebene erforderlich. Das Cloud-Projekt benötigt die dokumentierten IAM- und Dienstberechtigungen. Die Rolle Owner enthält diese Rechte; eine passende engere Rollenkombination kann ebenfalls ausreichen. Die BigQuery-API muss aktiviert sein.
Die Einrichtung umfasst Cloud-Projekt, Speicherort, Streams und ausgeschlossene Events. Für Standard-Properties stehen Daily und Streaming unabhängig voneinander bereit; geeignete Analytics-360-Properties bieten zusätzlich Fresh Daily. Daily erzeugt events_YYYYMMDD, Streaming vorläufige events_intraday_YYYYMMDD-Tabellen mit möglichen Lücken. Für abgeschlossene Tage eignet sich der tägliche Export besser; verspätete Events können jüngere Tagestabellen allerdings noch verändern.
Die Verknüpfung holt frühere Property-Daten nicht nach. Erste Daten treffen normalerweise innerhalb von 24 Stunden ein; eine bestimmte tägliche Lieferzeit ist nicht garantiert. Für Standard-Properties gilt ein tägliches Limit von einer Million exportierten Events. Eine Überschreitung kann den täglichen Export aussetzen. Ausgeschlossene Streams oder Events senken das Volumen, verändern aber auch die Grundlage der Auswertung.
Ein täglicher Export bedeutet keine kostenlose Cloud-Nutzung: Speicherung und Abfragen können Kosten verursachen, Streaming zusätzlich Übertragungskosten. Vor der ersten Abfrage zeigen Editor-Schätzung oder Dry Run die erwartete Verarbeitung. Ein Dry Run prüft die Abfrage, ohne diese auszuführen. maximum bytes billed begrenzt bei bedarfsabhängiger Abrechnung die abrechenbaren Bytes je Abfrage. Die folgenden Beispiele verwenden einen bewusst begrenzten Zeitraum.
2. Unterschiede zu GA4-Berichten verstehen
Der Event-Export arbeitet ohne Stichprobe und fasst viele unterschiedliche Dimensionswerte nicht in einer (other)-Zeile zusammen. GA4-Berichte und Explorationen können unterschiedliche Ausgangstabellen verwenden; Stichproben, Aggregationsgrenzen oder Datenschutzschwellen sind möglich. Schwellenwerte betreffen beispielsweise demografische Angaben und Suchanfragen. Aktive Google-Signale erklären nicht pauschal jede fehlende Zeile.
BigQuery reproduziert weder die Verhaltens- und Schlüsselereignismodellierung noch die datengetriebene Attribution aus GA4. Trotzdem fehlen nicht sämtliche Attributionsfelder: Das aktuelle Schema enthält unter anderem beobachtete Last-Click-Sitzungsquellen, soweit verfügbar. Bei Abweichungen sind Kennzahl, Zeitraum, Property-Zeitzone, Identitätsverfahren, Exportfilter und Datenstand abzugleichen. Eine Differenz ist weder automatisch ein Fehler noch automatisch unbedenklich.
3. Das verschachtelte Schema lesen
Jede exportierte Zeile steht für ein Event. Direkte Spalten sind unter anderem event_name, event_date, event_timestamp und user_pseudo_id. Zusätzliche Werte wie ga_session_id und page_location liegen in event_params, einer Liste von Namen und zugehörigen Werten innerhalb der Eventzeile. UNNEST macht diese Records zugänglich; eine skalare Unterabfrage liest genau einen Wert für den gesuchten Namen.
event_date folgt der eingestellten Berichtszeitzone. event_timestamp wird in UTC-Mikrosekunden angegeben; mehrere gemeinsam übertragene Events können denselben Zeitstempel tragen. Batch-Felder ergänzen Reihenfolgeinformationen. Eine Pseudo-ID bezeichnet eine App-Instanz oder einen Browserkontext, keine verifizierte Person. Fehlende und wechselnde Kennungen begrenzen die Rekonstruktion. Die Abfrage gruppiert nach den getrennten Feldern stream_id, Pseudo-ID und Sitzungs-ID.
4. Eingang exportierter Events prüfen
Projektkennung, Property-Dataset und Datumswerte sind Platzhalter für tatsächlich vorhandene Tagestabellen. Die Abfragen verwenden GoogleSQL.
SELECT
event_date,
COUNT(*) AS events,
COUNT(DISTINCT user_pseudo_id) AS distinct_pseudo_ids,
COUNTIF(user_pseudo_id IS NULL) AS events_without_pseudo_id
FROM `project.analytics_XXXXXXXXX.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260920' AND '20260926'
GROUP BY event_date
ORDER BY event_date;distinct_pseudo_ids zählt unterschiedliche vorhandene Kennungen, weder aktive GA4-Nutzer noch eindeutige Personen. Der zusätzliche Null-Zähler macht fehlende Kennungen sichtbar. Ein Tag ohne Tabelle oder Events erzeugt keine Ergebniszeile; für einen lückenlosen Kalender wäre eine eigene Datumstabelle nötig.
5. Eine beobachtete Seitenabfolge bilden
Das Webbeispiel verwendet page_view. Für App-Bildschirme sind ein anderes Event und ein passendes Ortsfeld nötig. Die ausgewählten Tabellen müssen die gezeigten Batch-Felder des aktuellen Schemas enthalten.
WITH page_views AS (
SELECT
stream_id,
user_pseudo_id,
(SELECT value.int_value FROM UNNEST(event_params)
WHERE key = 'ga_session_id') AS session_id,
event_timestamp,
batch_page_id,
batch_ordering_id,
batch_event_index,
(SELECT value.string_value FROM UNNEST(event_params)
WHERE key = 'page_location') AS page_location
FROM `project.analytics_XXXXXXXXX.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260920' AND '20260926'
AND event_name = 'page_view'
)
SELECT
stream_id,
user_pseudo_id,
session_id,
COUNT(*) AS page_views,
COUNTIF(page_location IS NULL) AS missing_locations,
STRING_AGG(
COALESCE(REGEXP_REPLACE(page_location, r'[?#].*$', ''),
'[missing URL]'),
' > ' ORDER BY event_timestamp, batch_page_id,
batch_ordering_id, batch_event_index, page_location
) AS observed_path
FROM page_views
WHERE user_pseudo_id IS NOT NULL
AND session_id IS NOT NULL
GROUP BY stream_id, user_pseudo_id, session_id
HAVING COUNT(*) > 1
ORDER BY page_views DESC, stream_id, user_pseudo_id, session_id
LIMIT 100;Fehlende Pseudo- und Sitzungs-IDs werden ausgeschlossen, statt fremde Events unter einer gemeinsamen Null-Gruppe zusammenzufassen. Fehlende Seitenadressen bleiben im Zähler und Pfad sichtbar. Das Beispiel entfernt Query-Parameter und Fragmente, erhält aber den Hostnamen. Dadurch fallen Seiten verschiedener Hosts nicht unbemerkt in dieselbe Beschriftung. Bei querybasiertem Routing ist eine andere Normalisierung erforderlich.
Die Sortierung nutzt Zeitstempel und vorhandene Batch-Felder. Die URL am Ende der Sortierliste sorgt lediglich für eine eindeutiger angeordnete Anzeige, nicht für einen Nachweis der zeitlichen Reihenfolge. Gleiche oder fehlende Sortierwerte, parallele Tabs und verzögerte Übertragung können die tatsächliche Abfolge offenlassen. Der Pfad enthält nur beobachtete Seitenaufrufe innerhalb des gewählten Zeitraums. Sitzungen an den Zeitraumgrenzen können abgeschnitten sein; Sitzungen mit nur einem Seitenaufruf entfernt HAVING ausdrücklich.
Die skalaren Unterabfragen erwarten höchstens einen Wert je gesuchtem Parameterschlüssel und Event. Bei doppelten Schlüsseln ist die Datenursache zu prüfen; eine willkürliche Auswahl des ersten Werts würde das Problem verstecken. Für Schritte bis zum Kauf wären zusätzlich Kauf-Events nötig: Der aktuelle Filter behält ausschließlich Seitenaufrufe.
6. Ergebnisse vor dem Dashboard prüfen
- Tägliche Eventzahlen, ausgeschlossene Streams und Events sowie fehlende Kennungen prüfen.
- Einige rekonstruierte Sitzungen mit den Einzelzeilen vergleichen, einschließlich gleicher Zeitstempel und Sitzungen über Mitternacht.
- Eine ausdrücklich definierte Kennzahl unter gleichen Datums- und Identitätsannahmen mit GA4 vergleichen; Modellierungsunterschiede von Exportlücken trennen.
- Zugriffsrechte und Tabellenablauf bewusst festlegen. Exportierte Daten besitzen einen eigenen Lebenszyklus außerhalb von GA4.
Fragen und Antworten
Erfasst events_* auch Streaming-Tabellen?
Ja. Der numerische Suffixbereich beider Beispiele schließt intraday_YYYYMMDD aus. Eine Abfrage mit aktuellen Streaming-Daten sollte pro Datum nur eine Tabellenquelle verwenden. Überlappende Tages- und Intraday-Zeilen dürfen nicht addiert werden. Streaming bleibt vorläufig und garantiert keine Vollständigkeit.
Begrenzt LIMIT 100 die Abfragekosten?
Bei diesen Aggregationen über gewöhnliche, nicht geclusterte Exporttabellen nicht. Das Limit begrenzt die ausgegebenen Sitzungen nach der Aggregation. Relevant sind ausgewählte Spalten, begrenzte Tabellensuffixe, Dry Run und maximum bytes billed. BigQuery bietet außerdem kapazitätsbasierte Abrechnung; nicht jede Installation wird direkt nach gelesenen Bytes berechnet.
Löscht die GA4-Aufbewahrungsdauer BigQuery-Tabellen?
Nein. BigQuery braucht eigene Ablauf- und Löschregeln. Eine geänderte Standardablaufzeit am Dataset gilt für neu angelegte Tabellen; vorhandene Tabellen benötigen eigene Einstellungen. Die Frist beginnt mit der Tabellenerstellung, nicht mit dem Zeitpunkt jedes einzelnen Events.
Funktioniert der Export ohne Rechnungskonto?
Der tägliche Export kann die BigQuery-Sandbox verwenden. Die aktuelle Sandbox-Dokumentation nennt eine lebenslange Speicherquote von 10 GiB, die durch Löschung nicht zurückgewonnen wird, 1 TiB Abfrageverarbeitung pro Monat und automatischen Ablauf nach 60 Tagen. Streaming steht dort nicht bereit. Ein Upgrade hebt Sandbox-Beschränkungen auf, erfordert aber einen eigenen Kosten- und Aufbewahrungsplan.
Quellen
- Google Analytics: BigQuery-Export einrichten
- Google Analytics: BigQuery-Export
- Google Analytics: Datenschema des BigQuery-Exports
- Google Analytics: Berichtsoberflächen vergleichen
- Google Analytics: Datenschwellen
- Google Cloud: BigQuery-Sandbox ausprobieren
- Google Cloud: Kosten schätzen und begrenzen
- Google Cloud: Dataset-Eigenschaften ändern
- Google Analytics 4: Entwicklungsdokumentation


