Why Does GA4 Traffic Attribution Differ from BigQuery?
GA4 traffic attribution can differ from BigQuery because you may be comparing different reporting scopes or attribution models, or because the export data is incomplete or not yet stable. If you’re auditing channel or key-event totals, match the definitions and dates first; even a careful comparison may not produce identical results because GA4 reporting surfaces can include value additions that aren’t in the BigQuery export.
The steps below are for GA4 analysts checking a channel or key-event discrepancy. Treat them as a diagnostic sequence, not proof that either system is wrong.
First, separate the attribution scopes
In GA4, traffic-source dimensions can be user-, session- or event-scoped. Google Analytics Help’s Scopes of traffic-source dimensions says user- and session-scoped dimensions use the paid-and-organic last-click model. Event-scoped dimensions use the property’s selected attribution model, which defaults to data-driven attribution.
Google’s BigQuery Traffic attribution data documentation describes different levels of exported data: user-level first-arrival fields, session-level data in session_traffic_source_last_click, and event-level attribution fields for conversion events. The documentation describes the event-level export data as using cross-channel last click. That is not necessarily the same model as the one selected for GA4 event-scoped reporting.
Don’t infer a field’s scope from its name alone. The BigQuery documentation discusses traffic_source.source, traffic_source.medium and traffic_source.name in more than one context. Check your export schema, the event you’re examining and the relevant documentation before interpreting those fields. A session-level last-click record, event-level attribution data and GA4’s selected event-scoped model are not interchangeable.
Audit the comparison in order
- Choose a date outside the export update window. Google Analytics Help’s BigQuery Export documentation says daily export is for the previous day. Daily tables may receive updates for up to two calendar days plus today after the table date. For a stable daily comparison, use the
events_YYYYMMDDtable rather than an intraday table, and allow the documented update window to pass. - Align the property time zone. BigQuery export table updates follow the Analytics property’s time zone. Use that time zone when selecting and recording the dates on both sides; a calendar-day mismatch can make otherwise similar totals incomparable.
- Write down exactly what the GA4 report shows. Record the report, date range, traffic-source dimension and scope, metric, event name, filters and attribution setting. If you’re comparing channel totals, note which channel dimension or grouping the report uses. Confirm that the event is marked as a key event in GA4 when that status is relevant to the comparison.
- Inspect the matching BigQuery daily table and event context. Confirm that the table exists and is past its update window. Check the event date and
event_name, then inspect the applicable source/medium or session record in the context of that event and your export schema. Don’t select a field just because its name resembles the GA4 dimension. - Document the scope and model on both sides. For example, write “GA4 event-scoped key-event credit, property-selected model” beside “BigQuery event-attribution data, documented as cross-channel last click.” If you’re comparing session-scoped data instead, label it as session-level and don’t treat it as event-scoped attribution.
Google’s BigQuery Export documentation says the export contains raw event and user-level data and that BigQuery can differ from standard GA4 reporting because reporting surfaces can include value additions not present in the export. Google’s BigQuery export overview explains that exported raw events can be queried with SQL-like syntax; it does not promise that every BigQuery query will reproduce a GA4 report. The query and field interpretation depend on the property’s export schema and data, so there is no universal field selection that guarantees report parity.
Hypothetical example: different channel credit
An analyst compares a GA4 event-scoped key-event report using the property’s selected attribution model with BigQuery event-attribution data described in Google’s documentation as cross-channel last click. One channel receives more credit in GA4, while another receives more in BigQuery.
That difference alone does not establish a tracking fault. The analyst should first confirm the key event, date and property time zone, then document the scope and model on both sides. If the GA4 report and BigQuery are using different attribution approaches, the channel-credit difference may reflect that mismatch. It still doesn’t prove the reports will match once the definitions are aligned: investigate the remaining checks below.
Decide what to do with the discrepancy
- The mismatch resolves after you align scope and model: document the corrected comparison, including the report, dimensions, model, dates and table used. Use that defined comparison for subsequent analysis.
- The mismatch remains: recheck whether the daily table is stable, the dates use the property time zone, the same event and metric are being compared, and the filters and channel definitions are aligned. Then investigate event collection, export data availability and the differences between GA4 reporting surfaces and raw export data before making campaign decisions.
- You can’t identify the applicable BigQuery field or record: pause the comparison and inspect the property’s actual schema and event context. A familiar field name by itself is not enough to establish that it represents the attribution scope you need.
Verification checklist
- The BigQuery
events_YYYYMMDDtable exists and is outside its documented update window. - The GA4 and BigQuery dates are aligned to the Analytics property’s time zone.
- The event date and event name match; the event is a GA4 key event where that status matters.
- The relevant source/medium fields or session record have been inspected in context, using the property’s export schema.
- The report, metric, filters, channel dimension, scope and attribution model are recorded for both sides.
- Any remaining difference has been checked against export timing, data availability, event collection and reporting-surface differences before it informs a campaign change.
When you document a discrepancy, include the exact GA4 report and settings, date range and time zone, BigQuery table, event and fields inspected. Which part of this comparison has been hardest to reconcile in your own GA4 workflow?
Sources
- Google Analytics Developers: Traffic attribution data
- Google Analytics Help: Scopes of traffic-source dimensions
Editorial note: AI assists with research, drafting and automated checks. Sources are linked so you can verify the guidance. Platform requirements can change; confirm the details that apply to your setup.