GA4 BigQuery export for client reporting
Every few months an agency owner asks us the same thing: should we be piping client GA4 data into BigQuery? It usually follows a month where the numbers in an exploration did not match the numbers in a standard report, and nobody could explain the gap to the client.
The GA4 BigQuery export is Google's official route to event-level, unsampled analytics data. It is genuinely useful, and it is also the most over-recommended piece of agency infrastructure we see. Most agencies reporting on small-to-mid websites never hit the limits that justify it.
This post covers what the export gives you, the GA4 sampling limits that justify the setup, what it costs, and the honest test for whether you need a GA4 data warehouse at all - plus where it sits alongside automated client reporting, because a warehouse and a client report are two different jobs.
Last updated: September 2026.
Key takeaways
- The GA4 BigQuery export sends raw, event-level Google Analytics data to Google Cloud BigQuery, one row per event, with no sampling and no retention cap. Enabling it is free; you pay Google Cloud for storage and queries.
- Standard GA4 reports are not sampled. Explorations and other ad-hoc queries can be. Google documents a sampling threshold of 10 million events for standard properties and 1 billion for Analytics 360.
- The export does not backfill. Data starts from the day you switch it on, so enable it early on clients you expect to keep.
- Standard GA4 properties retain event-level data for up to 14 months. BigQuery keeps it as long as you pay for storage, which is the strongest argument on long retainers.
- Across client accounts on ReportsMate, roughly 7 in 10 clients with a connected platform have GA4 connected, more than any other platform - but fewer than 4 in 10 have more than one platform connected. Most agency reporting is nowhere near warehouse scale.
What this post covers
- GA4 interface vs Data API vs BigQuery export
- What is the GA4 BigQuery export?
- When do GA4 sampling limits actually affect client reports?
- What does the raw data export give you that the interface will not?
- How do you set up the GA4 BigQuery export?
- What does a GA4 data warehouse cost to run?
- Does your agency actually need BigQuery marketing reporting?
- FAQs
GA4 interface vs Data API vs BigQuery export
These are four ways to get the same GA4 data out, and they fail in different places.
| Method | Sampling | Granularity | History kept | Cost | Best for |
|---|---|---|---|---|---|
| Standard GA4 reports | Unsampled, but high-cardinality dimensions collapse into an "(other)" row | Aggregated | Up to 14 months event-level | Free | Quick checks, small sites |
| GA4 Explorations | Can be sampled past Google's event threshold | Aggregated, more flexible | Same 14-month limit | Free | Ad-hoc analysis, funnels, segments |
| GA4 Data API | Unsampled for standard requests, subject to quotas and thresholding | Aggregated | Same 14-month limit | Free within quota | Automated reporting tools |
| BigQuery export | None. Raw events | Event-level, one row per event | Unlimited, you own the tables | Free to enable, you pay BigQuery usage | Large sites, custom attribution, multi-year history |
Full disclosure on our vantage point: ReportsMate is our own product, and it reads GA4 through the Data API rather than BigQuery. That shapes how we see the trade-off, so each option below is described on its actual merits.
What is the GA4 BigQuery export?
The GA4 BigQuery export is a built-in Google Analytics 4 feature that writes raw, event-level analytics data into a Google Cloud BigQuery dataset, one row per event. You link a GA4 property to a Cloud project, and Google creates a dataset named after your property ID holding daily tables of every event GA4 collected.
The structure is nested, not flat. Each row is an event with a timestamp, a user pseudo ID, a nested event_params array holding the parameters you sent, plus device, geography, traffic source and item-level ecommerce data. That nesting is why the export needs SQL, not a spreadsheet.
Two export types exist. Daily export ships a complete table for the previous day. Streaming export writes events continuously into an intraday table and is billed at BigQuery streaming insert rates. Most agency reporting only needs the daily export.
The limitation people miss: it is not retroactive. Switching it on today gives you today onwards and nothing before it. Google's setup steps live in the BigQuery Export section of Google Analytics Help.
When do GA4 sampling limits actually affect client reports?
GA4 sampling limits only bite in Explorations and other ad-hoc queries, and only once a property exceeds Google's event threshold for the selected date range. Google documents that threshold as 10 million events for standard properties and 1 billion for Analytics 360. Standard pre-built reports draw on aggregate tables and are not sampled at all.
That distinction matters, because "GA4 is sampling my data" is often the wrong diagnosis. Three other things produce the same symptom of numbers that do not tie out:
- Cardinality limits. In standard reports, once a dimension holds more unique values than GA4 will store, the overflow is bucketed into a single "(other)" row. Long-tail page paths and campaign names hit this first.
- Data thresholding. With Google Signals enabled, GA4 withholds rows that could identify individuals in a small sample. You see a warning icon and lower totals, with no sampling involved. Both behaviours are documented in Google Analytics Help.
- Attribution differences. A conversion credited to one channel in one report may be credited elsewhere in another. That is a modelling difference, not data loss. We cover a related trip-up in GA4 key events vs conversions.
BigQuery solves the first two cleanly, because raw event rows have no cardinality collapse and no thresholding. It does not solve the third: you rebuild attribution logic in SQL yourself, and that cost is what most "just use BigQuery" advice skips. So a sampling notice on a client property is the honest signal to look at the export, and if you never see one, it is solving a problem you do not have. Our guide to working inside the interface is GA4 explorations for client reporting.
What does the raw data export give you that the interface will not?
A Google Analytics raw data export gives you four things the interface structurally cannot: unlimited history, event-level detail, custom attribution, and joins to your own business data.
Unlimited history. Standard properties retain user-level and event-level data for up to 14 months. Past that, event-level year-on-year comparison is not available. BigQuery tables persist until you delete them.
Event-level detail. You can query the sequence of events in a session: which page preceded the form submit, what parameter values were actually sent. The interface only hands you aggregates.
Custom attribution. You can write your own multi-touch model instead of accepting GA4's. That is analyst work, not a toggle, and the results will not match the interface, so plan how you explain the gap before a client sees two conflicting numbers.
Joins to business data. Bringing CRM records, offline conversions or margin data into the same warehouse is where BigQuery marketing reporting earns its keep, because reporting revenue instead of form fills is a conversation GA4 alone cannot support.
How do you set up the GA4 BigQuery export?
Setting up the export takes about ten minutes and needs Editor access on the GA4 property plus Owner access on a Google Cloud project with billing enabled.
- Create or pick a Google Cloud project and enable the BigQuery API. Attach a billing account. The export is free; BigQuery usage is not.
- In GA4, open Admin, then Product Links, then BigQuery Links, and click Link.
- Choose the Cloud project and a data location. Match your client's data residency obligations; changing region later means recreating the dataset.
- Choose your export type. Daily for reporting. Add streaming only if someone needs same-day event data.
- Choose which events to include or exclude. Excluding noisy, low-value events here is the cheapest cost control available.
- Wait 24 hours. The first daily table lands the next day, in a dataset named
analytics_<property_id>with tables namedevents_YYYYMMDD.
For high-traffic clients, check the limits first: Google documents a daily export cap of 1 million events per day on standard properties, and exports exceeding it can be paused. Quotas change, so verify against Google's documentation rather than trusting a blog post, including this one.
If you also report on Search Console, Google Ads, Meta and Google Business Profile, each has its own export or connector path. BigQuery has a native Google Ads transfer; the others need third-party pipelines. Our own GA4 integration skips the warehouse and pulls through the API on a schedule, which is the right trade for smaller properties and the wrong one for very large ones.
What does a GA4 data warehouse cost to run?
Enabling the export costs nothing. Running the warehouse costs BigQuery storage plus query processing, and Google publishes a free monthly usage tier covering a limited amount of both. For a typical small business site, storage is negligible. For a high-traffic ecommerce property it is not.
The cost that catches agencies out is queries, not storage. On-demand pricing charges by bytes scanned, so one careless query against three years of daily tables can process an enormous volume in a single click. Two habits fix most of it: filter on the table suffix so you scan only the dates you need, and select named columns rather than everything.
Budget the human cost too. Someone writes the SQL and maintains it when a client changes their event taxonomy. Check current figures in Google Cloud's BigQuery pricing documentation, and set a project-level cost control before handing access to anyone junior.
Does your agency actually need BigQuery marketing reporting?
Most agencies do not. The test is simple: if no client property is triggering sampling notices, exceeding 14 months of needed history, or requiring a join to offline data, the export is infrastructure you will maintain and not use.
Our own data is consistent with that. Across client accounts on ReportsMate, roughly 7 in 10 clients with at least one connected platform have GA4 connected, making it the most-connected platform by a clear margin. But fewer than 4 in 10 of those clients have more than one platform connected, and the average sits under two. That is ordinary multi-channel reporting, not warehouse-scale analytics.
Build the warehouse when at least one of these is true:
- A client property regularly exceeds Google's sampling threshold in explorations
- You need more than 14 months of event-level history for seasonality or a multi-year retainer story
- You are joining GA4 to CRM, margin or offline conversion data
- Someone on the team writes SQL comfortably and will still be there in six months
Skip it when your clients are small-to-mid sites, your reporting covers standard channel and conversion performance, and the person who would maintain it is also buying the media.
There is a middle option: enable the export now on your larger clients for the history, and keep reporting through the API until you need the raw tables. It is the only decision here that gets more expensive the longer you delay.
Whichever way you go, keep the layers separate. BigQuery is where analysis happens; the report is what the client reads. We built ReportsMate email-first because, after years around agency reporting, the dashboards clients were handed almost never got logged into - a login is a barrier at the exact moment you want attention. In our own delivery data, the median report email is opened in a little over five hours, and around 3 in 4 opens land within a day. That argument runs longer in email reports vs marketing dashboards.
Two terms worth pinning down, since they get used loosely. White-labelling means the report carries your agency's branding, sender identity and custom domain, so it reads as your work rather than a tool's. Reporting cadence is how often the client hears from you, which matters more for retention than any single report's depth.
FAQs
Q: Is the GA4 BigQuery export free?
A: Enabling the export is free on standard GA4 properties. What you pay for is Google Cloud: BigQuery storage for the tables, and query processing when you run SQL against them, with a free monthly usage tier covering a limited amount of both. Streaming export is billed at BigQuery's streaming insert rates and is worth skipping unless someone needs same-day event data. For a small business site the ongoing cost is typically small, and the real budget line is the analyst time to write and maintain the SQL.
Q: Does GA4 sample data in standard reports?
A: No. Standard pre-built GA4 reports draw on aggregated tables and are not sampled. Sampling applies to Explorations and other ad-hoc queries once the property exceeds Google's event threshold for the selected date range, documented as 10 million events for standard properties and 1 billion for Analytics 360. If numbers look wrong outside an exploration, the cause is more likely cardinality limits collapsing values into an "(other)" row, or data thresholding withholding small-sample rows when Google Signals is enabled.
Q: Can I backfill historical GA4 data into BigQuery?
A: No. The export starts from the day you link the property, and Google does not backfill prior data. That is the strongest practical argument for enabling it early on any client you expect to keep. If you need history you never exported, your options are the 14 months still sitting in the GA4 interface, or whatever you archived elsewhere. Turn it on for your larger accounts now, even with no plan to query it, because the history accumulates for free.
Q: Do I need to know SQL to use the GA4 BigQuery export?
A: Realistically, yes. The export lands nested event-level tables, so even counting sessions correctly means unnesting event_params and applying the right session logic. Published query libraries and BI tools sit on top, but somebody needs to read and adapt the SQL when a client changes their event taxonomy. If nobody on the team writes SQL, the export becomes a dataset that quietly accumulates cost and gets queried once.
Q: Should agencies report to clients directly from BigQuery?
A: Rarely as the primary channel. BigQuery is an analysis layer, not a communication one, and the numbers you model there will not always match the GA4 interface a client can open themselves. Use it for the deep work, then deliver the client-facing story on a fixed cadence in a format they will read. Our view is that email delivery wins on read-through, and our own open-timing data supports that, though we are describing our own product so weigh it accordingly. Related reading: GA4 sessions vs users explained.
Q: What is the difference between the GA4 Data API and the BigQuery export?
A: The Data API returns aggregated GA4 data on request, subject to quotas and the same 14-month retention and thresholding rules as the interface, which suits automated reporting tools pulling scheduled metrics. The BigQuery export gives raw event rows with no sampling, no retention cap and no aggregation, which suits custom modelling. Most agencies use the Data API without knowing it, because their reporting tool sits on top of it.
The short version
Enable the GA4 BigQuery export on any client you expect to keep for years, because the history is free to accumulate and impossible to recover later. Build the SQL layer on top only when a real limit forces your hand: sampling notices in explorations, history beyond 14 months, or a join to business data GA4 cannot see.
For everyone else, the reporting problem is not data access. It is the 15-plus hours a week that vanish into assembling numbers a client may never open. Fix delivery first, then size the difference with our reporting time savings calculator or the plans on pricing.
Stop losing your Sundays to client reports. Start your free 14-day trial - no credit card, no setup, cancel anytime. Your clients get branded reports in their inbox automatically.