Meta Ads vs Shopify: why the sales never match (and which to trust)
Ads Manager says 42 purchases, Shopify shows 27 orders. Attribution windows, view-through, duplicate pixels, time zones and refunds explain most of the gap. How to find the cause, and which number to steer by.
5 min read
It's Monday morning. Ads Manager says last week's campaigns drove 42 purchases. Shopify shows 27 orders, and some of those came from email and Google. Which one is lying?
Usually neither. They're counting different things, on different days, with different rules. Once you know which rule causes your gap, you can stop arguing with the dashboard and start steering by the right number.
First: they aren't counting the same thing
Shopify counts orders. One checkout, one order, on the day it was placed, minus whatever you refund.
Meta counts purchases it can attribute to an ad. By default, that's anyone who bought within 7 days of clicking an ad or 1 day of viewing one. The same order can also be claimed by Google Ads, by your email tool and by TikTok, each under its own rules. Add up every platform's "purchases" and you'll almost always get more orders than your store has.
Meta also fills gaps with estimates. Since Apple's App Tracking Transparency, many iPhone users can't be followed from ad to purchase, so Meta models some conversions it can't observe directly. Those modeled purchases are real estimates, but they're estimates.
So some gap is normal. A big one, or one that suddenly grows, is worth chasing.
The six usual causes, and how to test each
1. View-through and long windows
A person scrolls past your ad, doesn't click, and buys the next day after searching your brand on Google. Meta counts it as a 1-day view purchase.
Test: in Ads Manager, open Columns, choose Compare attribution settings, and add the 7-day click and 1-day view columns side by side. If most of your purchases are view-through, your ads may be getting credit for people who were going to buy anyway.
2. Purchases counted twice
The most common setup mistake: the Meta pixel is installed twice. Once by old code pasted into the theme, and once by Shopify's Facebook & Instagram app. Or purchases arrive from both the browser pixel and the server (the Conversions API) without a matching event_id, so Meta can't tell they're the same purchase and counts both.
Test: in Events Manager, open Test events, place a real test order, and count the Purchase events that arrive. One order should mean one purchase, or two marked as deduplicated. Then remove any pixel code left in your theme, and let one integration send the events.
3. Different days
By default, Ads Manager reports a purchase on the day of the ad click or view, not the day of the order. An ad clicked on Sunday that leads to an order on Tuesday is Sunday's purchase in Meta and Tuesday's order in Shopify. Week-by-week comparisons drift because of it, especially around sales.
Test: compare 28-day totals instead of single days. If the gap shrinks a lot, timing explains part of it.
4. Time zones and currencies
If your ad account is set to one time zone and your store to another, "yesterday" means different hours in each. If they use different currencies, conversion rates add another small gap.
Test: check the time zone in Meta's ad account settings and in Shopify's store settings. They should match. Changing an ad account's time zone isn't a quick setting, so if they differ, compare weeks or months rather than days.
5. Refunds, cancellations and test orders
When you refund an order, Shopify's net sales go down. Meta's purchase stays. Cancelled orders, test orders and draft orders you mark as paid can all make the two drift apart.
Test: compare Meta's purchase value with Shopify's gross sales for the same period, not net sales.
6. Missing purchases (the opposite problem)
Sometimes Meta shows fewer purchases than it should. The usual reason: old pixel code in the theme doesn't run on Shopify's checkout pages, because the checkout isn't part of your theme. Purchases then only reach Meta when the official integration sends them.
Test: in Shopify's Facebook & Instagram app, set customer data sharing to its highest level, which sends purchases server-side through the Conversions API, and repeat the test order from cause 2.
Which number to steer by
You need two numbers, for two different jobs.
For money, trust Shopify. It's where the money actually lands. Every weekly report starts with Shopify's orders and revenue.
For comparing ads with each other, use Meta's numbers. Meta's count may be inflated, but it's inflated roughly the same way for every ad. "Ad A drives twice the purchases of ad B" is still useful even if both numbers are high.
Then add one number that ties the two together:
- MER (marketing efficiency ratio): total store revenue divided by total ad spend, across every platform, each week. If you spend more on Meta and MER holds, the extra spend is working. If MER falls, it isn't, whatever Ads Manager says.
- New-customer revenue: revenue from first-time buyers. Ads should mostly bring in new customers. Returning customers usually come back through email anyway.
For a direct check, use your own links. Put UTMs on every ad (utm_source=facebook, utm_medium=paid, utm_campaign=…), then look at Shopify's sales by UTM. Shopify's count of orders from Meta is the floor; Meta's count is the ceiling. The truth is somewhere between.
And when you're unsure whether a campaign is doing anything at all, pause it for a week. If Shopify's revenue drops by roughly what Meta claimed, the claim was fair. If nothing changes, it wasn't.
The 15-minute weekly check
| Step | Where | Look for |
|---|---|---|
| Orders and revenue last week | Shopify | Your real number |
| Purchases and spend last week, 7-day click only | Ads Manager | The ads' share, without view-through |
| MER | Shopify revenue ÷ total ad spend | Steady or rising as spend grows |
| Orders by UTM | Shopify's sales reports | Which ads bring orders you can see |
| One test order a month | Events Manager → Test events | Exactly one purchase per order |
If the gap between Meta and Shopify suddenly jumps, something changed: a new app that added a second pixel, a theme update, a checkout change. Check the test order first.
Where MarketingBuddy fits
This comparison is the first job our Tracking agent does for a Shopify store: it reads your Shopify orders read-only, compares them with what Meta and Google Ads report, and lists what to fix before anyone touches the budget. Then the Paid Ads agent builds campaigns on real purchases, paused until you approve them. See how it works for Shopify stores, and read why tracking comes before ad spend.
- Shopify
- Meta Ads
- Meta pixel
- Conversions API
- Attribution
- Ecommerce
Let your AI run the marketing. You keep the final say.
Connect your ads, analytics, store and email, and approve every change before it goes out.