Grow · Measurement · Egypt, KSA, UAE

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.

By Mahmoud Gamal, founder of Adlogic Last updated September 2026 12 min read

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.

7

rules that create the gap. Three are about time, two about who gets credit, two about what counts as a sale.

0.55–0.85

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.

1 number

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.

The mechanism

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.

1
Meta counts the view; Shopify never does.Meta's default setting since March 2026 is 7-day click + 1-day engage-through + 1-day view-through. A person who scrolled past your ad yesterday and bought from a Google search today is a Meta conversion. To Shopify, that sale belongs to Google.
credit
2
Meta books the sale on the click day; Shopify on the order day.A click on the 29th and a purchase on the 2nd sit in different months in the two tools. Month-end reports always disagree for this reason alone, and the disagreement reverses next month.
time
3
Last non-direct click has a 30-day memory; a Meta click has 7 days.Shopify credits the last channel that was not "direct" in the customer's journey, and forgets after 30 days of inactivity or after a purchase. A day-9 conversion is Shopify's but no longer Meta's.
time
4
Shopify's session ends at midnight UTC; Meta has no session.In Riyadh and Cairo, midnight UTC is 3am and 2am. A browse before bed and an order after breakfast are two Shopify sessions — the second is often "direct", so the sale leaves paid attribution entirely.
time
5
Meta reports the pixel's "purchase value"; Shopify reports net sales.The pixel fires with the checkout total — often including shipping, sometimes before a COD cancellation. Shopify's net sales strips discounts and reversals. In COD-heavy stores, 15–30% of pixel purchases never become net sales.
value
6
Meta models what it cannot see; Shopify only counts what it saw.Since iOS 14.5, part of Meta's reported conversions are modelled for opted-out users. Shopify's referrer data has no model — an untracked session is simply "unknown" or "direct".
value
7
Every channel claims the same sale; Shopify gives it to one.Meta, Google, TikTok and Snap each report their own attributed revenue. Added together, they routinely exceed the store's real revenue by 30–60%. Shopify's last-non-direct model is single-touch: one sale, one winner.
credit
Rule 2, drawn

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.

What the customer did
Day 1Sees a Reeldoesn't click
Day 2Clicks the adadds to cart, leaves
Day 5Searches the brandon Google, buys COD
Day 9Refuses deliveryorder cancelled
What Meta records
Day 1Impression1-day view window opens
Day 2Purchase booked hereon the click date — 7-day window
Day 5Nothing newvalue already counted (incl. shipping)
Day 9NothingMeta never learns about the cancellation
What Shopify records
Day 1Nothingno session
Day 2Session: facebook / cpccart, no order
Day 5Order booked herelast non-direct click = Google
Day 9Sales reversalnet sales drop by the order value

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.

Rules 1 and 3, drawn

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.

Day 0Day 7Day 30 Meta · view-through Meta · engage-through Meta · click-through Shopify · last non-direct click 1 day1 day7 days30 days (resets after a purchase) Days 8–30: Shopify still credits paid; Meta no longer does. The biggest structural gap.

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 protocol

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.

RowSourceExactly what to pullWhy it is this and not something else
A · SpendAds ManagerAmount spent, whole month, all campaignsThe only number both sides agree on.
B · Meta revenueAds ManagerPurchase conversion value, Compare attribution settings → 7-day click only, reported by conversion time if availableStrips the view and engage credit so B is comparable to a click-based backend.
C · Shopify paid revenueShopify → Sales attributed to marketing, filtered to utm_source = facebook / instagram (or referrer = Facebook, Instagram)Net sales, order date, last non-direct clickThis is the backend's own opinion of what Meta drove. Net, not total — shipping is not margin.
D · Total net salesShopify → Total sales over timeNet sales, whole month, all channelsThe denominator for MER. Immune to attribution.
E · COD net-outShopify → Sales reversals (or your delivery report)Cancelled / refused COD value for orders placed in the monthMeta never sees these. This row explains most of the gap in Egypt.
C ÷ B
Attribution ratioTrack monthly. Healthy: 0.55–0.85. Sudden drop: check pixel/CAPI dedup and UTMs before touching campaigns.
B ÷ A
Meta ROAS (click only)Use for in-platform optimisation and creative decisions. Never for the owner's P&L.
D ÷ A
MERThe number the business runs on. Set the target here — for most MENA eCommerce at 30–45% gross margin, MER 3.5–5 is the profitable band.
E ÷ C
COD leakageShare of paid orders that never became revenue. Above 20%, the fix is on the checkout and the confirmation call, not in Ads Manager.
What stability looks like

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.

1.00.80.60.4 M1M2M3M4M5M6 healthy band 0.55–0.85 0.42 — CAPI token expired 0.700.720.680.710.69

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.

Before you reconcile

Fix the plumbing, or the ratio means nothing

Five checks, in order. Each one we have found broken in a live account this year.

UTMs on every ad, generated by template, never typed.utm_source=facebook&utm_medium=paid&utm_campaign={{campaign.name}}&utm_content={{ad.name}}. One typed "Facebook" with a capital F creates a second channel in Shopify and halves your paid revenue on paper.
Pixel + Conversions API with deduplication, verified in Events Manager.Look for "Deduplicated" next to Purchase. If the server and browser events carry different event IDs, Meta counts every sale twice and your ratio collapses to 0.4.
Purchase value = subtotal, not total.Set the pixel/CAPI value to the pre-shipping, post-discount amount. Otherwise Meta's revenue carries 8–15% of shipping that never reaches net sales.
COD confirmation as a separate event.Fire a custom "ConfirmedOrder" event from the confirmation call or WhatsApp flow. Optimise on Purchase; report on ConfirmedOrder. The ratio between them is your real COD leakage.
Report by conversion time when you compare to Shopify.Ads Manager can show results by impression time (default) or conversion time. Only the second lines up with Shopify's order dates. Set it once in the reconciliation view and keep it.
What we tell owners

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.

Questions we get asked

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.

Mahmoud Gamal
Mahmoud GamalFounder of Adlogic. Performance marketing for eCommerce, apps and lead generation in Egypt, Saudi Arabia and the UAE. Ratios and ranges in this article come from Adlogic accounts; the monthly chart is illustrative and no client's absolute spend or revenue is shown.
Next step

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.

Related case studies

Real numbers from accounts Adlogic has run across Egypt, Saudi Arabia and the UAE.

See all case studies →
WhatsApp us