The GA4 Export Table Structure
When GA4 data is exported to BigQuery, it lands in date-sharded tables named events_YYYYMMDD (one table per day). Each row represents one event fired by one user. The table has approximately 30 columns, but the most important for analytics are:
- event_date: date of the event (string, YYYYMMDD format)
- event_timestamp: Unix microseconds when the event fired
- event_name: the name of the event (page_view, purchase, custom_event_name)
- event_params: REPEATED RECORD — array of key-value pairs with all event parameters
- user_pseudo_id: GA4's anonymous user identifier (equivalent to client_id)
- user_id: the user_id you set explicitly (if implemented)
- user_properties: REPEATED RECORD — user-scoped properties
- items: REPEATED RECORD — ecommerce item data (for purchase/add_to_cart events)
- geo.country, geo.city: geographic data
- device.category, device.operating_system: device data
- traffic_source.source, traffic_source.medium: acquisition data
Accessing Nested event_params
The most commonly needed values (page URL, revenue, session ID) are in the event_params RECORD array. To access them, you need to UNNEST or use a subquery:
-- Get page URL from event_params:
SELECT
event_name,
(SELECT value.string_value FROM UNNEST(event_params)
WHERE key = 'page_location') AS page_url
FROM `project.analytics_PROPERTY.events_*`
WHERE _TABLE_SUFFIX = '20260115'
AND event_name = 'page_view'
Common event_params Keys
- page_location: full URL of the page (string_value)
- page_title: page title (string_value)
- session_id: identifies a session (int_value)
- engagement_time_msec: time engaged on page (int_value)
- value: revenue for purchase events (float_value)
- currency: currency code (string_value)
- transaction_id: order ID for purchase events (string_value)
Accessing Items Array
For ecommerce analysis, the items RECORD contains one row per product per event:
SELECT
event_name,
item.item_id,
item.item_name,
item.quantity,
item.price
FROM `project.analytics_PROPERTY.events_*`,
UNNEST(items) AS item
WHERE _TABLE_SUFFIX = '20260115'
AND event_name = 'purchase'
Summary
The GA4 BigQuery schema uses nested RECORD types for event parameters, user properties, and ecommerce items. Each event is one row; nested values (page URL, revenue, product data) are accessed via UNNEST or subqueries on the REPEATED RECORDs. The key columns for most analyses: event_name, user_pseudo_id, event_params (nested), items (nested for ecommerce), traffic_source, and device. Master the UNNEST pattern for event_params — it is used in nearly every GA4 BigQuery query.
See our BigQuery Setup service for schema guidance and query development.
Need help querying GA4 data in BigQuery? Contact Adslytics.
Need expert tracking setup?
Our Google Tag Manager experts have delivered 500+ tracking setups with a 98% success rate.
Get a Free Consultation →