You set up the GA4 BigQuery export. You run your first query. The user count is different from the GA4 interface, session counts do not match, and revenue figures are off. Then you remember you also implemented Consent Mode v2 last month. Now you have two sources of discrepancy operating simultaneously and no clear way to distinguish them. This article explains why BigQuery data can diverge from GA4's UI when Consent Mode is involved, what data is present and absent in the export, and how to build reliable reporting on top of it.
The fundamentalarchitecture difference
GA4's interface shows processed data, while BigQuery receives raw exported event data. Those surfaces can differ for legitimate reasons such as reporting identity, consent-aware modeling, attribution processing, and export timing. You are not always comparing like with like — our deeper guide onGA4 BigQuery export paritywalks through the structural reasons in detail.
According to Google's official documentation, discrepancies between the GA4 interface and BigQuery export are expected in some situations. This is not automatically a bug. It is part of the difference between a reporting surface and a raw export surface.
What consent mode sends tobigquery
When Advanced Consent Mode is implemented, GA4 fires cookieless pings for non-consenting users. These pings are included in the BigQuery export and feed the same modeling layer covered in ourGDPR and GA4 compliance review. You can identify them via theprivacy_inforecord in the BigQuery schema, which contains three fields:
- privacy_info.analytics_storage: 'Yes' means consent was granted. 'No' means denied. 'Null' means consent mode is not implemented or the state is unknown.
- privacy_info.ads_storage: Same values, for advertising storage consent.
- privacy_info.uses_transient_token: 'Yes' indicates the event used an ephemeral identifier rather than a persistent cookie.
Why BigQuery showsmore eventsthan the GA4 UI
BigQuery can show more raw rows than the GA4 interface because it exports raw events, while GA4 reports apply additional reporting logic on top. Consent-aware reporting, reporting identity, table freshness, and excluded value-added layers can all affect the comparison.BigQuery session attributionin particular needs to be reconstructed from raw events rather than read off a pre-computed column.
That does not mean BigQuery is the truth and GA4 is wrong, or vice versa. It means the two surfaces answer different questions. Reconciliation starts by defining which metric, time window, consent state, and identity logic you are trying to match.
Seeing BigQuery figures that don't match your GA4 reports?
Therevenue and conversion modeling gap
The most practically significant discrepancy is often in conversion and revenue reporting. GA4 can apply consent-aware modeling and other reporting logic that is not represented the same way in raw export rows — seehow Consent Mode affects GA4 conversion modelingfor the mechanics behind that gap.
That does not mean every interface-vs-export gap is explained by one feature. It means you should compare stable time windows, inspect consent-state fields, and document which parts of the reporting stack are processed versus raw before presenting a reconciliation.
Time zoneand late-arriving events
GA4 reports in the property's configured timezone. In BigQuery, the exported schema gives you both property-oriented and raw-timestamp views:event_datereflects the property timezone, whileevent_timestampis the raw event time you usually convert explicitly when building custom time-based analysis.
Additionally, Google documents that daily export tables can continue to receive updates after the event date as processing completes. If you are reconciling fresh data, use a stable reporting window rather than assuming the first daily table is final.
BigQuery reporting best practices
- Start by segmenting export rows by privacy_info fields before mixing consent states into one reconciliation
- Use a stable reporting window instead of assuming fresh export dates are final immediately
- Be explicit about whether you are using event_date or converted event_timestamp for day-level reporting
- For user counts, use COUNT(DISTINCT user_pseudo_id) and filter out null values
- For revenue, document that the GA4 UI and BigQuery export do not represent the same processing layer
- Validate any use of User-ID against the actual export fields and your consent-aware implementation
Related guides to read next
Consent Mode for Analytics vs Ads: Understanding the Difference
How the four consent signals control what GA4 and Google Ads can collect and model.
Cookieless Tracking in GA4: What's Possible Without Consent
What GA4 actually collects from non-consenting users, behavioral modeling thresholds, and the legal limits.
Find out why your BigQuery data doesn't match GA4
G4 Audits checks your Consent Mode implementation, privacy_info fields, and related data-quality signals so you can investigate discrepancies between GA4 and BigQuery.