Guide 200 · Conversions · GA4 + Tag Manager
Find your key events in the BigQuery export: filter by event name, because there is no key-event column
The BigQuery export has no flag that marks a row as a key event — the export is raw events, one row each — so you bring your own key-event list and filter event_name against it.
After step 6, the query returns one row per key event with its count and its total value, and the count matches the key-event list you brought from Admin.
Download the reference: the BigQuery key events query (JSON) (2052 bytes, MD5 b8847fbb564c2d34b68f16c3af584877). It holds the report or event definition and the worked example with the recomputed figures shown on this page.
What you need
- A linked BigQuery export — the daily table for the day you want, inside the dataset named after your property ID.
- Your key-event list from Admin. The export carries no key-event flag, so the list of event names to filter by comes from Admin under Events, not from the table.
- The schema page beside you. One row is one event; the columns you need are event_name, event_params, event_date and event_timestamp.
The trace
- Find the table. For each linked property, one dataset named
analytics_<property_id>is added to your BigQuery project. Inside it, a table namedevents_YYYYMMDDis created each day when the Daily export is on, andevents_intraday_YYYYMMDDis created when Streaming is on. Query the daily table for a finished day, not the table that fills during the day — that table is deleted at the end of each day once the daily table is complete. - Filter by event name, not by a flag. There is no column that says a row is a key event. Take the event names from your key-event list and filter on them:
WHERE event_name IN ('purchase', 'generate_lead'). The export is raw events, and the key-event status lives in GA4, not in the table. The worked example below counts one day that way. - Count rows, not sessions, for the first check. Each row is one event, so
COUNT(*)grouped byevent_namegives the event count for each key event. Compare that against the key-event count in GA4 reports only after you remember the gap: the export holds raw event and user-level data without the value additions GA4 makes in standard reports and explorations, so the numbers may differ. - Read the value out of event_params. The
event_paramsrecord is repeated for each key associated with an event, and each entry holds the parameter name and a value record withstring_value,int_value,double_valueorfloat_value. Unnest it and filter on the keyvalueto read a purchase value — the worked example sums four purchase values that way. A value converted to dollars also sits in the flatevent_value_in_usdcolumn. - Respect the update window before you call the day final. Analytics updates the daily tables with events for those dates for up to three days after the dates of the events, because not all devices send their data on the same day. A count taken on the morning after the day can still move for three days.
Dead ends
DEAD END — QUERYING THE STREAMING TABLE FOR A FINISHED DAY. The streaming table is a staging table for the current day, populated continuously, and it is deleted once the daily table is complete. A query against events_intraday_20261110 after that day has finished reads a table that no longer exists. Query events_20261110.
DEAD END — EXPECTING THE EXPORT TO MATCH THE GA4 REPORTS EXACTLY. The export is raw data without the additions GA4 makes in standard reports and explorations — modeled data, thresholds, and the rest. A count from BigQuery and a count from the interface can differ without either one being wrong. The export is the check on the raw rows; the interface is the check on the reported numbers.
DEAD END — LOOKING FOR A FLAT VALUE COLUMN ON THE EVENT ROW. There is no flat value column. The value is a parameter inside the repeated event_params record, and it has to be unnested and filtered on the key first. A query that selects value directly fails, because the column does not exist.
End state
The export is the raw record of what happened; the key-event list is the judgment about what mattered. The query joins the two: the list from Admin, the rows from the table. The worked example below counts one day and sums its purchase values.
Worked example — stated inputs, recomputed results. The table events_20261110 holds one row per event. The counts below are stated inputs for the example; every share and the purchase value total are recomputed.
| Event name | Rows | Share of the day |
|---|---|---|
page_view | 11,240 | 88.1% |
session_start | 1,240 | 9.7% |
purchase | 184 | 1.4% |
generate_lead | 96 | 0.8% |
| Total | 12,760 | 100.0% |
Key event rows are 280 of 12,760 — 2.2%. The four purchase rows in the example carry values $129.90, $30.03, $72.05 and $56.96, which sum to $288.94.
Sources
- Analytics Help — BigQuery Export schema — the dataset and table names, the one-row-per-event shape, the event_name column, the repeated event_params record with its four typed value fields, the event_value_in_usd column, and the three-day update window
- Analytics Help — BigQuery Export — that the export is raw event data, that the daily table holds the previous day, that the streaming-day table is deleted once the daily table is complete, and that the export differs from the interface because it excludes the additions GA4 makes in reports
Checked 11 November 2026. The click paths above are the ones in Google's help and developer pages, opened in full on 11 November 2026. No step in this guide was run inside a live Analytics property, because that needs a Google sign-in and this site does not sign in as anyone. The worked-example figures on this page were recomputed in Python with decimal arithmetic, and the downloadable JSON file carries the same recomputed figures. Google moves menu items without warning; if a path on this page no longer matches, the linked help page is the current map.