Why your Meta ROAS doesn't match your Shopify revenue
The short version
Meta and Shopify count different things in different ways, so they will never match exactly. Check your tracking is set up properly, compare like with like, and judge performance on your own revenue rather than either dashboard on its own.
"Ads Manager says we made £30k from Meta last month. Shopify says we made £34k in total. That can't be right."
I hear a version of this a lot. Usually it isn't a tracking disaster. It's two systems counting different things, in different ways, on different days.
The usual reasons they don't match
1. Attribution windows
Meta gives itself credit for purchases made within a set number of days after someone clicks an ad, and a shorter window after someone views one. Shopify's own reports usually credit the last place someone came from before they bought. Same customer, two different stories.
2. View-through conversions
If someone saw your ad, didn't click, then bought later through Google or by typing your web address, Meta can still count that sale. Shopify will put it down to search or direct. Neither is wrong. They're just using different rules.
3. Different dates
By default, Ads Manager reports a conversion against the day the ad was shown or clicked. Shopify reports it on the day of the order. If someone clicks on the 30th and buys on the 2nd, the two systems put that sale in different months.
4. Modelled conversions
Since Apple's privacy changes, Meta can't see every purchase directly. It fills some of the gaps with modelled estimates. They're often reasonable, but they're estimates, and they won't line up with real orders.
5. What counts as "revenue"
Meta records whatever purchase value your pixel sends it. That might include tax and shipping. Your Shopify report might be showing net sales after discounts and returns. Check which numbers you're comparing.
6. Refunds and cancellations
Meta doesn't know about a refund three weeks later. Shopify does.
7. Everyone claims the same sale
Google, Meta, TikTok and your email platform can each claim one order. Add their numbers together and you'll often get more than you actually sold.
When the gap is a real problem
Some differences are a sign your setup is broken, not just different. Worth checking:
Duplicate purchases. If you run the Meta Pixel and the Conversions API together, they need to share an event ID so Meta counts each order once. If not, purchases can be counted twice. Events Manager will show you whether deduplication is working.
Missing purchases. Compare the number of purchases Meta records for a week against actual Shopify orders from people who came via Meta. A big shortfall usually means the purchase event isn't firing reliably, often after a theme change or a new checkout app.
Wrong values. Check that the purchase value Meta receives is the order value, in the right currency.
If those are all fine, the gap you're seeing is mostly the attribution differences above. That's normal.
Is there a "normal" gap?
Not one number that applies to every business. It depends on your price point, how long people take to decide, how many channels you run and how much of your revenue comes from returning customers.
What matters more is the trend. If the gap between what Meta claims and what the business takes is growing month after month, the platform is probably taking credit for more sales it didn't really drive.
What to judge performance on instead
Don't try to force the two numbers to agree. Use each for what it's good at.
Your own revenue and MER tell you whether marketing as a whole is working. More on MER here.
Meta's numbers tell you which campaigns and ads are doing better than others inside Meta.
A post-purchase survey ("How did you first hear about us?") gives you a rough, human view that no attribution model can.
Holdout tests are the most reliable way to see what ads really add. Pause or reduce spend in one region and compare it with the rest. Larger advertisers can also ask Meta about conversion lift studies.
When the platform, your shop and your bank account are all roughly telling the same story, you can trust the decisions you're making. When they're not, the bank account wins.