Why ROAS Doesn't Match Shopify (And How to Fix It)
Your Meta Ads ROAS says 5x but your Shopify profit says you're barely breaking even. Here's exactly why the numbers don't match and how to fix your pixel value tracking.
The Problem
You spend £1,000 on Meta Ads. Meta says you got £5,000 in revenue (5x ROAS). But when you check Shopify, you only made £2,500 in actual sales. Or the opposite: Meta shows 2x ROAS, making you think campaigns are losing money, but Shopify shows you're actually profitable at 4x.
Either way, you can't trust the data. And if you can't trust the data, every campaign decision you make is a guess.
Why ROAS Numbers Don't Match
ROAS mismatches happen for three main reasons:
1. Duplicate Conversions (Inflated ROAS)
Your Meta Pixel fires twice on every purchase. Meta thinks you got 50 orders when Shopify shows 25. This inflates your ROAS by 2x, making unprofitable campaigns look amazing.
Check Meta Events Manager. Compare yesterday's purchase count to Shopify's order count. If Meta shows roughly double, you have duplicate pixels. Fix: Find and remove duplicate pixel installations (theme code + GTM, or multiple GTM tags).
2. Wrong Conversion Value (Inflated or Deflated ROAS)
Your pixel sends the wrong amount to Meta. Common mistakes:
- Sending subtotal instead of order total: Customer pays £100 (product + tax + shipping), but pixel sends £80 (subtotal only). Meta underreports revenue.
- Hardcoded test value: Developer sets value to "10" for testing and never changes it. Every purchase reports as £10, destroying ROAS accuracy.
- Wrong GTM variable: Pixel pulls from the wrong data layer variable, sending product price instead of order total.
- Wrong currency: Pixel sends USD value but your store uses GBP. A £100 order shows as $100 in Meta, causing major discrepancies.
To check: Complete a test order on your site. Note the exact order total. Then check Meta Events Manager → Data Sources → your pixel → Test Events. See what "value" was sent. Does it match? If not, your pixel value parameter is wrong.
3. Attribution Windows (Structural Mismatch)
This is the hardest one to fix because it's how Meta fundamentally works. Meta uses a 7-day click or 1-day view attribution window. That means:
- Customer clicks your ad on Monday, buys on Friday → Meta counts it
- Customer sees your ad (doesn't click), buys next day → Meta counts it
- Customer clicks ad, Googles your brand later, buys directly → Meta still counts it
Shopify, on the other hand, just shows total orders—no attribution logic. So Meta might attribute 30 sales to your ads, but only 20 of those came directly from ad clicks. The other 10 would have bought anyway (branded search, direct traffic, retargeting).
You can't fully eliminate this mismatch, but you can reduce it by using shorter attribution windows or understanding your "incrementality" (sales you wouldn't have gotten without ads).
How to Fix ROAS Tracking
Step 1: Fix Duplicate Pixels
Use Meta Pixel Helper to check if events fire twice. If they do, find all pixel installations (theme code, GTM, apps) and remove duplicates. Keep one clean installation through GTM.
Step 2: Fix Conversion Value Parameter
In GTM, find your Meta Pixel Purchase event tag. Check the "value" parameter. It should dynamically pull from your ecommerce data layer, not be hardcoded.
For Shopify: The value should be {{ecommerce.value}} or {{transaction.total}} depending on your data layer structure. This pulls the full order total including tax and shipping.
For WooCommerce: Similar logic—pull from your checkout data layer using a GTM variable. Never hardcode a number.
Test: Complete a test order. Use GTM Preview Mode to see what value gets sent. Verify it matches the exact order total from Shopify.
Step 3: Fix Currency Code
Your Meta Pixel Purchase event needs a "currency" parameter. If your store uses GBP, make sure the pixel sends currency: "GBP", not "USD".
In GTM, add or edit the currency parameter in your Meta Pixel Purchase tag. Pull it dynamically from your data layer or set it as a constant if your store only uses one currency.
Step 4: Validate End-to-End
After making changes:
- Complete a test order on your site
- Note the exact total (e.g., £149.99)
- Check Meta Events Manager → Test Events
- Verify the Purchase event shows value: 149.99, currency: "GBP"
If it matches, your pixel is now tracking correctly. Give it 24-48 hours and compare Meta's revenue to Shopify again. The numbers should align much closer.
What About Attribution Mismatch?
Even with perfect tracking, Meta ROAS and Shopify won't match 100% due to attribution models. Meta uses probabilistic attribution (estimating conversions it can't directly track), while Shopify just counts raw orders.
Best practices:
- Use blended ROAS: Total revenue / total ad spend across all platforms = your real ROAS. Don't obsess over platform-specific numbers.
- Track by campaign type: Cold prospecting ROAS should be lower than retargeting. Compare apples to apples.
- Shorten attribution window: Switch from 7-day click to 1-day click in Meta to reduce over-attribution. ROAS will look worse, but it's more honest.
Common Mistakes to Avoid
- Trusting Meta ROAS blindly: Always cross-reference with actual Shopify revenue. If something looks too good, it probably is.
- Forgetting about refunds: Meta counts the initial purchase but doesn't subtract refunds. Shopify revenue includes refunds, causing slight mismatches.
- Not testing after changes: Every time you edit your pixel tracking, do a test order and verify the value parameter is still correct.