Docs
Docs /Schema Browser /GA4 events
Schema BrowserGoogle Analytics 4

GA4 events

A Google Analytics 4 export is one table per day with every event's parameters packed into a repeated STRUCT. Querylab.io recognises the dataset, collapses the shards into one node, and shows which events and parameters are actually in the data (sampled for free), with the UNNEST snippets ready to paste.

tree
ace-analytics
analytics_388475286 Google Analytics 4 Export Dataset
events (412)
events_intraday (2)
pseudonymous_users (412)
warehouse
analytics_<property id> gets the GA4 icon. Daily shards and intraday shards collapse into one node each, with the shard count.

How the export is recognised

A dataset named analytics_<digits> is treated as a GA4 export; the digits are the property ID. Inside it, events_YYYYMMDD is the daily export and events_intraday_YYYYMMDD the streaming export for the current day. Nothing is configured — the names are the signal.

The shard group

Any table whose name ends in a date (_YYYYMMDD, _YYYYMM, _YYYYMMDDHH) is grouped with its siblings into a single tree node, events (412). This applies to every sharded table, not just GA4. Opening the node shows the schema of the newest shard and a Sharded Table Info group on the Details tab:

DETAILSSCHEMAPREVIEWEVENTSPARAMSSTORAGE

Sharded Table Info

TypeShared Table
How to query this tableSELECT * FROM `ace-analytics.analytics_388475286.events_*` WHERE _TABLE_SUFFIX BETWEEN '20260801' AND '20260828'
Total shards412
First shard:events_20250712
Last shard:events_20260827

Table info

Table IDace-analytics.analytics_388475286.events_*
Data locationUS

The wildcard query has Copy to clipboard and Open in new tab buttons; Discover partitions generates an INFORMATION_SCHEMA.TABLES query that lists every shard with its size. Row counts and bytes in Storage info are summed across the shards.

Seeing which events are in the data

Which events are in the table, from a free 1,000-row sample:

Event NameDescriptionCount (sampled)% of Sample
1page_viewA page was viewed52352.3%
2session_startA session began14114.1%
3user_engagementUser engaged with the page for at least 10 seconds11811.8%
4scrollUser scrolled to the bottom of the page969.6%
5first_visitFirst visit to the site or app444.4%
6purchaseA purchase was completed30.3%
The banner says how many rows were sampled. Run query to get all values re-runs it as a real, billed GROUP BY.

Descriptions come from Google’s documentation for the automatically collected and recommended events; custom events show no description. Counts are of the sample, so treat them as proportions. Run query to get all values shows the estimated cost, then replaces the sample with exact counts — the % of Sample column disappears because it no longer applies.

Pulling parameters out of event_params

The keys inside event_params, with the value type each one uses:

Parameter KeyDescriptionValue TypeSourceCountInsert
1page_locationFull URL of the pagestring_valueBuilt-in523
2page_titleTitle of the pagestring_valueBuilt-in523
3ga_session_idSession identifierint_valueBuilt-in1000
4engagement_time_msecEngagement time in millisecondsint_valueBuilt-in617
5valueMonetary value of the eventdouble_valueBuilt-in3
6plan_tiernullstring_valueSampled41

Source tells you where the row came from: Built-in parameters are the ones GA4 documents (they are listed even if the sample did not contain them, when Show all built-in params is on); Sampled parameters were found in the data and are usually your custom ones. A custom parameter that occurs rarely may be missing from a 1,000-row sample — the banner says so, and Run query to get all values fixes it.

The tab’s main output is SQL. Clicking a row’s Insert button (or Copy SQL) produces the subquery for that key, typed correctly:

1
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') AS page_location

Select several rows and Insert N Selected inserts them as a comma-separated list in the active query tab. The Snippets menu inserts a template instead — Extract String, Extract Integer, Extract Double, Extract Float, Extract Any Type (a COALESCE over all four value columns) or Extract Multiple (Template).

Writing the query

Filter on _TABLE_SUFFIX and event_name first; both prune before any bytes are read. Then unnest what you need:

12345678
SELECT
event_date,
event_name,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') AS page_location,
(SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS session_id
FROM `ace-analytics.analytics_388475286.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260801' AND '20260828'
AND event_name = 'page_view'

The Schema tab fills in Google’s description for the export’s built-in columns when the table itself has none, so columns such as user_pseudo_id or privacy_info come with an explanation.

Extra menu items on a GA4 dataset

Right-click a GA4 dataset for two extra entries under a Google Analytics 4 divider:

  • GA4 Templates — ready-made queries for the property: Events by Date, Top Events, Daily Active Users, Page Views by URL, User Acquisition, User Engagement, Users by Device, Users by Geography, Revenue by Item, Purchase Funnel, Transactions, and explorers for event_params, user_properties, items and the expanded-export tables. Each opens in a new tab with the dataset filled in.
  • GA4 Model Generator — opens a tab that generates analysis-ready tables from the raw export: session-scoped attribution with gclid correction, channel grouping, custom parameter columns, conversion events, RFM segments, with multi-property support and a configurable date range.

The dataset’s Details tab also shows the Property ID, whether Events Export and Intraday Streaming are present, the Last Export Date, and a View in Google Analytics link.