The Meta Ads Manager dashboard shows a ROAS of 4.1. The Shopify orders attributed to Meta over the same window add up to a ROAS of 2.6. Neither number is wrong on its own terms. They are measuring different things.
The gap between Meta-reported ROAS and the version that hits your bank account is typically 20 to 40 percent. For a brand spending US$15,000 a month on Meta, that gap can be the difference between scaling and bleeding. This is how to find your real number in five minutes.
Why the gap exists
Three structural reasons. None of them are bugs.
1. Modeled conversions after iOS 14
When Apple shipped App Tracking Transparency in iOS 14.5, Meta lost direct attribution for the majority of iPhone users who opted out. To keep the dashboard useful, Meta now models the conversions it can no longer observe. The number you see is a real signal plus an estimate. The estimate is conservative for some accounts and generous for others, and the only way to know which one you have is to verify it.
2. View-through attribution is on by default
Meta's default attribution window is "7-day click or 1-day view". The view-through portion credits a conversion to Meta if the person saw the ad without clicking, then converted within 24 hours. For most Shopify merchants that view-through credit overlaps with brand search, organic, email, and direct traffic. Meta does not know that the customer was already coming to your store.
3. De-duplication across pixel, CAPI, and Shopify
If you run the Meta pixel, Conversions API, and a Shopify integration in parallel without proper event de-duplication keys, the same purchase can be counted twice. Meta has gotten better at this, but mismatched event IDs still cause inflation in older setups.
Add these three together and a 20 to 40 percent gap is the typical outcome. We have seen ad accounts where Meta-reported revenue was 1.7x the verifiable Shopify revenue from the same window.
The 5-minute audit
You do not need a data warehouse. You need a spreadsheet and seven days of patience.
- Pull Meta-reported revenue for the last 7 full days. Ads Manager, set the date range to the last 7 days excluding today, look at the "Purchases conversion value" column at the account level.
- Pull Shopify orders attributed to Meta for the same window. In Shopify Analytics, filter orders by referring source. Or run a UTM query: orders where
utm_sourcematchesfacebook,meta, orfb. Sum the order subtotal. - Cross-check against GA4 (optional, sharper). In GA4 Acquisition, set the attribution model to "last non-direct click" and filter source to Meta. This is a stricter floor.
- Take the smaller of Shopify and GA4 as your conservative true-revenue floor. If only Shopify is available, use that.
- Divide by Meta spend in the same window. That is your true ROAS.
Now compare:
- Meta-reported ROAS: 4.1
- True ROAS (Shopify-verified): 2.6
- Inflation factor: 1.58x (the Meta dashboard is overstating by 58 percent)
Apply the inflation factor to every campaign decision going forward. If Meta says a new campaign is hitting 3.5 ROAS, your verified number is probably closer to 2.2. Scale accordingly.
Why this matters at scale
Scaling spend on a reported ROAS of 4.0 that is actually 2.6 looks like growth on the dashboard and feels like growth in the bank for the first month. By month three the cumulative gap shows up as cash flow that does not match revenue projections. Most merchants notice the disconnect at the wrong end: when they have already over-committed to inventory, headcount, or fixed costs based on a ROAS that was never real.
Operators who run this audit monthly tend to set internal Meta ROAS targets 30 to 50 percent above the breakeven they would set if the dashboard were honest. That gap is the safety margin.
What the audit usually reveals
Most merchants who run this for the first time discover three patterns in their account.
The view-through fraction is bigger than expected. Switch the Meta attribution setting to "7-day click only" and watch reported revenue drop. The delta you just exposed is your view-through credit, much of which would have converted via other channels anyway.
Brand search bleed-in is significant. A material share of Meta-attributed conversions in Shopify carry a UTM that includes a brand-name search query. Those buyers were already coming back. Meta took the credit because the ad delivered an impression in the same week.
The third pattern is account-specific: setup errors. Double-counted CAPI events, broken UTM passthrough on the storefront, or a Shopify integration set up before the Meta pixel update. Each one inflates differently. The audit surfaces which one is yours.
What oddly does about this
oddly connects Shopify, Meta Ads, and Google Ads in one place and runs the cross-check for you. The true-ROAS card on the dashboard surfaces the gap between platform-reported and Shopify-verified revenue for every connected ad account, every day, no spreadsheet required. Watch tier (free forever) shows the gap. Steer tier acts on it: campaigns above your true-ROAS threshold scale up, campaigns below it get flagged for review or paused. The platform never increases your ad spend without you. The diagnostic is automatic, the decision is yours.