Attribution & Analytics

Why Your Attribution Data Doesn't Match Your Ad Platform's

The three structural reasons Meta, Google, and your analytics tool will never show identical numbers, and how to decide which one to actually trust.


Meta says a campaign drove 340 conversions last week. Your analytics platform says 190. Neither number is wrong, and neither is lying to you — they’re answering different questions using different rules, and most marketers never learn what those rules actually are before making a budget decision based on whichever number is more convenient.

Attribution Windows Are the First and Biggest Source of the Gap

Meta’s default attribution window counts a conversion if someone clicked an ad and converted within 7 days, or viewed an ad (never clicked) and converted within 1 day. Google Ads defaults differ by campaign type. Your own analytics or CRM, meanwhile, is usually running last-click or last-non-direct attribution with no view-through credit at all, and often a shorter or entirely different lookback window.

That view-through piece alone can account for a huge chunk of the discrepancy. If someone scrolled past a Meta ad on Tuesday without clicking, then searched your brand name directly on Thursday and converted, Meta will claim that conversion under view-through attribution. Your analytics tool sees a direct visit with no ad interaction at all and attributes it to “Direct” or “Organic.” Both are technically accurate descriptions of what each system actually observed — they just observed different parts of the same journey.

Platforms Attribute in Their Own Favor by Default, Not by Conspiracy, by Design

Every ad platform’s default reporting is engineered to make that platform’s contribution look as large as possible — not out of dishonesty, but because that’s the number that keeps advertisers spending on the platform, and it’s a genuinely defensible methodological choice from that platform’s narrow point of view. Meta doesn’t know what happened on Google. Google doesn’t know what happened on Meta. Each platform’s pixel or tag only sees its own slice of the journey, so each one takes maximum credit for any conversion it can plausibly claim exposure to.

Add up every platform’s self-reported conversions and you’ll almost always exceed total actual sales, sometimes by 200% or more, because the same converting customer gets claimed in full by three or four different systems that each only saw one touchpoint. This is the single most common reason a company’s “total marketing-attributed revenue” across platforms looks larger than total company revenue — it’s not a tracking bug, it’s the mathematical result of every system counting in isolation.

A Worked Example: Reconciling a Single Customer Journey

Walk through one real path to see how the gap actually accumulates. A prospect sees a Meta ad on a Monday (no click), clicks a Google Search ad on Wednesday and lands on a pricing page without converting, gets retargeted by a Meta carousel ad on Friday and clicks it, then converts on Saturday after typing your domain directly into the address bar because they’d bookmarked it two days earlier.

Here’s how four different systems account for that one $2,400 sale. Meta’s ads manager logs it as a Meta-attributed conversion twice over — once potentially under view-through credit from Monday, and again under the Friday click, depending on which touchpoint falls inside the active window when the sale closes. Google Ads logs it as a Google-attributed conversion under its own click-through window, since the Wednesday click falls within Google’s 30-day default for search. Your web analytics tool, running last-non-direct attribution, ignores both ad exposures because the actual converting session was a direct visit, and files the sale under “Direct — Unattributed.” Your CRM, if it’s only capturing the referrer of the session where the deal record was created rather than tracking the lead across sessions, might log a fourth answer entirely, crediting whichever source happened to be active when the contact form was first submitted, which in this case was the Wednesday Google click.

Four systems, four different stories about the same $2,400, and every one of them is a correct description of what that particular system observed. Multiply this across a few hundred deals a month and you get exactly the kind of 340-versus-190 gap that opens this article — not because anyone made an error, but because none of these four systems were built to agree with each other in the first place.

Server-Side vs. Browser-Side Tracking Creates a Second, Separate Gap

Since iOS 14.5 and the broader move away from third-party cookies, browser-based pixels miss a meaningful share of conversions — Safari’s Intelligent Tracking Prevention alone can cut visible conversion windows down substantially, and ad blockers remove another slice entirely. Platforms have responded with server-side conversion APIs (Meta’s Conversions API, Google’s Enhanced Conversions) that send conversion events directly from your server, bypassing the browser limitations — but only if you’ve actually implemented them, and only if the data is deduplicated correctly against the browser pixel.

A company running only browser-side pixels will systematically undercount compared to a company with a properly configured server-side integration, and if a business switches from one setup to the other mid-quarter, the resulting jump in reported conversions can look like a performance improvement that’s actually just a measurement change. This is worth flagging explicitly in any reporting when tracking infrastructure changes — otherwise a stakeholder will credit a campaign optimization for what was really a tracking fix.

Deduplication Logic Differs Between Every Tool You’re Comparing

When the same person clicks a Meta ad, then a Google ad, then converts, how many “conversions” happened? Meta’s pixel says one (it claims credit). Google’s tag says one (it also claims credit). Your CRM, if built correctly, says one actual sale — but only if it’s deduplicating by a shared identifier like email or a unique conversion ID across every source that reports it, which most CRMs aren’t configured to do out of the box.

This is the piece most teams never audit. Before trusting any cross-channel comparison, check specifically how each conversion is being counted downstream — is it one row in the CRM matched to one closed deal, or is it a separate pixel-fired event with no join back to an actual sale record? Without that join, you’re not comparing attribution methodologies, you’re comparing three different counting systems that were never designed to agree with each other in the first place.

The Failure Mode: Optimizing Budget Off the Wrong Number

The most expensive version of this problem isn’t confusion — it’s a confident, wrong decision made from a single platform’s dashboard in isolation. A common pattern: a paid social manager sees Meta reporting a $22 cost per acquisition on a campaign, while Google Ads reports $61 CPA on a comparable campaign, and shifts 40% of monthly budget from Google to Meta on the strength of that comparison. Three months later, closed-revenue-per-channel in the CRM shows the Google-sourced deals closing at nearly double the average contract value and a materially higher win rate, because those leads were later in a considered buying journey and Meta was claiming view-through credit for people who were already going to convert through search regardless of the Meta impression.

The shift wasn’t wrong because someone was careless — it was wrong because the comparison used each platform’s self-reported CPA, which is precisely the number engineered to make that platform look efficient in isolation. Nobody caught it for a quarter because nobody was comparing platform-reported numbers against CRM-verified revenue by channel; they were comparing platform-reported numbers against other platform-reported numbers, which is comparing two different currencies and calling it math.

Which Number Should You Actually Trust for Budget Decisions

None of the three by itself, in isolation — but a fourth number you build yourself: closed revenue, tied to a single first-touch or multi-touch identifier at the point of sale, independent of any single platform’s self-reported claim. This means capturing how a lead actually arrived (from your own site or CRM data, not the platform’s pixel) at the moment they first became a lead, then tracking that identifier all the way through to closed revenue.

This is exactly the gap that pixel conditioning and server-side attribution tools are built to close — feeding platforms your actual downstream revenue outcomes (not just a browser-fired “purchase” event) so the platform’s own optimization algorithm learns to find more of your real, high-value customers instead of optimizing toward whichever browser event fires easiest. A platform optimizing against a raw “add to cart” signal will find people who add to cart. A platform fed real closed-revenue data, matched back to the original ad exposure through a server-side connection, optimizes toward people who actually buy and stick around — a fundamentally different (and better) population to spend budget acquiring.

A Practical Reconciliation Process, Run Monthly

Rather than trying to make all three numbers agree — they structurally can’t — build a simple monthly reconciliation instead:

  1. Pull total platform-reported conversions from each ad platform for the period
  2. Pull total actual closed revenue and deal count from the CRM for the same period, by first-touch source
  3. Calculate the ratio between platform-claimed and CRM-verified for each channel
  4. Track that ratio over time, not the absolute numbers — a stable 1.8x overcounting ratio on Meta is far less concerning than a ratio that’s drifting upward, which usually signals a tracking or deduplication problem creeping in

This reconciliation ritual won’t make the numbers match — they’re not supposed to — but it gives you a consistent discount factor per channel so budget conversations stop being “trust the platform’s dashboard” versus “trust the CRM” and start being an informed comparison based on each channel’s known, tracked bias.

Sequencing the Fix: What to Tackle First

Don’t try to fix attribution windows, server-side tracking, deduplication, and reconciliation reporting all in the same sprint — the four problems compound, and fixing them out of order wastes effort. Start with deduplication in your own CRM first, since it’s the cheapest fix and the one that makes every downstream number more trustworthy: an afternoon spent adding a unique lead identifier and a de-dup rule against email or phone will do more for data quality than a month spent on attribution-window debates.

Second, get server-side tracking (Conversions API, Enhanced Conversions) implemented correctly, since browser-only tracking undercounts in a way that gets worse every quarter as privacy defaults tighten further — this is infrastructure, not a one-time project, and the gap it closes only grows if left unaddressed. Third, build the monthly reconciliation ratio described above, because you need clean CRM data and complete server-side capture before that ratio means anything; running reconciliation on top of broken deduplication just produces a precise-looking number that’s still wrong. Only after those three are stable does it make sense to invest in a full multi-touch attribution model — that’s the most expensive and slowest piece to build, and it’s wasted effort if the inputs feeding it are unreliable.

How to Know the Fix Actually Worked

Two signals tell you the reconciliation process is doing its job rather than just producing a new dashboard nobody trusts. First, the platform-to-CRM ratio per channel should stabilize within a fairly narrow band month over month — if Meta’s overcounting ratio bounces between 1.4x and 3.1x with no clear seasonal explanation, something in your tracking or deduplication is still unreliable, and the ratio itself is a diagnostic, not just a discount factor. Second, and more importantly, budget reallocation decisions should start citing the CRM-verified ratio explicitly instead of a single platform’s dashboard number — if you’re still hearing “Meta says our CPA is $22” in a budget meeting without someone immediately following with “and CRM-verified revenue-adjusted CPA is $58,” the reconciliation process hasn’t actually changed how decisions get made, regardless of how good the underlying spreadsheet is.

Set Expectations With Leadership Before the Discrepancy Becomes a Trust Problem

The worst version of this issue isn’t the data gap itself — it’s a CFO or CEO discovering the discrepancy on their own and concluding marketing’s reporting can’t be trusted at all, which tends to sour every future budget conversation regardless of merit. Proactively explaining the attribution-window and self-reporting-bias mechanics above, before anyone asks why the numbers don’t add up, converts a credibility risk into a demonstration that marketing actually understands its own measurement stack — which is, in most organizations, a differentiator in itself.

Book a demo