Why GA4 and BigQuery Numbers Don't Match

Last updated August 29, 2026 · By the SaturnSQL team

They are computed differently. The GA4 UI approximates distinct counts, applies privacy thresholding, and shows modeled data; the BigQuery export is the raw event log. Small gaps are normal, and large ones usually mean a definition mismatch, not missing data.

The usual suspects

1) The UI estimates users and sessions with approximation (HyperLogLog), BigQuery counts exactly. 2) The UI's Active users means engaged users; COUNT(DISTINCT user_pseudo_id) is total users. 3) Thresholding hides small rows in the UI when demographics or signals are on; the export has no thresholding. 4) Consent-mode modeled events appear in reports but never land in the export. 5) Daily tables cut on the property timezone while event_timestamp is UTC. 6) Intraday data is provisional until the daily table is finalized. 7) Explorations can sample; SQL never does.

Reproduce the UI's estimate

If the goal is matching the UI's user counts, approximate the same way it does:

SELECT APPROX_COUNT_DISTINCT(user_pseudo_id) AS approx_users
FROM `myproject.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260801' AND '20260828';

Which number to trust

For auditing, joining to other tables, and anything that feeds a scheduled report, the export is the source of truth: it is the raw log. The UI is the faster directional read. The practical rule is to pick the BigQuery definition, write it down next to the report, and stop reconciling to the last percent.

Run this in SaturnSQL

SaturnSQL is a browser-based SQL editor for teams: shared query library, schema-aware autocomplete, and scheduled exports to Google Sheets and Slack.

Try it free

Do more with BigQuery

Related BigQuery guides