Why your Meta ROAS doesn't match Shopify revenue
Meta says 40 sales, Shopify says 22. Here's exactly why your Meta Ads numbers never match Shopify revenue - and which number to actually trust.
Last quarter a founder messaged me a screenshot of two tabs. Meta Ads Manager: 41 purchases, $4.10 ROAS. Shopify, same week, same date range: 23 orders tagged Facebook or Instagram, and when she did the division by hand it felt more like $2.30. Her question was the one I get more than any other: "Which one is lying to me?"
Neither. That's the uncomfortable, useful answer. Meta and Shopify are both reporting honestly - they're just counting different things, on different clocks, with different rules about what gets to be called a "sale." Once you see how, the gap stops being scary and turns into something you can actually reason about.
By the end of this you'll know why the two numbers diverge, and - more importantly - which one to trust for which decision.
The one-sentence version
Meta counts conversions it believes it influenced. Shopify counts orders it can see a last click for. Almost everything below is a flavor of that single sentence.
Hold that in your head. Meta is trying to take credit for impact across the whole journey, using its own model and its own identity graph. Shopify's marketing report is last-touch: whoever was the final referrer before checkout gets the order. Two philosophies, one customer, two totals.
Why Meta counts a sale Shopify never saw
The biggest single source of the gap is view-through conversions. Meta will credit a sale when someone saw your ad - didn't click, just scrolled past it - and then bought within a set window.
Here's the scene. Someone sees your ad on Instagram on Tuesday. They don't tap it. Thursday they get your email, click through, and buy. Meta says: that's ours, we showed them the ad first. Shopify says: that order came from Email - that was the last click.
Both are internally consistent. But Meta just claimed an order that, as far as Shopify can tell, had nothing to do with Meta. Multiply that across a week of impressions and view-through alone can inflate Meta's count well past what landed in your orders table.
The attribution window stretches time
Meta looks back over a window - commonly a 7-day-click / 1-day-view setting, though the default and the available options vary by account and change over time, so check what your account is set to before you quote a number.
What the window does is bend time. A sale today can be credited to a click from six days ago. Shopify, meanwhile, attributes at the moment of the order: last click, right now. So the two systems are stamping the same purchase with different origins and different dates.
Make it concrete. Someone clicks your Meta ad on Monday but doesn't buy. They come back and check out the following Sunday. Meta, looking back over its window, says: that click was mine, book the sale to Monday's campaign. Shopify books a Sunday order to whatever the last touch was - maybe a branded search, maybe direct. Same purchase, two different days, two different sources. Now run that across hundreds of orders with staggered click-to-buy gaps and you can see why the daily totals never line up, even when the weekly numbers are closer.
That's also why a great Meta day and a great Shopify day rarely match - Meta is back-dating credit to when the click happened; Shopify is booking it when the money arrived.
Windows are a setting, and the defaults and available options have changed more than once and vary by account and objective. Don't take the "7-day click" number from a blog post (including this one) as gospel - open your account and read what your purchase conversion is actually set to before you quote it. (Last checked against Meta's documentation mid-2026.)
Different models, same order
Even setting windows aside, Meta and Shopify run different attribution models.
Meta wants to demonstrate influence, so it leans toward crediting the touch it served. Shopify's marketing report is last-touch - flat, simple, whoever was last. Point those two models at the same multi-step journey and you get double-counting in aggregate: Meta claims an order, Shopify hands it to Email or Direct, and if you add up every platform's self-reported sales you'll "sell" more than you actually did.
The mistake isn't in either tool. It's stacking numbers that were produced by different rules and expecting them to reconcile.
Cross-device is where the gap gets wide
Meta knows it's the same person on the phone and the laptop, because people are logged into Instagram on both. So the phone-saw-it, desktop-bought-it journey stitches together cleanly on Meta's side.
Shopify, working from cookies and last-click, usually can't make that jump. The mobile impression and the desktop order look like two unrelated events.
If your store skews mobile-first - most DTC brands do - this is a big chunk of your divergence. Meta confidently connects journeys across devices that Shopify simply never links.
Modeled conversions: estimates, not order rows
Since the iOS 14 / ATT changes, a meaningful share of conversions Meta reports are modeled - statistically estimated for the users it can no longer directly observe because they opted out of tracking.
Modeled conversions are genuinely useful in aggregate; they're Meta's best estimate of impact it can't measure directly. But it's worth being clear-eyed about what they are: estimates, not rows in your Shopify orders table. Some portion of "Meta's sales" are a model's inference, and there's no matching line in Shopify to point at.
And Shopify under-counts Meta at the same time
Here's the twist that catches people off guard: while Meta is over-claiming, Shopify is often under-crediting Meta for the exact same reason the journeys are messy.
When the click-through loses its UTMs - in-app browsers that strip parameters, link shorteners, a redirect that drops the query string - Shopify can't tell the visit came from Meta. So it files the eventual order under Direct / Unassigned.
So you get the worst of both: Meta inflates its own number with view-through and modeling, and Shopify quietly hides real Meta-driven orders inside Direct. The true answer is somewhere neither dashboard is showing you. (If you want to stop bleeding UTMs in the first place, the UTM setup guide is the practical fix.)
The smaller stuff that still adds up
A handful of less dramatic differences pile on top:
- Time zones. Meta reports on its account time zone; Shopify on your store's. A late-night order can land on different calendar days in each, which quietly smears any day-by-day comparison.
- "Purchases" vs "orders." Meta counts purchase events fired by the pixel; Shopify counts orders. A double-fired pixel, a test purchase, or an event without a matching order can drift the two apart even when nothing's "wrong."
- Refunds and cancellations. Shopify nets these out of revenue; Meta's conversion count usually doesn't claw the conversion back the same way or on the same clock.
- Currency rounding. Multi-currency stores get small per-order rounding differences that add up across thousands of orders.
None of these is the headline. But once you've accounted for the big sources above, this bucket explains the last few points of stubborn mismatch.
So which number do I trust?
Neither one in isolation. That's not a dodge - it's the actual operating answer:
- Use Meta's numbers directionally, inside Meta, to optimize campaigns and creative. They're the right currency for in-platform decisions.
- Trust Shopify for what actually hit your bank account. It's the system of record for revenue.
- For budget decisions across channels, you want neither raw number - you want a first-party, multi-touch view that reconciles back to real Shopify orders.
That last one is the whole game, and it's where most stores are flying blind.
How Prism reconciles this
This is the problem Prism is built for. Instead of trusting one platform's slice, Prism reconstructs the full first-party journey - the view, the click, the email, the order - and ties every credited sale back to a real Shopify order. The orders that Shopify dumped into Direct get their actual source back; the view-through inflation gets put in context next to what really converted.
Take the same Meta-sourced order and look at it through every model at once:
One $180 order · 4 touchpoints over 7 days
| Model | Meta | Direct | Use it to… | ||
|---|---|---|---|---|---|
| Last-click | – | – | – | $180 | credit the channel that closed the sale |
| First-click | $180 | – | – | – | credit the channel that found the customer |
| Linear | $45 | $45 | $45 | $45 | value every touch equally |
| Time-decay | $23 | $36 | $49 | $72 | weight the touches closest to purchase |
| Linear non-direct | $60 | $60 | $60 | – | ignore direct/branded, credit the earners |
| Prism ViewDEFAULT | $63 | $36 | $54 | $27 | Prism's balanced view across the journey |
The same Meta-sourced order, credited six ways. Every row still sums to $180 - attribution moves credit around, it never invents revenue.
The point isn't that one row is "right." It's that you can see the whole path instead of one platform's claim on it, and the numbers reconcile to an order you can find in Shopify. That's attribution accuracy - which channel earned credit for revenue you actually made. It's a separate question from profitability; Prism also has a business-wide P&L, but that's a different feature, and attribution never changes your total profit.
Pull up both dashboards side by side and go down the list above. Most of the gap will sort itself into one of these buckets within ten minutes - and you'll know which lever each one is.
What to actually do this week
You don't need a tool to get most of the way here. Three concrete moves:
1. Check your attribution window and decide if it's lying to you. Look at what your purchase conversion's window is set to. If you're running a 7-day-click setting on a brand with a short consideration cycle, a lot of your "Meta sales" are clicks that would've converted anyway. That's not fraud - it's just credit you should discount mentally.
2. Split view-through from click-through in your own head. In Meta's columns, you can usually see click vs view conversions separately. Read the click number as "people Meta actually sent," and the view number as "people Meta may have nudged." They are not the same currency, and stacking them is where over-confidence comes from.
3. Fix your UTMs so Shopify stops hiding Meta in Direct. This is the only one that recovers real money in your reporting. Every Meta link that drops its UTM becomes a Direct order in Shopify - a Meta sale you're not crediting Meta for. Tighten your link tagging and that bucket shrinks. The UTM setup guide is the fifteen-minute version.
Do those three and the gap stops being a mystery. What's left is the structural difference - view-through, modeling, cross-device - that no amount of tagging will close, because the two systems are answering different questions.
Open both tabs tomorrow
The gap between Meta and Shopify was never a glitch to fix. It's two systems answering two different questions, and now you know which question each one is good at.
Open both dashboards tomorrow with this list next to you. The numbers will finally make sense - and you'll know which one to act on.
If Google is your other big channel, the Google Ads version of this mismatch has its own twists (and a three-way GA4 fight). And if you're trying to decide which attribution model to trust in the first place, start with how the six models compare on one real order.
Quick answers
Is Meta lying about my sales? No. It's counting view-through and modeled conversions across its own attribution window - impact it believes it had. Shopify counts last-click orders. Different definitions, both honest.
Should I turn off view-through attribution? Not necessarily - view-through tells you something real about awareness. Just don't read view-through conversions as Shopify orders; they're not the same unit.
Why is my Meta ROAS higher than my real ROAS? Because Meta's numerator (its own counted conversions) is inflated relative to last-click Shopify revenue, while your spend is the same. Reconciled, first-party revenue usually lands between the two.
Does the iOS 14 update still matter in 2026? Yes - the consent limits it introduced are why a chunk of Meta's reported conversions are still modeled estimates rather than directly observed.
Which number should I report to my boss or investor? Shopify revenue for what the business actually earned; a reconciled multi-touch view for how to allocate budget. Never a stack of every platform's self-reported sales - that double-counts.
See which channels actually drive your revenue.
Prism reconstructs the full customer journey and reconciles every order back to Shopify - so your numbers finally agree.