andrew builds things
analyticsattributionmarketing

Why Your Meta Ads and CRM Numbers Never Match

The four reasons your Meta Ads dashboard and CRM tell you different numbers, and how to diagnose the gap systematically.

Every marketer has been here. You pull your Meta Ads dashboard. It says you got 147 purchases last week. You open your CRM. It says 112. You check again. Same campaign, same date range, same product. Two different numbers staring at you.

Your boss wants to know which one is right. You want to know which one is right. So you start digging, and the deeper you go the more confusing it gets.

Here is the short answer: both numbers are wrong, and that is fine. The gap between them is not a bug. It is a structural feature of how ad platforms and CRMs count things differently. Once you understand the four reasons the numbers diverge, you can stop chasing a perfect match and start diagnosing the gap on purpose.

Reason 1: They Count Different Things

Meta counts ad-attributed events. Your CRM counts records that entered your database. These are not the same thing.

When someone clicks your ad and buys, Meta logs a purchase event (fired by the Meta pixel or Conversions API). Your CRM logs a deal or order record. But the CRM record might be created minutes later, or it might merge with an existing contact, or it might get filtered out by a deduplication rule you set up two years ago and forgot about.

The pixel fires on the browser side. The CRM record is created on the server side. The pixel might fire twice if the page loads twice. The CRM might suppress duplicates. One counts events. The other counts records. They will never be the same number.

Reason 2: Attribution Windows

Meta uses a 7-day click and 1-day view attribution window by default. That means if someone clicks your ad on Monday and buys on Thursday, Meta attributes that purchase to the ad. If they click on Monday and buy nine days later, Meta does not count it.

Your CRM does not care about attribution windows. It records the purchase when it happens. It does not know or care whether the customer clicked an ad last week or last month.

So if you run a comparison for "purchases between Monday and Sunday," Meta is counting purchases attributed to ads clicked in that window (which could include purchases that happened the following week). Your CRM is counting purchases that happened in that window regardless of ad exposure. You are comparing two different time slices and expecting them to match.

This alone can account for 20-30% of the gap.

If you run ads in the UK or EU, you are probably running a cookie consent banner. When a user declines cookies, your pixel does not fire. Meta never sees that conversion. But your CRM still records the purchase, because the purchase happened on your server regardless of what the user chose on the consent banner.

This creates a one-directional gap: your CRM will always show more conversions than Meta, because some percentage of users opted out of tracking. With typical consent decline rates of 10-20%, that is a big chunk of missing data on the Meta side.

The Conversions API helps here because it can send events from the server side, but it does not fully solve the problem. If the user opted out of marketing tracking entirely (not just cookies), you should not be sending their data to Meta at all. So the gap persists.

Reason 4: Deduplication and Data Processing

Your CRM has rules. Maybe it deduplicates by email address. Maybe it merges contacts who share a phone number. Maybe it filters out test orders. Maybe it excludes orders below a certain value. Maybe your e-commerce platform syncs to the CRM with a delay, and orders from late Sunday night show up in Monday's CRM report.

Meta does none of this. Meta counts every event it receives, as long as it passes Meta's own deduplication (which is based on event ID and is much more permissive than your CRM's rules).

So your CRM says 112 because it deduplicated 12 records, filtered out 3 test orders, and excluded 8 orders that were refunded. Meta says 147 because it counted every pixel fire including duplicates and test purchases.

Neither number is wrong. They are just measuring different things.

A Practical Diagnostic Process

Stop trying to make the numbers match. Start measuring the gap and understanding why it exists. Here is the process I use:

Step 1: Pull both reports for the same period. Same start date, same end date. Write down both numbers and calculate the gap as a percentage.

Step 2: Check the attribution window. Are you comparing Meta's default 7-day click window to a CRM report that counts purchases by order date? Adjust your CRM query to match Meta's attribution logic as closely as possible, or accept that this is a structural difference.

Step 3: Check for consent signal loss. Look at your consent banner analytics. What percentage of users declined cookies? That percentage roughly maps to the conversions Meta will never see.

Step 4: Check your CRM deduplication and filtering rules. Export the raw CRM records for the period before any filtering. Compare the raw count to the filtered count. The difference is orders your CRM is hiding from you.

Step 5: Reconcile the gap. You will not get to zero. But you should be able to explain the gap in terms of attribution window differences, consent opt-outs, and CRM processing rules. If you can explain 90% of the gap, you are done. The remaining 10% is noise.

Step 6: Set a threshold. Decide what gap percentage is acceptable for your business. For most e-commerce setups, a 15-25% gap between Meta and CRM is normal and expected. If the gap suddenly jumps from 20% to 45%, something broke. Go back through the steps.

The Point

You will never get Meta and your CRM to report the same number. The goal is not a match. The goal is a consistent, explainable gap that you can monitor over time. When the gap is stable, your tracking is working. When the gap moves, something changed and you need to find out what.

If you want a structured process for this, I built a workflow that walks you through the exact diagnostic steps, including the spreadsheets and query templates I use to reconcile platform numbers against CRM data. It is called the Why Are My Numbers Wrong? workflow and it costs £12. You can get it at andrewbuildsthings.com/toolkit/pixel.

If you want to go further and build a proper attribution model that does not rely on either Meta or your CRM being right, the attribution workflow walks through setting up multi-touch attribution across your stack. It is £19 at andrewbuildsthings.com/toolkit/attribution.

Stop chasing the perfect number. Start understanding the gap.

Want to know what ChatGPT says about your business?

I check Google, Maps, ChatGPT, Gemini and Perplexity against your three nearest competitors, and hand you the five fixes that matter most. 48 hours, fixed price.