Why your Meta ROAS can look good while revenue doesn't
If Ads Manager looks healthy and Shopify does not, you are probably optimizing to a broken signal. Here is the order I audit tracking, purchase value, and CAPI — then structure — before I touch creative or budget.
Meta can show a healthy return while Shopify tells a quieter story: fewer real orders, thinner margins, or revenue that simply does not match the Ads Manager chart. When that happens, the usual instinct is to blame creative or throw more budget at the winner. More often, the account is optimizing to a broken or weak signal.
If the pixel and Conversions API are missing purchases, double-counting them, or sending the wrong value, Meta will happily scale whatever it thinks is working. The ROAS looks fine. The bank account does not.
This is the order I use when a store's in-platform numbers and actual sales stop agreeing.
Start in Events Manager, not in the ads
Before you rebuild campaigns, open Events Manager and ask a boring question: when someone buys, does Meta see one clean Purchase, with the right value, once?
Check:
- Whether Purchase fires on the thank-you / order status page, not on "reached checkout" or a pageview
- Whether the same purchase shows up twice — once from the browser pixel and once from the server — without a shared event ID to deduplicate
- Whether test or admin orders are landing in the same event stream as customer orders
- Event match quality: is Meta getting hashed email, phone, and other customer data it can actually use, or just a cookie that browsers are increasingly willing to drop?
A tracking gap here is not a reporting inconvenience. It is the signal the algorithm trains on. Weak signal in, confident-looking waste out.
Purchase value has to mean the same thing every time
A Purchase event with no value, a value of 1, or a value that sometimes includes shipping and discounts and sometimes does not, will distort ROAS as surely as a missing event.
Align the number Meta receives with the number you would defend in Shopify:
- Same currency as the store
- A consistent definition (I prefer the order total the customer actually paid, applied the same way every time)
- No "Purchase" label on add-to-cart, initiate-checkout, or a custom event that is easier to fire than a real order
If Meta thinks a $20 browse is a sale, it will go find you more $20 browses.
Add the Conversions API — then deduplicate
The browser pixel alone is fragile. Ad blockers, iOS privacy changes, and short cookie windows all mean some real checkouts never show up in Meta, or show up too late to help.
The Conversions API (CAPI) sends the same purchase from your server — through Shopify's native channel or a well-set-up partner — so Meta still sees orders when the browser event does not arrive. That only helps if pixel and server events share an event ID and collapse into one purchase. Two unmatched events for one order will inflate results just as badly as missing events hide them.
CAPI is not a magic lift. It is how you stop making decisions on a partial ledger.
Then fix campaign structure
Once the signal is trustworthy, look at how spend is split.
Common problems:
- Too many campaigns and ad sets, each starving the learning phase
- Optimizing for an easier event (landing-page views, add to cart) because purchases "were not coming through"
- Prospecting and retargeting fighting each other, or overlapping so thoroughly that you pay twice to talk to the same buyer
- Creative tests stacked on top of a conversion event that was never reliable
Rebuild around a clean Purchase optimization. Give the account enough concentration to learn. Cut the leftover structure that exists because an older setup needed it, not because this store still does.
Only then touch creative and budget
Creative and budget are where people like to start, because they feel like the work. They are the wrong first move when the number you would scale is lying.
After tracking and structure are sound:
- Kill spend that still cannot show a real Shopify sale
- Test creative against a purchase event you trust
- Scale budgets on campaigns whose ROAS you can reconcile to store revenue, not just to Ads Manager
A useful habit: pick a recent window and compare Meta's purchase count and purchase value to Shopify's. They will not match to the penny — attribution windows differ — but they should tell the same story. If they do not, you do not have a creative problem yet. You have a measurement problem.
A short audit you can run this week
1. Place a test order (or review a real one) and confirm a single Purchase in Events Manager, with the correct value. 2. Confirm CAPI is sending purchases and sharing an event ID with the pixel. 3. Compare seven to fourteen days of Meta purchases and value against Shopify orders and revenue. 4. List every campaign still optimizing to something other than Purchase, and why. 5. Only after those four, decide what to cut, what to rebuild, and what creative deserves more budget.
If your ROAS looks healthy and your store does not, believe the store first. Then go fix the signal Meta is using to spend your money.
Working on something like this?
Book a free 30-minute call and we’ll talk through what your store needs.
Start a project