Why platform ROAS does not match your revenue
Both numbers are correct and they measure different things. The five causes of the gap, how to check each one, and why MER is the only number that reconciles.
It is one of the most common conversations with a new client: the ads manager says the campaign returned four times what was spent, and accounting cannot find that money anywhere. Somebody must be wrong.
Almost nobody is. Both numbers are correct and they measure different things. Understanding exactly what each one measures is what turns a circular argument into a decision.
They are not measuring the same thing
A platform’s ROAS answers: of the sales that happened, which ones do I believe I influenced? That is an attribution answer, produced by that platform’s model, inside its window, with whatever it was able to observe.
Your revenue answers something else: how much money came in? No model, no window, no opinion about credit.
Different questions, so their answers have no obligation to match. The mistake is not that they differ: the mistake is treating the first as if it were the second.
The five causes of the gap
| Cause | What it does | How to check |
|---|---|---|
| Attribution window | Assigns a sale to an ad seen or clicked days earlier | Look at which window the account has configured today |
| Pixel + API double count | The same purchase lands twice if not deduplicated | Verify both send the same event identifier |
| Modelled conversions | Estimates what it cannot observe, due to consent or browser | Find the column or note separating them from observed ones |
| Refunds and cancellations | The platform counts checkout, your books count payment | Compare orders created against orders paid |
| Time zone and currency | Shifts the days and changes the amounts | Check the account time zone and the exchange rate applied |
The window confuses people most and is the easiest to check. If the account attributes sales to people who saw or clicked an ad days before buying, a month of revenue can appear spread across two months of campaign. It is not measured wrong: it is measured on a different calendar.
Double counting does the most damage and is the easiest to fix. When the browser pixel and the server-side API send the same purchase without a shared identifier, the platform cannot know they are one event. ROAS inflates, and every decision taken on top of it bends.
Modelled conversions exist precisely because consent and browser restrictions prevent observing everything. They are an estimate, and it is right that they exist — but it pays to know which part of the number is observed and which part is model before deciding with it.
Refunds are the dullest cause and the one nobody checks. The platform records the purchase at checkout; your books record money when it arrives. Between those two moments sit cancellations, failed payments and returns that nobody reports back to the platform.
The number that reconciles: MER
When two systems cannot agree on who deserves credit, the way out is to stop asking. MER (Marketing Efficiency Ratio) attributes nothing:
MER = total revenue for the period ÷ total advertising spend for the period
Revenue comes from your accounting and spend from the statements. No platform has an opinion. It does not tell you which channel worked — ROAS is still useful for that — but it tells you something ROAS cannot: whether the whole business is improving or deteriorating while you spend.
You can have campaigns with excellent ROAS and a MER that is sliding. That happens, among other reasons, when spend concentrates on recapturing customers who were going to buy anyway: the platform rightly claims the sale, and the business does not grow.
What to do with the gap
- Measure it before explaining it. One closed month, two numbers side by side: what the platforms report and what actually came in. Without that, everything else is opinion.
- Rule out double counting first. It is the only cause on the list that breaks the number rather than explaining it.
- Align the calendars. Same time zone, same date range, same currency. A surprising share of the gap disappears here.
- Subtract what was never collected. Refunds, cancellations and unpaid orders.
- Send the real outcome back. Returning conversions that closed off the website is what makes the platform optimise toward customers instead of forms.
Step 5 changes the most, and it depends on having owned data with outcomes attached. Without that, there is nothing to send back.
When the gap is actually a problem
A stable, understood gap is not an emergency. These three are:
- It changes size with nobody changing anything. That usually means measurement broke, not the business.
- It moves the wrong way. If the platform reports more than you bill and the distance grows, something is optimising toward an event that is not a sale.
- Nobody knows how big it is. A number that exists and has never been looked at is worse than a bad number you know.
For choosing between channels with this framing in place, we wrote the comparison separately: Google Ads vs Meta Ads.
FAQ
- Which number should I report to management? The one from your accounting, always. Platform ROAS is an operating instrument for deciding where to put the next peso; it is not a revenue figure. Reporting it as revenue is how a channel ends up looking profitable while the company is not.
- Should the gap be zero? No, and chasing zero wastes months. Two systems measuring different events over different windows will never agree exactly. What matters is that the gap is understood and reasonably stable.
- If I add up every platform, the conversions exceed my sales. Why? Because each platform claims the sales it believes it influenced, and a customer often touches several. Adding platform conversions together double-counts by construction. Only your own records give a total.
- Does the Conversions API fix this? It improves signal quality, especially where browsers block the pixel. It does not reconcile anything on its own — and without a shared event identifier for deduplication it can make the gap worse by counting the same purchase twice.