BigQuery
Google Cloud's serverless data warehouse and the default landing zone for GA4's raw event export.
INTEGRATES: google-analytics-4 · dbt · airflow · dagster · hightouch · census
ALTERNATIVES: snowflake · clickhouse
BigQuery is a serverless columnar warehouse — no clusters to size, storage and compute billed separately — and, for measurement teams, the gravitational center of the Google stack: GA4’s free raw event export lands here as one nested record per event, with repeated fields for parameters and items. That schema is why “unnest the GA4 export” is a rite of passage; the nested/repeated model rewards learning STRUCT and ARRAY semantics rather than flattening everything.
How the GA4 export actually behaves. GA4 offers a daily export (a complete events_YYYYMMDD
table per day) and a streaming export (events_intraday_YYYYMMDD, updated continuously); a faster
“Fresh Daily” option is 360-only. Standard properties are capped at 1 million exported events per
day — filterable to stay under the cap — while 360 properties can export up to 20 billion. Two
gotchas bite nearly every team: daily tables typically land mid-afternoon in the property’s
timezone but can be delayed until later in the day, so morning dashboards on yesterday’s table
will break intermittently; and Analytics keeps updating daily tables for up to two calendar days
as late events arrive, so “final” numbers can shift after you first query them. Google’s own docs
recommend querying the settled daily table rather than the intraday one when you need a stable
dataset for the day.
Cost control is a modeling decision. On-demand billing charges $6.25 per TiB scanned (first
1 TiB per month free, plus 10 GiB of free storage), so the physical layout of tables directly
controls spend. Partitioning — by a DATE/TIMESTAMP column, ingestion time, or integer range —
lets the engine prune partitions that don’t match your filter and skip scanning them; clustering
handles high-cardinality or multi-column filters, and the two combine (partition by date, cluster
within each partition). A SELECT * over an unpartitioned events table scans everything, every
time. Teams with predictable load move to capacity (slot-hour) pricing through BigQuery editions
(Standard, Enterprise, Enterprise Plus), with autoscaling and discounted one- and three-year
commitments, which turns the bill from per-query to per-capacity.
Ecosystem. dbt, Airflow, and Dagster all treat BigQuery as a first-class target, and reverse-ETL tools like Hightouch and Census activate straight from it. The practical pattern for GA4 shops is: land the export, build partitioned/clustered staging models that unnest event parameters once, and point everything downstream at those instead of the raw export.
Use it when you run GA4 and want the raw export analyzed on infrastructure you do not have to operate, or you are on Google Cloud generally. Look past it when unbounded per-scan billing makes finance nervous and no one owns query hygiene, you need sub-second user-facing analytics (ClickHouse territory), or your organization is standardized on another cloud. Full reference lives at cloud.google.com/bigquery/docs.