Your Meta ROAS will never match Shopify
Here is why, and how to reconcile them. Two dashboards, two definitions of a sale, two calendars. The gap between them is not fraud and not a bug — it is seven documented rules. Once you know them, you can turn the gap into a number you track, instead of an argument you have every month.
Short answer: Meta and Shopify disagree because they count different things on different days. Meta claims a sale if the buyer clicked in the last 7 days, engaged in the last 1 day, or merely saw the ad in the last 1 day — and books it on the day of the click, not the day of the order. Shopify gives the sale to the last non-direct channel of the session that bought, on the day the order was placed, with a 30-day memory. Neither is "the truth". The truth is a ratio you compute once a month: Shopify paid revenue ÷ Meta-reported revenue. Track that ratio, not the absolute gap.
In the accounts we run across Egypt, Saudi Arabia and the UAE, that ratio typically settles between 0.55 and 0.85 once tracking is clean. A ratio that moves more than ten points month over month is a signal — usually a pixel, CAPI or UTM problem, sometimes a change in Meta's attribution defaults. A ratio that is stable is a measurement system you can plan budgets on.
rules that create the gap. Three are about time, two about who gets credit, two about what counts as a sale.
the range of Shopify-to-Meta revenue ratios we see in clean MENA accounts. Below 0.5, something is broken. Above 0.9, Meta is under-reporting — usually a CAPI gap.
to put in front of the owner instead of two ROAS figures: MER — total net sales ÷ total ad spend. It cannot be gamed by attribution settings.
Seven rules that guarantee a gap
Each one is documented by the platform that applies it. Together they explain almost every "your numbers don't match" conversation we have ever had with a client.
One customer, two calendars
Follow a single order through both systems. Nothing here is unusual — this is the normal path of a considered purchase in a COD market.
Result: Meta shows a 1× purchase with shipping included on Day 2. Shopify shows a Google sale on Day 5 and then removes it on Day 9. Both tools did exactly what they promise.
How long each tool remembers you
Attribution windows are just memory spans. Draw them on the same axis and the mismatch is obvious before you open a spreadsheet.
Two things follow. First, in categories with a long consideration cycle — furniture, jewellery, anything over 1,500 EGP or 400 SAR — Shopify will always credit paid more than Meta does for late converters, and Meta will always credit itself more for one-day viewers. The two errors partly cancel, which is why the ratio is usually 0.55–0.85 rather than 0.3 or 1.5.
Second, if you switch Meta's setting to 7-day click only (no view, no engage), your reported ROAS drops on the spot — often by 15–25% — and nothing about your business has changed. Do it anyway for planning, and keep the default column next to it for the algorithm. Never compare a month reported under one setting to a month reported under another.
The monthly reconciliation, in five rows
This is the sheet we keep for every store we run. It takes twenty minutes on the first working day of the month and ends every attribution argument before it starts.
| Row | Source | Exactly what to pull | Why it is this and not something else |
|---|---|---|---|
| A · Spend | Ads Manager | Amount spent, whole month, all campaigns | The only number both sides agree on. |
| B · Meta revenue | Ads Manager | Purchase conversion value, Compare attribution settings → 7-day click only, reported by conversion time if available | Strips the view and engage credit so B is comparable to a click-based backend. |
| C · Shopify paid revenue | Shopify → Sales attributed to marketing, filtered to utm_source = facebook / instagram (or referrer = Facebook, Instagram) | Net sales, order date, last non-direct click | This is the backend's own opinion of what Meta drove. Net, not total — shipping is not margin. |
| D · Total net sales | Shopify → Total sales over time | Net sales, whole month, all channels | The denominator for MER. Immune to attribution. |
| E · COD net-out | Shopify → Sales reversals (or your delivery report) | Cancelled / refused COD value for orders placed in the month | Meta never sees these. This row explains most of the gap in Egypt. |
The ratio, not the gap
Six months of one reconciliation sheet. The gap looks alarming in absolute terms. The ratio tells you the system is fine — until month five, where it isn't.
Illustrative sheet in the shape we see repeatedly. In month five Meta's reported revenue jumped while Shopify's paid revenue did not — the ratio caught a broken server-side connection in a day; the ROAS chart alone would have looked like a great month.
The ratio is diagnostic in both directions. Ratio falls: Meta is claiming sales the store cannot see — duplicate events (pixel + CAPI without dedup), a new view-through-heavy placement, or a Reels push. Ratio rises above 0.9: Meta is under-reporting — CAPI is down, the pixel is missing on a new theme, or the domain lost verification. Either way you look at plumbing first and campaigns second.
Fix the plumbing, or the ratio means nothing
Five checks, in order. Each one we have found broken in a live account this year.
Stop asking which number is right
The question "is it 3.1× or 2.2×?" has no answer, and an agency that gives you one is choosing the number that flatters it. The honest position is three numbers with three jobs: Meta ROAS for optimising inside Meta, Shopify paid revenue for judging what the channel actually delivers to the store, and MER for deciding the budget. When all three move in the same direction, the account is healthy. When they diverge, the reconciliation ratio tells you whether the problem is measurement or marketing — and those have completely different fixes.
This is also why we put the reconciliation sheet, not the Ads Manager screenshot, in every monthly report. A ROAS number without its Shopify counterpart is an opinion. The pair is evidence.
FAQ
What is a normal gap between Meta ROAS and Shopify?
Expressed as a ratio of Shopify paid net revenue to Meta-reported revenue, 0.55 to 0.85 is normal once UTMs and CAPI deduplication are correct. The ratio is more useful than the gap: it stays stable when spend scales, while the absolute gap grows with it.
Should I switch Meta to 7-day click only?
For reporting and reconciliation, yes — it removes view and engage-through credit that no backend can verify. For optimisation, leave the campaign-level default; the algorithm uses the wider signal. Use "Compare attribution settings" to see both columns side by side.
Why is Meta's revenue higher than Shopify's even with 7-day click?
Three usual causes: the pixel value includes shipping, COD cancellations never reach Meta, and duplicate browser/server events without a shared event ID. Fix those three and most stores land inside the normal band.
Does Shopify's referrer report replace UTMs?
No. Referrer classification groups Facebook and Instagram traffic reasonably well, but it cannot separate paid from organic, or one campaign from another. UTMs on every ad are what make "Sales attributed to marketing" usable at campaign level.
What is MER and why do you prefer it to ROAS?
MER (marketing efficiency ratio) is total net sales divided by total ad spend across all channels. It ignores attribution entirely, so it cannot be inflated by settings or by channels double-claiming the same order. It is the number a budget decision should rest on.
How often should the reconciliation be done?
Monthly for the owner's report, and a lighter weekly check of the ratio during scaling or after any tracking change (new theme, new checkout, app installs). A ratio that moves more than ten points in a week means tracking, not performance.
Want your ratio computed on last month's numbers?
A free audit includes the reconciliation sheet on your real Meta and Shopify data, with the plumbing checks done — you get the number and what is causing it.
