True ROAS vs reported ROAS: why your Meta Ads look profitable when they're not
Most e-commerce operators tune Meta Ads based on the ROAS number in Meta Ads Manager. That number is wrong, and the way it's wrong is consistent: it's almost always inflated 30-60% above true ROAS — the ROAS your bank actually sees at the end of the month.
Some campaigns that look profitable on Meta are unprofitable in real life. Some campaigns that look mediocre are actually crushing. You can't tell which is which without measuring true ROAS separately.
What Meta-reported ROAS includes
The headline ROAS in Ads Manager is the sum of attributed conversion values divided by ad spend. "Attributed" is doing a lot of work in that sentence. Specifically, Meta counts a purchase as attributed to an ad if any of these happened:
1. The customer clicked the ad and purchased within 7 days (default click attribution). 2. The customer viewed the ad and purchased within 1 day (default view attribution). 3. The customer was on iOS without ATT consent and Meta modeled a probable conversion for them. 4. The customer triggered a CAPI event that matched ad exposure data.
By default, Meta's "Purchases" column is the union of all four. So a single sale to one customer can be attributed simultaneously to:
- The Meta video they saw last week (view attribution).
- The Meta carousel they clicked on yesterday (click attribution).
- A Google Ads search they did this morning (Google takes credit too).
- An email you sent (your ESP takes credit).
If you sum up "attributed revenue" across all your tools, the number is bigger than your total revenue. Everyone is taking credit for the same purchase.
What true ROAS measures
True ROAS is the dollars your bank deposits divided by the dollars you spent on a specific channel, with channel attribution done at the visitor level — not the impression level. If a customer touched Meta, Google, and email before buying, true ROAS doesn't give Meta 100% credit; it splits the credit (or assigns it to the highest-leverage touchpoint depending on your model).
For a clean measurement:
1. Pull total revenue from your store's source of truth (Shopify, Stripe, your ERP). 2. Pull total ad spend per channel from each channel's billing. 3. Apply an attribution model that matches the customer journey: time-decay, position-based, or first-touch — whatever fits your funnel. 4. Compare attributed revenue per channel to spend per channel.
That ratio is what your business actually runs on.
The four sources of inflation
Reported ROAS exceeds true ROAS for four reasons, usually compounding:
### 1. View-through attribution
A "view-through conversion" is a sale where the customer saw your ad but didn't click. Meta counts it as ad-driven. Reality: many of these would have happened anyway. Industry estimates put the incrementality of view-through at 10-30% — meaning 70-90% of view-through credit is for sales Meta didn't actually drive.
### 2. Long attribution windows
Meta's default click window is 7 days. If a customer clicks an ad on day 1 and buys on day 7 — but also sees three of your emails and a Google retargeting ad in between — Meta gets full credit. Tightening the window to 1-day click only is a more conservative measure that aligns better with true ROAS.
### 3. Modeled conversions
For ATT-denied iOS users, Meta fills in probable conversions using a model. The model has systematic bias (it tends to over-predict for high-spending advertisers). Modeled conversions can be 15-30% off in either direction. See our iOS attribution guide for how to read modeled data correctly.
### 4. Double-counted CAPI
Stores that send both pixel events and CAPI events without proper deduplication see their conversion volume inflate. The fix is correct event_id matching. Many stores still have this bug. Omesta's leak scan catches it.
The simple true-ROAS check
You don't need fancy MMM (media mix modeling) to know whether your reported ROAS is wildly inflated. Do this once a month:
1. Total revenue for the month from your store (call it R). 2. Total ad spend across all channels for the month (call it S). 3. Compute overall blended return: R/S. 4. Compare to the sum of channel-reported "ad-driven revenue" / S. If the second number is much higher than the first, your channels are over-attributing.
Most stores find that summed channel-reported ROAS is 30-60% higher than blended actual ROAS. That gap is what you're optimizing against when you tune campaigns on reported numbers alone.
Practical implications
If your Meta-reported ROAS for a campaign is 2.5x and your true ROAS is 1.5x, that campaign might still be profitable (depending on margin) but it's nowhere near as profitable as Meta says. If you scale it based on reported ROAS, you'll scale into unprofitability.
Conversely, a campaign with reported ROAS of 1.0x but true ROAS of 1.6x is doing more work than you think — usually because it's driving customers who later convert through other channels Meta doesn't see.
How Omesta surfaces true ROAS
Omesta correlates Meta ad spend with Stripe revenue at the customer level, using order timing, first-touch URL parameters, and CAPI event IDs. The dashboard shows reported ROAS, true ROAS, and the gap between them — per campaign, per ad set, per ad.
Most accounts find that 20-30% of campaigns have a reported-vs-true gap big enough that the right action is to cut or scale aggressively. Tuning to the right number changes the budget allocation by thousands of dollars a month for most stores.