GA4 grew up the day it met BigQuery

GA4 grew up the day it met BigQuery

The most valuable feature in GA4 is free, sits one settings screen deep, and is switched off on most properties I audit. Every standard GA4 property can export raw, event-level data to BigQuery at no charge, up to 1 million events per day on the daily batch export, with a streaming option that has no event cap at all, per Google Analytics Help. In Universal Analytics, this kind of access was a six-figure GA360 line item. Now it ships with the free tier and almost nobody flips the switch.

I run the BigQuery export on the client properties I report on, and at this point I consider the export the actual product. The GA4 interface is a viewer.

The ceilings built into the GA4 interface

Three limits define what the UI can and cannot tell you.

  • Retention. Standard properties keep event-level data for 2 or 14 months, and that is the whole menu; longer options up to 50 months are reserved for 360 properties, per Google Analytics Help. Your year-over-year exploration quietly depends on this setting.
  • Sampling. Explorations sample once a query exceeds 10 million events on a standard property, per Google Analytics Help. On a busy site, any interesting date range crosses that line, and your funnel becomes an estimate.
  • Aggregation. High-cardinality reports collapse the long tail into an (other) row. The detail you wanted is exactly what gets folded away.

A standard GA4 property keeps event-level data for at most 14 months. The free BigQuery export keeps raw, unsampled events for as long as you keep the table.

One warning that matters more than any of those numbers: the export is not retroactive. History starts the day you link the property. The comparison you will want in 2027 depends on a switch you flip this week.

Questions the interface cannot answer, and SQL can

The export lands one row per event with every parameter attached, which means the questions stop being constrained by what a report designer anticipated. A sample of what I actually run for clients:

  • Which landing pages started sessions that led to a first purchase within 30 days, regardless of which channel closed it.
  • A funnel with my own step definitions and time windows, not the exploration template’s.
  • Return on ad spend computed on gross margin joined in from the ERP, with refunds netted out, instead of platform-reported revenue.
  • Cross-device paths stitched on the client’s own login ID rather than a device identifier.

The war story that sold me permanently: on a monthly reporting call, an e-commerce client asked which of their blog posts were starting sessions that ended in first-time purchases. The GA4 exploration wanted to sample and threshold its way to a shrug. One query against the export produced the exact list, with revenue attached, before the call ended. That query has run on a schedule ever since, and it decides part of their content budget.

You do not need to be a data engineer to start. Counting daily buyers is one line: select event_date and a distinct count of user_pseudo_id from the events tables where event_name equals purchase, grouped by date. The next concept worth learning is that GA4 stores event details in a nested parameters field you flatten with an UNNEST clause, which is how you get at things like page location, transaction ID, or the session’s source. Those two ideas cover most marketing questions. Everything past that is refinement.

The workflow that makes this sustainable is scheduled queries feeding a Looker Studio dashboard or a plain spreadsheet. Write the query once, schedule it daily, and the client-facing report updates itself from unsampled data while the GA4 interface stays what it should have been all along: a place to check something quickly.

The bill at real client volumes

BigQuery’s free tier covers the first 10 GiB of storage and the first 1 TiB of query processing every month, per Google Cloud. Past the free terabyte, on-demand querying runs $6.25 per TiB scanned, per Google Cloud.

Those numbers are generous at marketing volumes. The export tables are sharded by date, so a reporting query that filters to the dates it needs scans megabytes, not terabytes. Across the client properties I run, a full month of scheduled reporting lands inside the free tier or costs single-digit dollars. The properties that fit under the 1 million events per day batch cap, which is most mid-size businesses, are effectively running a warehouse for free.

Storage behaves the same way. If a busy property eventually outgrows the free 10 GiB, active storage bills at $0.02 per GiB per month, and tables untouched for 90 days automatically drop to half that, per Google Cloud. Years of event history costs less per month than a single junk click on a competitive keyword.

The one reliable way to spend real money is laziness. A select-star across two years of event tables reads every byte of every column and bills you for the privilege. Date filters and column selection are not optimization theater here; they are the pricing model.

Budget an hour for setup, a weekend for SQL basics, and expect the first useful answer inside the free tier.

Flip the switch before you need it

Nothing else in the GA4 ecosystem changes your position the way the export does. The interface gives you 14 months of sampled history through someone else’s report templates. The export gives you your own event-level table, forever, in standard SQL, for roughly nothing.

GA4 took years of abuse for what its interface lost relative to Universal Analytics, and much of it was earned. But the product grew up the day it met BigQuery. Link the property this week, even if you have no query in mind yet. Future you has one, and future you needs the history to start today.