GA4 BigQuery Export

The GA4 BigQuery export is a Google Analytics feature that sends raw, event-level data from a GA4 property into a Google BigQuery dataset. Every row is one event, with its parameters, user identifiers, device, geography, and traffic source attached. It is the only way to read GA4 data that has not been sampled, thresholded, or collapsed into an (other) row.
Enabling it costs nothing on the Analytics side. Storing and querying the data in BigQuery is billed by Google Cloud.
Why the BigQuery Export Matters
It removes the four limits the GA4 interface imposes on every report.
- No sampling. Explorations on a standard property fall back to data sampling above 10 million events. BigQuery reads every event.
- No thresholding. GA4 withholds rows when small user counts could identify someone. The export is never thresholded.
- No cardinality ceiling. GA4 collapses high-cardinality dimensions into
(other)past 500,000 rows a day. BigQuery keeps every distinct value. - No 14-month wall. GA4 caps event-level retention at 14 months. Rows in BigQuery stay until you delete them.
It also opens the data to SQL. Campaign performance can be joined to CRM records, ad spend, refunds, or subscription data in one query, which the GA4 interface cannot do at all.
Export Types
Three exports exist, and they are configured independently.
| Type | Availability | Table | Timing |
|---|---|---|---|
| Daily | Standard and 360 | events_YYYYMMDD |
Once a day, usually mid-afternoon property time |
| Streaming | Standard and 360 | events_intraday_YYYYMMDD |
Continuous, within minutes |
| Fresh daily | 360 only | events_YYYYMMDD |
Complete by 5am, updates within 60 minutes |
Daily is the export most teams need. Streaming exists for near-real-time dashboards and monitoring, and its intraday table is deleted once the daily table for that date lands.
Streaming is not a superset of daily. It omits user-attribution data for new users, so traffic source name, source, and medium can be null on rows the daily export fills in correctly.
BigQuery Export Schema
Data lands in a dataset named analytics_<property_id> inside your Google Cloud project. Four table types can appear:
events_YYYYMMDDfor the daily event tablesevents_intraday_YYYYMMDDfor the streaming table covering the current daypseudonymous_users_YYYYMMDDfor user-level records keyed byuser_pseudo_idusers_YYYYMMDDfor user-level records keyed byuser_id
The event tables use nested and repeated fields rather than flat columns. The fields that carry most of the analysis:
| Field | Type | Holds |
|---|---|---|
event_date |
STRING | Date as YYYYMMDD |
event_timestamp |
INTEGER | Microseconds since epoch, in UTC |
event_name |
STRING | The event, such as page_view or purchase |
event_params |
RECORD, repeated | Key/value pairs for every parameter on the event |
user_pseudo_id |
STRING | The GA4 client ID |
user_id |
STRING | Your assigned User-ID, when one is set |
collected_traffic_source |
RECORD | The UTM values present on the event itself |
session_traffic_source_last_click |
RECORD | Last-click attribution for the session |
traffic_source |
RECORD | First-touch acquisition data for the user |
device, geo |
RECORD | Platform, browser, country, region, city |
items, ecommerce |
RECORD | Products, revenue, transaction ID |
privacy_info |
RECORD | Consent state for ads and analytics storage |
event_params is where the nesting catches people out. A parameter is not a column. It is a row inside a repeated record, with the value split across string_value, int_value, float_value, and double_value. Pulling one out takes an UNNEST:
SELECT
event_date,
(SELECT value.string_value FROM UNNEST(event_params)
WHERE key = 'page_location') AS page_location
FROM `project.analytics_123456789.events_20260907`
WHERE event_name = 'page_view'
Google Signals data is never exported. Age, gender, and interest fields do not exist in these tables at all.
How to Link GA4 to BigQuery
- Create or select a Google Cloud project and enable the BigQuery API.
- Add
[email protected]as a BigQuery User on that project. - In GA4, open Admin, then Product links, then BigQuery links.
- Click Link, choose the Cloud project, and pick a data location. The location cannot be changed afterwards.
- Select the data streams to include, and whether to include advertising identifiers for mobile.
- Choose the export frequency: daily, streaming, or both.
- Submit. The first daily table appears within 24 hours.
The export is not retroactive. Nothing before the link date is ever backfilled, which makes it worth setting up before you need the data.
BigQuery Export Cost
The Analytics side costs nothing. Google Cloud bills three things.
- Storage. $0.02 per GiB per month for active storage, dropping to $0.01 for tables untouched for 90 days. The first 10 GiB each month is free.
- Queries. $6.25 per TiB scanned on demand, with the first 1 TiB each month free.
- Streaming export. $0.05 per GiB exported. Roughly 600,000 GA4 events make up one GiB.
Most small and mid-sized properties stay inside the free tiers on daily export alone. The cost trap is query design, not data volume. SELECT * on event tables scans every column of every day in range, and one careless query can burn a month’s free tier. Filter on _TABLE_SUFFIX, and select only the fields you need.
Common Export Problems
- The 1 million event limit. Standard properties are capped at 1 million events a day on the daily export. 360 properties get 20 billion. Exceed it and Google emails property admins, then pauses the export. Paused days are not reprocessed, so the gap is permanent. Streaming export has no volume cap.
- Timezone mismatch.
event_timestampis UTC whileevent_datefollows the property timezone. Grouping on the wrong one shifts daily totals. - Counts that do not match GA4. Sessions and users have to be calculated from raw events in SQL. GA4’s interface applies its own session logic and behavioral modeling, so exact parity is not expected.
Frequently Asked Questions
What is BigQuery export in GA4?
BigQuery export is a GA4 feature that copies raw, event-level data from a property into a Google BigQuery dataset. Each row is one event with its full parameter set, rather than a pre-aggregated report. It is available on both standard and 360 properties, and enabling it is free.
How do I link GA4 to BigQuery?
Go to Admin, then Product links, then BigQuery links, and click Link. Choose a Google Cloud project with the BigQuery API enabled, pick a data location, select your data streams, then choose daily export, streaming export, or both. The first table lands within 24 hours.
Is the GA4 BigQuery export free?
Enabling it is free. BigQuery charges for storage and queries once you pass the free tier of 10 GiB of storage and 1 TiB of queries per month. Streaming export adds $0.05 per GiB on top. Properties running daily export alone often pay nothing.
Does BigQuery export include historical data?
No. The export starts from the day the link is created, and Google does not backfill earlier data. If BigQuery is anywhere in your plans, link the property now, even if nobody queries it yet.
Why does BigQuery not match my GA4 reports?
BigQuery holds raw events with no modeling, sampling, or thresholding applied. GA4’s reports layer session logic, behavioral modeling, and identity stitching on top of the same events. Small differences in users and sessions are normal. Large ones usually trace back to timezone handling or a session definition written differently in SQL.
Clean campaign data in BigQuery starts with clean tags, so build them with the free UTM builder at linkutm.