Data Discrepancies
Data discrepancies between GA4 and other analytics tools are expected, not a bug. The question is not “why don’t they match?” but “which discrepancy is expected and which indicates a problem?” This guide helps you answer that.
Expected discrepancies (not implementation bugs)
Section titled “Expected discrepancies (not implementation bugs)”These differences are by design. Do not try to eliminate them.
GA4 vs. Universal Analytics session counts
Section titled “GA4 vs. Universal Analytics session counts”GA4 sessions are derived from events; UA sessions were collected directly. The differences include:
- No midnight session split in GA4 (UA splits sessions at midnight)
- Different bot filtering — GA4 automatically filters more bot traffic
- Cross-device stitching — GA4 merges sessions when User ID is available
- Campaign attribution — new campaign parameters trigger new sessions in both, but the detection logic differs slightly
A 10-20% difference in session counts between GA4 and UA is typical. This is not a problem.
GA4 vs. your server logs
Section titled “GA4 vs. your server logs”Server logs capture every HTTP request. GA4 captures only events from browsers/apps that run JavaScript. Expect differences from:
- Users who block JavaScript or analytics cookies
- Bot and crawler traffic (GA4 filters most bots; server logs capture all)
- Users who navigate away before the GA4 tag loads
- Direct API calls and non-browser requests
GA4 typically counts 15-40% fewer sessions than server log analysis for the same site, depending on the user base and bot traffic volume.
GA4 vs. Shopify/Stripe/payment processor revenue
Section titled “GA4 vs. Shopify/Stripe/payment processor revenue”Expect small differences due to:
- Currency conversion — GA4 stores revenue in the property currency; payment processors may handle multi-currency differently
- Refunds — GA4 requires explicit refund events; payment processors record refunds automatically
- Pending orders — GA4 may count an order that is later cancelled; payment processor counts final settled amounts
- Timing — GA4 records on browser event (often thank-you page); processor records on payment authorization/capture
A 2-5% revenue difference between GA4 and your payment processor is normal. More than 10% warrants investigation.
GA4 vs. ad platform (Google Ads, Meta)
Section titled “GA4 vs. ad platform (Google Ads, Meta)”Ad platforms count a click that leads to a session; GA4 counts the resulting session. Expect differences from:
- Click fraud filtering (Google removes some clicks after the fact)
- Tag loading failures (click occurs but GA4 tag does not fire)
- Safari/Firefox ITP limits on click attribution
- Cross-device journeys (click on mobile, conversion on desktop)
A 10-20% difference in attributed conversions between GA4 and Google Ads is expected when attribution windows and models differ.
Unexpected discrepancies (potential implementation issues)
Section titled “Unexpected discrepancies (potential implementation issues)”These may indicate actual problems worth investigating.
Revenue 50%+ different from payment processor
Section titled “Revenue 50%+ different from payment processor”This gap usually indicates one of:
- Double-counting — both client-side and server-side are sending purchase events
- Currency mismatch — revenue is being sent in local currency but the property currency is set to USD, and no conversion is happening
- Missing purchases — the purchase event is not firing reliably (mobile/Safari issues, checkout on a separate subdomain without cross-domain tracking)
Debug:
-- Check for duplicate transaction IDsSELECT (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'transaction_id') AS transaction_id, COUNT(*) AS occurrencesFROM `project.analytics_PROPERTY_ID.events_*`WHERE event_name = 'purchase' AND _TABLE_SUFFIX BETWEEN '20240101' AND '20240131'GROUP BY transaction_idHAVING COUNT(*) > 1ORDER BY occurrences DESCAny transaction_id with more than 1 occurrence is being counted multiple times.
Conversion count significantly lower than expected
Section titled “Conversion count significantly lower than expected”If GA4 shows 20% of the conversions your CRM records, investigate:
- Missing event fire — the conversion event is not firing on some checkout paths (mobile, specific browsers, fast connections)
- Filter applied — an active data filter is excluding the events
- Consent mode blocking — in EU markets, consent mode may be blocking analytics collection for users who decline
- Cross-domain breakdown — checkout on a different domain without cross-domain tracking
Debug: Use the Realtime report and DebugView to manually complete a conversion and verify the event appears in GA4 within 30 seconds.
GA4 BigQuery counts differ from GA4 interface
Section titled “GA4 BigQuery counts differ from GA4 interface”Small differences (< 5%) are expected due to:
- Processing latency in standard reports vs. raw BigQuery data
- Reporting identity differences (GA4 UI may apply Blended identity; BigQuery has raw device IDs)
- Data thresholds in GA4 UI for small counts (privacy protection)
Large differences (> 10%) indicate:
- The BigQuery export is filtering something (check for active data filters in Admin)
- Your BigQuery query has an error (incorrect date filtering, wrong session counting)
- You are comparing different metrics (GA4 UI shows “sessions” using their definition; your SQL query may be counting differently)
Debug:
-- Compare event counts in BigQuery vs. what GA4 reportsSELECT event_date, event_name, COUNT(*) AS bq_countFROM `project.analytics_PROPERTY_ID.events_*`WHERE event_name IN ('page_view', 'session_start', 'purchase') AND _TABLE_SUFFIX = '20240115' -- compare this specific date to GA4 reportsGROUP BY event_date, event_nameCompare the page_view and session_start counts to GA4’s standard reports for the same day. If they match, your BigQuery implementation is correct.
Consent Mode: the biggest hidden cause of discrepancies
Section titled “Consent Mode: the biggest hidden cause of discrepancies”Consent Mode is now the single largest driver of data gaps between GA4 and other systems — especially for sites with European traffic. If you launched Consent Mode and your numbers dropped, that is not a bug. But the size of the drop and how GA4 compensates for it are critical to understand.
How Consent Mode affects data collection
Section titled “How Consent Mode affects data collection”When a user declines analytics consent:
- Basic Consent Mode: GA4 sends no data at all. The user is completely invisible. This can mean 30-70% of EU traffic simply disappears from GA4.
- Advanced Consent Mode: GA4 sends cookieless pings (no user identifiers, no cookies). Google uses these pings plus machine learning to model the missing data — called behavioral modeling. This fills some of the gap, but modeled data is an estimate.
The result: your server logs show 100 sessions, but GA4 shows 60-80. The “missing” sessions are users who declined consent.
Diagnosing consent-related drops
Section titled “Diagnosing consent-related drops”Symptom: Traffic dropped 20-50% on the date you implemented a Consent Management Platform (CMP), with no other changes.
Verification:
-- Compare traffic before and after CMP launchSELECT event_date, COUNT(*) AS events, COUNT(DISTINCT user_pseudo_id) AS usersFROM `project.analytics_PROPERTY_ID.events_*`WHERE _TABLE_SUFFIX BETWEEN '20240101' AND '20240131'GROUP BY event_dateORDER BY event_dateIf you see a cliff on the exact date the CMP went live, consent is the cause.
Check consent grant rates: Most CMPs provide a dashboard showing acceptance vs. rejection rates. A 40% acceptance rate in Germany is typical — meaning 60% of users are not tracked (Basic) or tracked without cookies (Advanced).
Consent Mode and ad platform discrepancies
Section titled “Consent Mode and ad platform discrepancies”Consent Mode creates a specific pattern of discrepancies with ad platforms:
- Google Ads: Uses conversion modeling to estimate conversions from users who declined consent. GA4 and Google Ads may show different modeled numbers because they use different modeling approaches.
- Meta/Facebook: The Meta Pixel is typically blocked entirely when
ad_storageis denied. Meta CAPI (server-side) can still receive events, but withoutfbp/fbccookies, match rates drop significantly. This creates large gaps between Meta’s reported conversions and GA4’s. - Other ad platforms: Most non-Google platforms have no consent modeling. If consent blocks the pixel, that conversion is simply lost.
Advanced vs. Basic Consent Mode: the data quality tradeoff
Section titled “Advanced vs. Basic Consent Mode: the data quality tradeoff”| Aspect | Basic Consent Mode | Advanced Consent Mode |
|---|---|---|
| Data sent when consent denied | Nothing | Cookieless pings |
| Behavioral modeling available | No | Yes (after ~7 days of data) |
| Typical EU data gap | 30-70% | 5-20% (after modeling) |
| Privacy compliance | Strictest | Accepted by most DPAs |
| GA4 Realtime accuracy | Missing consented-only | Near-complete |
Modeled data caveats
Section titled “Modeled data caveats”GA4’s behavioral modeling fills gaps, but with limitations:
- Modeling requires volume: Properties with fewer than ~1,000 daily users may not qualify for behavioral modeling. Small sites see no modeling benefit.
- Modeled data is in reports, not BigQuery: The BigQuery export contains only observed (unmodeled) data. If your GA4 reports show 1,000 sessions but BigQuery shows 700, the difference is modeled data.
- You cannot isolate modeled vs. observed: GA4 does not separate modeled data in standard reports. You can only see the “unsampled range” indicator in Explorations.
- Conversion modeling is separate: Google Ads has its own conversion modeling that is separate from GA4’s behavioral modeling. Do not expect them to produce the same numbers.
What to tell stakeholders
Section titled “What to tell stakeholders”When consent causes a data drop, frame it clearly:
“Our GA4 data now reflects only users who consented to tracking (plus modeled estimates for those who didn’t). The 30% drop is not lost traffic — it’s users exercising their privacy rights. Our actual traffic has not changed; our measurement coverage has. Comparing pre-consent and post-consent GA4 numbers is comparing different measurement scopes.”
Systematic discrepancy investigation
Section titled “Systematic discrepancy investigation”When a stakeholder reports a number mismatch, use this process:
Step 1: Define exactly what is being compared. “Revenue is different” is not specific. “GA4 shows $45,234 revenue for January, but Shopify shows $47,891 for the same period” is specific.
Step 2: Check whether the discrepancy is expected. Consult the “expected discrepancies” list above.
Step 3: Verify the comparison is apples-to-apples:
- Same date range (including time zone)
- Same metric definition (GA4 “purchase revenue” excludes tax and shipping by default — compare only the revenue GA4 is designed to capture)
- Same conversion window (GA4 uses session-level attribution; CRM may attribute to original campaign)
Step 4: Check for data quality issues in GA4:
- Is the data filter excluding some traffic?
- Is the event firing reliably (check DebugView or BigQuery for the specific date)?
- Is consent mode suppressing events for some users?
Step 5: Check for data quality issues in the other system:
- Is the payment processor including test transactions?
- Is the CRM including cancelled or refunded orders?
- Is the ad platform using a different attribution window?
Common mistakes
Section titled “Common mistakes”Assuming GA4 is wrong when numbers differ
Section titled “Assuming GA4 is wrong when numbers differ”GA4 measures different things from most other systems. Lower session counts than server logs is not wrong — GA4 is measuring human sessions with JavaScript enabled. The discrepancy is meaningful data about your bot traffic, ad blockers, and JavaScript coverage.
Comparing different time zones
Section titled “Comparing different time zones”If GA4 property time zone is EST and you are comparing to a UTC-based payment processor, a single day’s data will differ because the day boundaries are in different places. Always ensure time zone alignment before investigating discrepancies.
Not tracking refunds
Section titled “Not tracking refunds”GA4 has a refund event for tracking purchase cancellations, but most implementations do not send it. If GA4 revenue is consistently higher than payment processor revenue, missing refund tracking is a common cause.