Skip to content
← Back to writing
Reporting·November 3, 2026·4 min read

When GA4 reports stop being enough

GA4's reports are fine for a quick look at last week. Most teams find the edges within a few months of relying on them for regular reporting.

The edges are not bugs. They are limits Google documents. Knowing which one you have hit tells you whether to change a setting or move the data somewhere else.

The limits, in the order teams hit them

History disappears from detailed reports. A standard GA4 property keeps event-level data for two months by default. You can raise that to fourteen months in the admin settings, and you should on day one. The setting does not affect the standard summary reports. It limits Explorations and funnel reports, which are the ones used for detailed analysis. A year-over-year comparison in an Exploration fails the first time someone tries it on a property left at the default.

Rows go missing. When a report includes demographic or similar signals and a row covers only a few people, GA4 withholds the row so individuals cannot be identified. The total at the top and the sum of the rows no longer agree, and the only notice is a small icon saying a threshold was applied.

Detail collapses into a row called other. A dimension with too many distinct values, such as full page addresses on a large site, gets grouped into a single row labelled (other).

Large questions get sampled. An Exploration over a long period on a busy site is answered from a sample of the data, not all of it.

Dashboards stop loading. Looker Studio reads GA4 through a connection that has usage quotas. A report with many charts and many viewers runs through its allowance, and the charts show errors until the quota resets. Google's own troubleshooting advice for this includes exporting GA4 to BigQuery and reporting from there.

What the BigQuery export gives you

GA4 can send its raw data to BigQuery. For a standard property the export itself costs nothing, up to a million events a day in the daily export. Storage and queries are billed by Google Cloud.

What arrives is every event, one row each, with nothing withheld, grouped or sampled. You keep it for as long as you choose. Dashboards read from BigQuery directly, so the GA4 quotas stop applying.

It also sits next to everything else. Ad spend from the platforms, orders from the store, leads from the CRM. A question such as cost per lead that became a customer cannot be answered inside GA4, because most of that data never reaches GA4.

What it does not give you

Three things catch teams out.

History. The export starts on the day you switch it on. It does not go back and fill in earlier months. Turn it on now, even if nobody plans to use it this quarter, because the day you need the data from last year is too late to start collecting it.

Numbers that match the GA4 screen exactly. The interface applies estimates, attribution rules and identity matching that are not in the raw rows. Totals from BigQuery will be close to the interface and rarely identical. Decide which one is the reported number and stop comparing them every week.

Tables anyone can read. The raw export is one wide table per day, with the details of each event nested inside its row. A dashboard built directly on that is slow to write and easy to get wrong. It needs a set of cleaned tables in between: sessions, page views, conversions, each defined once.

The part in the middle

That set of cleaned tables is where the reporting gets decided. What counts as a session. Which events are conversions. How a campaign name is split into channel and tactic. Write those once, in the warehouse, test them, and every dashboard reads the same answer.

This is ordinary warehouse work, the same as for any other source. Whether to do it in dbt or in your own SQL is covered in should I use dbt or write my own SQL pipelines.

It also depends on what was collected. An export of badly tagged events is a complete and permanent record of badly tagged events. Check the tagging first.

When to move

Stay in the GA4 interface while the questions are about last week's traffic and nobody is building a recurring report on it.

Move when any of these is true. Someone needs detailed analysis that goes back more than fourteen months. A dashboard has shown a quota error in front of a client. Row totals have stopped matching the headline number. Or the question needs data GA4 does not have.

Switch the export on today regardless. It is the one step with a deadline, because every day it is off is a day of history you cannot get back.

Free Checklist

Can Anyone Trust This Report?

A 12-Point Check

Pick the report your team argues about most and answer these about it. Each item is a yes or a no. The first no is usually where the trust went.

Email only. No other fields.

Getting GA4 into a warehouse and cleaned into tables a dashboard can read is the middle of what I do. See data cleaning and warehouse build →

Related reading

← Back to writing