Attribution & Measurement

Why your numbers never match between platforms

Google says 412 conversions. Meta claims 380. Your CRM logged 291. Nobody’s lying — they’re answering slightly different questions. Here’s how to reconcile them before the client does it for you.

Jamie IsabelJune 24, 20269 min read

Every agency has sat in this meeting. You share the monthly report, and before you reach the strategy slide the client is already squinting at their own ad dashboard, comparing your conversion count to the one glowing on their screen. The two don’t match. In that instant you’re no longer presenting results — you’re defending arithmetic.

The uncomfortable truth is that those numbers were never meant to be identical. Each platform answers a slightly different question, about a slightly different event, measured over a different window, in a different time zone, and de-duplicated by different rules. The job isn’t to force them to agree. It’s to understand why they disagree — and to hand the client one number you can stand behind.

The five places a number can diverge

Before you debug any specific discrepancy, it helps to know where they hide. In practice, nearly every mismatch traces back to one of five culprits:

  • Event definition. A “conversion” in Google Ads might be a form view; in your CRM it’s a closed-won deal. Same word, different moment.
  • Attribution window. 7-day-click versus 28-day-click, with or without view-through, changes the count dramatically.
  • Time zone. The ad account reports in its own zone; your warehouse stores UTC. The boundary days never line up.
  • De-duplication. One person, three touchpoints. Counted once per platform, or once globally?
  • Filtering. Bots, internal traffic, and test events stripped out in one place but not another.

The goal isn’t to make the platforms agree. It’s to understand why they disagree — and to publish one number you can defend.

Attribution windows are the usual suspect

If you only check one thing, check the windows. Meta defaults to a 7-day click, 1-day view model; Google leans on data-driven attribution across a 30-day path; your CRM, quietly, credits whoever owns the contact. None of these is wrong, but stacked together they guarantee three different totals. Write the window down next to every metric in the report — it’s the single cheapest way to pre-empt the “why don’t these match” question. (More on this in attribution models, explained.)

Time zones and the midnight problem

The second most common gremlin is invisible until the end of the month. A conversion that fires at 11:40pm Pacific lands on the 1st of next month in UTC. Run a monthly report and a handful of events quietly hop the boundary in each direction. Over a quarter it washes out; on a single month’s invoice-driving number, it’s the difference between hitting target and missing it.

De-duplicate once, at the source

When the same lead shows up in Meta, Google, and your CRM, summing the platforms double- and triple-counts a single human. The fix is to resolve identity in one place — a unified events table keyed on a canonical identifier — and let every downstream report read from that, rather than adding up dashboards that were never designed to be added.

SourceReportedAfter reconciliation
Google Ads412318
Meta380261
CRM (closed-won)291291
Unified (de-duplicated)372
The same month, four sources. The unified figure is the only one worth putting on a slide.

Build one reconciliation layer

Spreadsheet reconciliation works exactly until it doesn’t — usually the month a teammate is on holiday. The durable answer is a thin modeling layer that maps each platform’s raw events to a shared schema, applies one set of rules, and exposes a single metric. It looks unglamorous, but it’s the difference between answering “where did this number come from?” in five seconds versus five hours.

models/marts/unified_conversions.sql
-- one canonical event, regardless of source
select
  coalesce(meta.lead_id, gads.lead_id, crm.contact_id) as canonical_id,
  min(event_at_utc)                                    as first_seen,
  max(is_closed_won)                                   as converted
from unified_events
group by 1

A checklist before you send

Run these six checks and most “the numbers are wrong” emails never get written:

  1. State the attribution window beside every conversion metric.
  2. Confirm the date range uses one time zone, named explicitly.
  3. Reconcile to the de-duplicated total, not the sum of platforms.
  4. Strip internal and test traffic — and say that you did.
  5. Show last month beside this month, so movement has context.
  6. Add one sentence explaining any figure that differs from the native dashboard.

None of this makes the platforms agree. It does something more useful: it lets you walk into the meeting with one number, a clear story about where it came from, and the quiet confidence that you’ve already answered the question before it’s asked.

Jamie Isabel

Founder at Maven

Ready to take data ops off your plate? Let's talk.

One platform for every marketing source.

We'll spin up a sample marketing workspace live

You'll see a working dashboard before the call ends

No pitch deck. No pressure. 20 minutes.

Book a Demo