AttributionGA4Diagnostic

GA4 Data Inaccurate? 7 Reasons Your Numbers Don't Match Reality

GA4 rarely matches your CRM or Google Ads, and most of the gap has a known cause. These are the seven that distort GA4 data most, the pipeline layer where each one enters, and the fix for each.

Shuruthi Sellamuthu
By Shuruthi Sellamuthu Published 14 min read

Summarize with AIGet a snapshot of this article

GA4 data inaccurate: Waft, the Waftr mascot, pins seven reasons GA4 numbers miss reality on an evidence board
In this guide 3 tools
  • 7 causes, each with a fix
  • A BigQuery bot check
  • A 5-step repair plan
7 causes, each with a fix
Pipeline map, browser to report
BigQuery query included
5-step repair plan
Get a GA4 audit →
Short answer

Most GA4 inaccuracy comes from seven sources. Direct traffic hides real referrers, bots pass as people, key events stand in for CRM conversions, sampling and Consent Mode v2 modeling smooth the numbers, payment providers reset the source, and Unassigned swallows odd UTMs. Each one enters at a known layer of the pipeline and has a specific fix in GA4, Tag Manager or BigQuery.

  1. 1Direct traffic is not actually directFix: UTMs plus a custom channel groupBrowser
  2. 2Bot traffic looks humanFix: hostname, server-side and BigQuery filtersVisitor
  3. 3GA4 conversions are not CRM conversionsFix: one source of truth per decisionReport
  4. 4Sampling quietly smooths the numbersFix: run decisions from BigQueryProcessing
  5. 5Consent Mode v2 modeled data looks realFix: separate measured from modeledConsent
  6. 6Payment providers reset the sourceFix: an unwanted referrals listTag settings
  7. 7Unassigned traffic is GA4 giving upFix: map every UTM pattern to a channelReport

Every Google Analytics 4 (GA4) report has a confidence problem. The number on the dashboard rarely matches what the CRM says, what Google Ads says, or what actually happened in the business. Most teams notice the gap and assume they are reading the wrong report. They are not. GA4 bends the signal in predictable ways unless it is wired carefully against them.

None of this is malicious. It is the combined effect of bots that look human, browsers and ad blockers stripping referrers, consent banners and modeled data, attribution defaults, and a Direct bucket that quietly absorbs everything GA4 cannot explain. By the time a report renders, the original signal has been bent in seven distinct ways.

When a client's GA4 and CRM disagree, the Waftr team works through these seven in this order. Each reason below has a cause, a symptom and a fix, and none of them require throwing GA4 out. Building from scratch instead? The companion guide on how to set up Google Analytics 4 the right way covers the setup decisions that prevent most of these before they start.

Where do the distortions enter the GA4 pipeline?

GA4 data gets distorted at six points between the visitor and the report. Every layer adds its own noise or removes its own signal, and knowing which layer bent the number is the only way to fix the right thing.

  1. 1Visitor

    Bots and headless browsers arrive alongside real people.

    2
  2. 2Browser

    Safari ITP and ad blockers strip referrers and shorten cookies.

    1
  3. 3Consent

    A denied banner removes cookies and identifiers before tags run.

    5
  4. 4Tag Manager

    Broken UTMs and payment-provider self-referrals reset the source.

    67
  5. 5GA4 processing

    Sampling, thresholds and behavioral modeling smooth the numbers.

    45
  6. 6Report

    The channel grouping and attribution model decide who gets credit.

    137
Figure 1. The six layers of the GA4 pipeline, the distortion that enters at each one, and the reasons below that it causes.

Each layer has a fix. The seven reasons below are ordered by how much damage they usually do to the numbers a team reports.

01
Browser and report

Reason 1: Direct traffic is not actually direct

Direct in GA4 does not mean someone typed your URL. It is the catch-all bucket for sessions GA4 cannot attribute to a known source: dark social, in-app browsers, stripped referrers, AI assistants that send no referrer, and HTTPS-to-HTTP downgrades all land there.

A common audit finding is a marketing team reading a large Direct channel as brand strength, when most of it is LinkedIn posts and Slack messages that lost their referrer inside native apps. In one Enterprise SaaS project, server-side tagging with Google Tag Gateway plus UTM and referrer fallbacks cut the share of leads counted as direct from 53% to 38%, 2 months before vs 2 months after. The Enterprise SaaS server-side tagging case shows how.

Real traffic that routes into Direct usually comes from:

  • Links shared inside the Instagram, LinkedIn, TikTok and Facebook apps, whose in-app browsers drop the referrer
  • HTTPS pages linking to HTTP destinations, where the browser drops the referrer
  • Push notifications that open in webviews, and email clients that strip referrers
  • AI assistants that send visitors without a referrer header
  • Strict browser privacy modes, such as Brave's, and server-side redirects that lose the original referrer
The fix

Tag every link your team controls with UTM parameters: email campaigns, social posts, partner placements, even internal Slack messages that link to landing pages. If you control the link, you control the attribution.

Then build a custom channel group in GA4 that catches known unrecognized sources such as chatgpt.com, perplexity.ai, lnkd.in, l.facebook.com and l.instagram.com, and routes them to named channels before they fall to Direct.

Custom channel group rule: rescue dark social from Direct
Channel: Dark Social
Condition: Source matches regex (lnkd\.in|l\.facebook\.com|l\.instagram\.com|t\.co|out\.reddit\.com)
Place: Above Direct in the channel group order
Channel: AI Assistant (custom)
Condition: Source matches regex (chatgpt\.com|perplexity\.ai|copilot\.microsoft\.com)
Place: Above Direct
02
Visitor

Reason 2: Bot and AI crawler traffic looks human

GA4 excludes known bots automatically, using Google research and the IAB/ABC International Spiders and Bots List. You cannot switch that filter off, and you cannot see how much it removed. What it misses is the traffic that matters: headless browsers and scrapers that run JavaScript, fire your tags and simulate scrolling and dwell time.

Crawlers that do not execute JavaScript, which includes most AI crawlers such as GPTBot and ClaudeBot, never fire a GA4 tag. Their visits show up in server logs and never in GA4 reports. The sessions that inflate GA4 come from automation that renders the page like a browser.

The usual symptom is a traffic lift with no campaign change and no SEO win, concentrated on a few page types, with zero engagement time and zero conversions, coming from a handful of data-center networks. If leadership is celebrating that lift, it is celebrating the wrong number.

The fix, in three layers
  1. Add a hostname condition to your GA4 tags in Tag Manager, so hits from hostnames that are not yours never reach reports.
  2. Filter server-side: in a server-side Tag Manager container or in BigQuery, drop sessions from known data-center IP ranges, sessions with zero engagement time and user agents such as HeadlessChrome and PhantomJS.
  3. Run the monthly BigQuery check below. Spikes in zero-engagement sessions by browser and country are bots.
BigQuery query: flag suspicious bot signaturesGA4 export
-- Zero-engagement sessions by day, browser and country
WITH events AS (
  SELECT
    event_date,
    device.web_info.browser AS browser,
    geo.country AS country,
    user_pseudo_id,
    (SELECT value.int_value FROM UNNEST(event_params)
      WHERE key = 'ga_session_id') AS session_id,
    (SELECT value.int_value FROM UNNEST(event_params)
      WHERE key = 'engagement_time_msec') AS engagement_ms
  FROM `project.analytics_xxxxx.events_*`
  WHERE _TABLE_SUFFIX BETWEEN '20260401' AND '20260430'
),
sessions AS (
  SELECT event_date, browser, country, user_pseudo_id, session_id,
    SUM(IFNULL(engagement_ms, 0)) AS engagement_ms
  FROM events
  GROUP BY 1, 2, 3, 4, 5
)
SELECT
  event_date,
  browser,
  country,
  COUNT(*) AS sessions,
  COUNTIF(engagement_ms = 0) AS zero_engagement
FROM sessions
GROUP BY 1, 2, 3
HAVING sessions >= 50 AND zero_engagement / sessions > 0.8
ORDER BY sessions DESC
LIMIT 100;
03
Report

Reason 3: GA4 conversions are not CRM conversions

A GA4 conversion is whatever event someone flagged as a key event. It rarely equals a qualified lead or a closed deal, and the mismatch between GA4 conversions and CRM revenue is built into how each tool counts.

GA4 counts sessions and events. The CRM counts contacts, opportunities, qualified leads and revenue. They use different denominators, different attribution windows and different identity resolution. GA4 defaults to data-driven attribution, Google Ads credits only its own clicks, and the CRM uses self-reported or first-touch source. The same lead shows a different source in each tool, and none of them is wrong.

Identity is where the gap widens: measured across Waftr client audits, 28-41% of CRM leads arrive with no GA4 client ID, so no tool can tie those leads back to a session.

The typical argument goes like this. GA4 reports hundreds of conversions for the month, the CRM shows a few dozen qualified leads, and leadership asks which number is right. Both are. GA4 is counting every form submission, including bots, internal QA tests and personal-email sign-ups. The CRM is counting people sales accepted. The fix is not making them match. It is deciding which number drives which decision.

The fix

Use the CRM as the source of truth for revenue and qualified leads, and GA4 for traffic, engagement and channel performance up to the conversion. Stop trying to make them match.

For paid acquisition, import offline conversions from the CRM into Google Ads, so bidding optimizes for qualified leads instead of form fills. In one SaaS GA4 audit, fixing a broken first event and form tracking that never fired brought form tracking about 25% closer to CRM records and lifted Google Ads remarketing conversions 20% on the rebuilt audiences.

04
Processing

Reason 4: Sampling quietly smooths the numbers

On a standard GA4 property, Explore reports sample once a query covers more than 10 million events. Standard reports are not sampled, but they can apply data thresholds that withhold rows with small user counts, mostly when Google signals is enabled, and they fold high-cardinality dimensions such as user_id or account_id into an (other) row.

Sampling kicks in silently. The badge on an Explore report says it is based on 100% of available data until it does not, and most users never notice the badge change. The pattern is familiar: a high-value segment shows one session count in Explore and a materially higher count when the same query runs in BigQuery against raw data, enough to change which channel looks profitable for the quarter.

The fix

Connect BigQuery on day one and run audit queries there. The GA4 interface is for exploring. BigQuery is for decisions.

For dashboards that need to hold up in a board meeting, pull directly from BigQuery into Looker Studio. Before you trust an Explore result, rerun the same query in BigQuery for the three metrics the team relies on most and compare the counts.

05
Consent and processing

Reason 5: Consent Mode v2 modeled data looks real

With Consent Mode v2 in advanced mode, GA4 still receives cookieless pings when a visitor denies consent. If the property meets Google's eligibility thresholds, behavioral modeling then estimates the sessions and conversions of those visitors from the behavior of consented ones. The estimates appear in standard reports with no visual flag.

The output is plausible. It is not what happened, and the higher your denial rate, the larger the modeled share. A typical case: after a new consent banner rolls out, GA4 shows a stable conversion rate while measured conversions in BigQuery fall and modeled conversions fill the gap. Consent rates drive everything downstream, which is why this check belongs in the same review as cookie consent and privacy compliance.

The fix

Know which numbers are modeled. In Admin, Reporting identity shows whether the property uses Blended identity, which includes modeled data. The BigQuery export holds observed events only, and its privacy_info fields record the consent state of each event, so comparing BigQuery counts with GA4 reports shows the modeled share.

For board-level reporting, use measured-only views and state the modeling status next to the metric.

06
Tag settings

Reason 6: Self-referrals from payment providers reset the source

When a visitor leaves for Stripe, PayPal, an SSO provider or any third-party domain mid-session, GA4 treats the return as a new referral by default. The original source is overwritten, and the sale is credited to the payment provider instead of the campaign that drove the visit.

Cross-domain measurement and the unwanted referrals list are configured per data stream. Without them, every checkout looks like Stripe brought the customer, every SSO login looks like Google did, and every chat widget on another domain splits the session. The classic symptom is stripe.com listed as a top revenue source, while paid social looks unprofitable, loses budget, and the campaigns that actually closed the sale get no credit.

The fix

Add every payment, sign-in, chat and widget domain under Admin, Data streams, Configure tag settings, List unwanted referrals. Then test the full purchase flow in DebugView after each addition: the source should hold from landing page to purchase confirmation with no intermediate referrer overwriting it.

Recommended unwanted referrals list: starting set

  • stripe.com
  • checkout.stripe.com
  • paypal.com
  • checkout.shopify.com
  • pay.amazon.com
  • accounts.google.com
  • login.microsoftonline.com
  • auth0.com
  • okta.com
  • intercom.io
  • zendesk.com
07
Report

Reason 7: Unassigned traffic is GA4 giving up

Unassigned is GA4 admitting it cannot place a session in any channel. If it is more than about 1 percent of sessions, treat the channel grouping as broken.

Sessions become Unassigned when their source and medium match no rule in the default channel group. The usual cause is UTM tags with custom medium values such as sms_blast, pdf_link or qr_code that the default rules do not recognize; recognized mediums include organic, cpc, referral, email, display and affiliate. A growing cause is links that set utm_source but no utm_medium. One agency template with a non-standard medium can push a large share of paid traffic into Unassigned for months, and every paid performance report quietly excludes it.

The fix

Audit UTM coverage of every campaign URL you control, then build a custom channel group that maps each real UTM pattern to a named channel. Add a catch-all rule that routes any session with a utm_source but no utm_medium to an Other Tagged Traffic channel. Every session should land in a deliberate channel, even if that channel is Other.

How big is the gap between GA4 and reality?

Stack the seven distortions and the reported number drifts a long way from what actually happened. GA4 is working as designed; each layer simply does something the dashboard does not show. A worked example makes the structure visible.

From 100 real visitors to 65 trustworthy sessionsIllustrative model
Real human visitors
100
Tracked 30 lost to ITP, ad blockers, consent, in-app browsers
70
Reported sessions 20 bot sessions added
90
Counted and attributed 25 misattributed
65
Figure 2. Illustrative round numbers chosen to show the structure, and no measured benchmark. 100 real visitors become 65 sessions that are both counted and attributed correctly. Real gaps vary by industry, region and setup quality.

The trap is the 90. It looks like 90% of reality, but it is the wrong 90%: 20 of those sessions are not real and 30 real ones are missing. Of the 90, about 25 are then misattributed through self-referrals, broken UTMs landing in Unassigned, dark social falling into Direct, or an attribution model that overrides the channel that actually drove the visit.

Ecommerce sites with mature tracking usually sit below this gap. B2B SaaS with heavy LinkedIn and dark-social discovery often sits above it. The point is not the exact number. The gap exists, it has a known structure, and it can be measured.

How to actually trust GA4: the 5-step repair

Five changes do most of the work, and a team that reports GA4 numbers to leadership needs all of them. They are listed in the order we would make them on a live property.

  1. 1

    Connect BigQuery from day one

    The BigQuery link gives you unsampled raw events with no thresholds. Run audit queries there instead of in the GA4 interface. The payoff is being able to defend any number to leadership.

  2. 2

    Move revenue-affecting tags to server-side GTM

    Server-side tagging recovers conversions that Safari ITP and ad blockers drop on the way to Google. For any business with paid acquisition, it is the fix with the largest payoff in this list. In the US retail Safari ITP case, cost per lead fell 20% after the server-side setup.

  3. 3

    Build custom channel groups

    The default channel group sends too much real traffic to Direct, Unassigned and Referral. Half an hour on a custom group makes the channel report match how the business actually thinks about acquisition.

  4. 4

    Add every third-party domain to unwanted referrals

    Payment providers, SSO, chat widgets and affiliate networks. Any domain a visitor passes through mid-session belongs on the list, so the source survives checkout.

  5. 5

    Run a 15-minute monthly validation

    Compare GA4 sessions with ad platform clicks and CRM contacts for the previous month, track the ratios, and flag any change above 10 percent. With this check, most tracking breaks surface within 30 days. Without it, they surface after six months.

FAQ

Before a GA4 number goes to leadership

Short, self-contained answers to what teams ask once they see the gap.

Why are GA4 conversion numbers and Google Ads conversion numbers always different?
Different attribution models, lookback windows and identity resolution. Google Ads credits its own clicks and reports by click date, while GA4 uses data-driven attribution across channels and reports by event date. A steady gap is expected. A gap that widens suddenly after a site or tag release means something broke on one side.
How accurate is GA4 modeled data?
It depends on volume. Behavioral modeling only switches on when a property meets Google's eligibility thresholds for consented and denied traffic, and estimates get less reliable as denial rates rise or conversion volume falls. For low-volume B2B properties, state the modeling status next to any metric that depends on it and use BigQuery for measured counts.
Should you worry if Direct traffic is more than 40 percent of total?
Usually, yes. On a site with active campaigns and social distribution, a Direct share that high normally means the channel grouping is collapsing real sources into the catch-all bucket. Fix it with a custom channel group, an unwanted referrals list and UTM parameters on every link your team controls.
Does sampling affect GA4 standard reports?
Not in the same way. Standard reports are unsampled but can apply data thresholds that withhold rows with small user counts. Explore reports can apply both sampling and thresholds. The BigQuery export has neither, so any number quoted to leadership should come from BigQuery rather than the GA4 interface.
Can bots be completely filtered out of GA4?
No. GA4's automatic known-bot exclusion only catches declared bots. Server-side filtering on data-center IP ranges, zero-engagement sessions and bot user agents removes much of the rest, and custom BigQuery rules catch more. Full elimination is not achievable, so review zero-engagement sessions every month instead.
How often should the GA4 channel grouping be audited?
Quarterly at minimum. New sources such as AI assistants, new social platforms and partner channels keep appearing, and they fall into Direct or Unassigned until the channel grouping is updated. A quarterly review catches that drift before it changes the numbers leadership sees.
Given all these problems, is GA4 still useful?
Yes, for what it does well. GA4 is strong at relative comparison: this month against last, one channel against another, one segment against another. It is weak at absolute truth, such as exactly how many sales a campaign drove. Use GA4 for trends and segments, and the CRM plus BigQuery for absolute numbers.
Next step

Which of the seven hits your revenue numbers hardest?

Start with the 15-minute monthly check from step 5. If the ratios move and you cannot place the cause, a Google Analytics audit traces all seven through GA4, Tag Manager, consent and Google Ads with read-only access, then ranks each finding by its effect on reported revenue.

  • A findings Sheet ranked by revenue impact, with a fix plan
  • Read-only access, 7 business days
Findings, ranked by revenue impactIllustrative
  • stripe.com credited with checkout revenueHigh
  • Paid traffic landing in UnassignedHigh
  • Key event firing twice on the thank-you pageMedium
  • Top Explore segment sampledLow
+20%Google Ads remarketing conversions on the rebuilt audiences after a SaaS GA4 audit. Read the case