attribution discrepancy

Why Attribution Numbers Never Match: Which Gaps Are Normal

Google Ads says 85. GA4 says 60. Your CRM says 71. Nothing is broken. Three honest tools were asked different questions, and here is how to read each answer.

Open Google Ads. It reports 85 conversions for last week's campaign. Open GA4 for the same campaign, same dates: 60. Open the CRM: 71. Three tools, one campaign, three answers, and somewhere a meeting is being scheduled to find out which one is "right."

There is no right one. That is the part nobody says out loud. The three numbers disagree because three honest systems were asked three slightly different questions, applied three different rules, and counted three different things. Most of the gap is not a defect. It is the expected output of tools that were never designed to produce identical totals. The skill that matters is not forcing them to agree. It is knowing how big the gap should be, and recognizing the day it becomes a real problem.

Where the disagreement comes from

Attribution as a daily headache is younger than the discipline behind it. Marketing measurement goes back to econometric modeling in the 1950s and 1960s, when statisticians fitted regressions to relate sales to spend on TV, print and radio. That work never tracked an individual and never produced a "did this person convert" answer two systems could compare.

The mismatch arrived with the click. Pixels made it possible to follow a specific browser from an ad to a purchase, and last-click attribution became the default. Then platforms multiplied. Google Ads kept its own conversion record, Facebook built its own, Google Analytics kept a third. Each watched the same customers through a different window, on a different clock, with a different definition of a conversion. The moment a marketer put two of those dashboards side by side, the numbers diverged, and they have diverged ever since.

It helps to be blunt about the incentive. Databox frames attribution over-counting as a revenue model problem, not a data quality problem: the companies that sell the impressions also built the systems that grade whether the impressions worked. Ad platforms self-attribute, and they do it generously. That is structural, and it is covered in depth in the piece on walled gardens and self-attribution. The narrow point here: a platform's number is not a lie, but it is computed by an interested party using rules that favor the platform.

The real causes, one by one

When numbers diverge, the reason is almost always one of the following. None of these is a bug.

Different attribution windows. A window is the time a platform looks back from a conversion and still credits a touchpoint. They match nowhere. Meta now offers a 1-day or 7-day click window with only a 1-day view window. Google Ads supports windows up to 90 days. GA4 defaults to a 30-day lookback for acquisition events such as first visit, and a 90-day window for other key events that is configurable down to 30 or 60. A customer who clicks an ad on day one and buys on day twenty is inside Google Ads' window and outside Meta's short one. Same event, counted by one tool, missed by the other.

Different attribution models. Each platform splits credit with its own logic. GA4 ships only last-click and data-driven attribution after Google retired the rule-based models. Google Ads runs its own data-driven model. Meta credits last touch inside its window. One journey of LinkedIn, then Google, then a purchase can be counted once by each platform, all technically correct under their own rules, and the totals will never sum to the real customer count. How GA4's version works is unpacked in inside data-driven attribution.

Different definitions of a conversion. Google Ads lets you count "every conversion" or "one per click." Pick the first and three purchases from one click become three; pick the second and they become one. A CRM counts a closed deal. GA4 counts a key event. Until those definitions are written down and matched, the totals were never going to align.

The click-versus-visit gap. Google Ads records a click on its own servers the instant someone taps the ad. GA4 records a session only when its tag loads and runs in the browser. Between those two moments a person can abandon a slow page, bounce, or block JavaScript. Sessions sit below clicks by design, and roughly a 10 percent gap is considered normal. Wider gaps point at slow landing pages or invalid traffic, not a broken counter.

View-through conversions. Some platforms credit a conversion to an ad that was seen but never clicked. Meta does this within its view window. GA4 does not model impressions at all and credits only click-initiated sessions. That single difference can move a number a long way on awareness campaigns, and it is a definition gap, not an error.

Time zones and currency. If a Google Ads account and a GA4 property sit in different time zones, a conversion near midnight lands on different calendar days in each tool, and daily reports never tie out. Currency adds its own drift: GA4 converts non-base-currency transactions using the prior day's exchange rate, which will not match a platform using a different rate.

The conversion-date-versus-click-date gap. This one trips up almost everyone. Google Ads attributes a conversion back to the date of the click. GA4 records it on the date the conversion happened. A Monday click that converts Friday shows up under Monday in Google Ads and under Friday in GA4. Compare a single day across the two and they cannot agree, because they are not describing the same day.

Deduplication across channels. Send the same purchase from a browser pixel, a server-side tag and a CRM feed without a shared transaction or event ID, and a platform counts it more than once. Proper deduplication needs one stable identifier, usually the order number, passed everywhere.

Bot and spam filtering. GA4 automatically excludes known bots using the IAB International Spiders and Bots List. Google Ads runs its own invalid-traffic detection. The two systems do not filter the same things, so they disagree on which interactions were even real before any attribution logic runs.

Consent and tracking prevention. When a visitor rejects cookies or uses a browser that blocks them, a conversion can go unobserved. Google fills some of that gap with modeled conversions; GA4 reports mostly what it observed. Apple's App Tracking Transparency removed a large slice of view-level signal on iOS. The platforms cope with the loss differently, which means they end up with different totals from the same lost data.

A useful way to hold all of this: the platforms are not measuring the same thing badly. They are measuring different things accurately.

How to tell a real problem from normal noise

This is the part worth slowing down for. Some discrepancy is healthy. Some is a broken tag bleeding money. Telling them apart is a method, not a hunch.

Practitioner guides cluster around similar tolerances. Linkrunner's diagnostic guide calls a 5 to 10 percent variance normal for app measurement and flags anything past 15 percent for investigation, with 50 percent treated as an almost certain technical failure. For web, kissmetrics describes a 15 to 35 percent baseline gap between GA4 and Google Ads as ordinary. Numbers vary by source and by setup, so treat them as ranges, not laws. The deeper idea is the one that matters.

That idea is the baseline. Measure your own gap across two or three stable months and write it down per platform pair. GA4 against Google Ads might sit at 22 percent. The CRM against Meta might sit at 30. Those are your normal. Once you have them, the test for a real problem is simple: a real problem is a sudden move away from a known baseline. A steady 22 percent gap that has held for a quarter is structure, and chasing it is wasted time. The same pair jumping to 55 percent in a week is a signal that something concrete changed.

When the gap spikes, the cause is usually one of a short list of genuine faults:

  • A broken or removed tag. A site redeploy or a theme update drops the tracking snippet from the confirmation page and conversions fall off a cliff. Network-tab inspection on a test purchase confirms it fast: no request to the platform means no tag.
  • A doubled conversion. The opposite shape, numbers suddenly inflated. It usually means the same tag fires twice, often because a pixel is hardcoded in the theme and also deployed through a tag manager. A test purchase with the browser network tab open will show the same purchase event firing two or three times. Tag manager preview mode shows which container is responsible. Cometly's duplicate-conversion guide walks the fix.
  • A UTM error. A campaign tagged with the wrong utm_medium, or with no UTM at all, lands in the wrong channel. GA4 then reports the traffic as direct or unassigned, and the campaign looks like it died. A spike in (not set) or Unassigned traffic is the tell.
  • A misfired pixel: firing on the wrong page, before the tag library loads, or without the value and currency parameters, so conversions land with no revenue attached.

The pattern is the diagnostic. Normal discrepancy is stable and explainable by the structural causes above. A real problem is a sharp, dated change in the gap, almost always traceable to a deploy, a tag edit, or a campaign launch on the same date. Find that date and you usually find the fault.

A reconciliation method that ends the argument

The goal is not one number. The goal is a difference you understand, that stays inside a known range, with one source named as the decision-maker for each kind of question. Four steps get there.

First, set the baseline. Pull two or three months and record the steady gap for each platform pair. This is the reference every future check runs against.

Second, attribute the gap to causes. Walk the list: windows, models, definitions, time zone, click-versus-visit, view-through, dedup, filtering, consent. Roughly size each one. Most teams find the bulk of a gap explained by two or three causes, and once explained, the gap stops being mysterious and stops being a meeting.

Third, name a source of truth per decision, not per company. For tactical bid and budget changes inside a platform, that platform's number is the right input, because it feeds the bidding. For cross-channel comparison, GA4 is the more neutral view. For revenue and finance, the CRM or order system is ground truth, because it counts money that actually arrived. Databox describes this as a trust hierarchy with closed-won CRM data at the top and platform dashboards used for optimization, never for justifying spend. The mistake is letting whoever has the highest number win the room. Decide the owner before the debate, by decision type.

Fourth, monitor the delta, not the absolute. Put the gap itself on a small dashboard and watch it over time. A stable line is health. A jump is an alarm that points you straight at a date and a likely cause. Reconciliation becomes a maintenance habit instead of a quarterly firefight.

What this looks like in a year

The structural causes are not going away. If anything they are widening. Meta's removal of its 7-day and 28-day view windows took effect on 12 January 2026, and some advertisers saw a meaningful share of conversions drop out of view-window reporting overnight. Consent enforcement keeps tightening, which means more modeled and fewer observed conversions, and modeled numbers diverge in their own way. Cross-device journeys without third-party cookies still split one person into two. Every one of these makes the platforms agree less, not more.

The constructive response is a shift in expectation. Mature measurement teams have stopped chasing a single reconciled total and moved to triangulation: platform data for tactical signal, MMM for strategy, incrementality tests for causal proof, reconciled into one estimate of impact rather than one number on a dashboard. AI helps at the edges. Read-only analytics agents can now watch the delta between systems and flag the day it moves, which turns the spike-detection method above into something automatic. Perform Digital builds those monitoring agents into measurement stacks, so a tag breakage or a UTM error surfaces as an alert within hours instead of at the end of the month. The agent does not pick the right number. It tells you the moment your known gap stopped being normal, which is the only alarm that matters.

The honest conclusion is the one to take into the next meeting where two dashboards disagree. They are supposed to disagree. A campaign measured by a 7-day-click platform and a 90-day tool will never report the same total, and a year of effort will not fix that, because it is not broken. What a good analyst owns is a different deliverable: a difference that is understood, bounded, and stable, with one source named as the decision-maker for each call. Stop trying to make the numbers match. Start being able to explain, to the percentage point, exactly why they do not.

Council summary

This post argues that mismatched attribution numbers are not a defect to be fixed but the expected output of honest tools answering different questions with different windows, models, and definitions. Its strongest contribution is the working method: establish a per-pair baseline across two or three stable months, attribute the gap to its structural causes, name a source of truth by decision type rather than by company, and then monitor the delta so a sudden move away from the baseline becomes the alarm. The diagnostic test is clean and memorable, a stable gap is structure and a sharp dated jump is a fault, almost always traceable to a deploy, a tag edit, or a campaign launch. The reader should leave able to stop convening reconciliation meetings and instead explain, to the percentage point, exactly why three dashboards differ and which one to trust for the question at hand.

Comments

Leave a comment

Your email won't be published. Comments are reviewed before they appear.
★ Read next