· Germán Muñoz Moreno, Co-founder
The complete guide: why Meta, Google, GA4 and your store never match

Why do Meta, Google Ads, GA4 and my store all report a different number of sales for the same days?
Open Meta Ads Manager, Google Ads, GA4 and your store's order list for the same week and you will get four different numbers of sales. It happens to every store, it has a short list of causes, and almost none of them is a broken setup. This guide names each cause in a few lines and links to the article that goes through it in detail, so you can find the one behind the gap in front of you.
The four sources count four different things
Each ad platform counts the purchases it can credit to itself under its own rules: its attribution window, its view-through setting, its matching of people to ad interactions. GA4 counts purchase events fired in the browser and assigns them with its own model. Your store counts orders. None of them is lying; they are answering different questions with the same word, "conversion". The deep dives: why Meta reports more conversions than your store, why Google Ads reports more conversions than your store and why GA4 disagrees with your ad platforms and your store.
Cause 1: every platform credits itself
A buyer who clicked a Google ad, then saw a Meta ad, then bought, is a conversion in Google Ads and a conversion in Meta. Each platform only sees its own interactions and has no reason to discount itself for the other's. Your store records one order. This is the single largest reason the platforms' combined total exceeds your sales.
Cause 2: attribution windows
"7-day click, 1-day view" means a platform credits itself for any purchase within seven days of a click or one day of an ad view. Two platforms with different windows, or the same platform before and after someone changed the setting, produce different numbers for the same sales. Explained in what attribution windows actually mean.
Cause 3: credit for views, not clicks
With view-through attribution, a person who saw an ad without clicking and bought later can be credited to it. Some of those sales were influenced by the ad and some would have happened anyway, and nothing in the report distinguishes them. We measure how much of it can be verified in how much of what Meta claims can you verify.
Cause 4: the same purchase counted twice
Inside one platform, a purchase sent both from the browser and from your server is counted twice unless both carry the same event ID. Across platforms, the same order is claimed by each. How to check both: how to tell if the same purchase is counted twice.
Cause 5: refunds and cancellations
Ad platforms record a purchase when it happens and do not subtract it when the order is refunded or cancelled later. Your store's settled total does. In a category with frequent returns, the difference is large, and it concentrates in the campaigns that bring in the buyers most likely to return. Covered in refunds and cancellations: the gap no ad platform subtracts.
Cause 6: time zones, currency and dates
Your store may close its day at midnight Mexico City time while an ad account reports in another zone, so the last hours of each day land on different dates. An ad account billed in dollars against a store selling in pesos converts at a rate the report does not show. And a platform may date a conversion to the day of the click instead of the day of the purchase. See time zones and currency: why your reports in MXN and USD do not match.
Cause 7: different definitions of a new customer
Each platform decides who is new from what it can see, usually a limited lookback of its own data, while the store knows the complete order history. The same buyer can be new to Meta and returning to your store. More in why platforms disagree about who is a new customer.
Cause 8: browser events that never fire
Ad blockers, tracking protection and checkouts on another domain stop the browser event that pixels and GA4 depend on. That pushes the browser-based numbers below the store, the opposite direction from causes 1 to 5, which is why the gaps you see are the net of forces pulling both ways.
Which way each cause pushes
| Cause | Effect on the platform's number versus your store | How to check it |
|---|---|---|
| Self-attribution | Higher | Add up every platform's claims for one week and compare with orders |
| Attribution windows | Higher with longer windows | Compare the same campaign under two windows |
| View-through credit | Higher | Split click-through from view-through conversions |
| Duplicate events | Higher | Check that browser and server events share an event ID |
| Refunds and cancellations | Higher | Compare gross with settled revenue per channel |
| Time zones and dates | Either way, by day | Compare weekly totals instead of days |
| New-customer definitions | Either way | Compare against the store's full order history |
| Blocked browser events | Lower | Compare browser-based purchases with store orders |
Our list of the settings and habits that make reported ROAS look better than it is lives in 8 things that inflate your reported ROAS.
Pick an anchor
The way out is not to make the numbers agree, which they cannot. It is to decide which one is the ledger and read the others as claims about it. The store's settled orders are the only figure with no attribution model, no window and no dependence on a browser event, so they are the anchor. Everything else is a claim: plausible, partly unverifiable, and worth measuring against the orders that exist.
The test that proves over-counting
One check turns suspicion into proof. A platform can legitimately credit a buyer you never saw, but no platform can credit an order that does not exist. So for any window, the sum of all platforms' claimed purchases has a hard ceiling: the number of settled orders in that window. Below the ceiling, the claims are plausible. Above it, the excess is double counting, and it is provable with nothing more than a spreadsheet.
Run it on weekly totals with every platform's default reporting, and without filters that only one side applies, such as a new-customers-only view. That is also the comparison Adray Core keeps on screen permanently: each platform's claim next to the verified orders, never merged into one number.
Common questions
Which number is the right one?
For money questions, the store's settled orders: they are the only figure with no attribution model, window or browser event inside. The platforms' numbers are claims about those orders, and GA4's are measurements of behaviour on your site.
Is a gap between Meta and my store a sign of a broken setup?
Not by itself. A gap in the expected direction, with the platform above the store, is the normal result of self-attribution, windows and view-through credit. A gap that jumps suddenly, or runs in the unexpected direction, is what deserves investigation.
Can I make the numbers match by changing attribution settings?
You can make one report closer to another, and you cannot make the systems agree, because they define a conversion differently. The more useful move is to stop expecting a match and measure how much of each claim can be verified against orders.
Why is the total of all platforms bigger than my sales?
Because the same order can be claimed by several platforms at once: a buyer who clicked a Google ad, saw a Meta ad and opened an email can count as a conversion in all three. The store records one order.
Do refunds explain part of the gap?
Yes. Ad platforms record a purchase when it happens and do not subtract it when the order is later refunded or cancelled, while the store's settled total does.
