Back to blog
Meta AdsROASAttributionMobile UASubscriptions

Why Meta Ads ROAS Doesn't Match Your Actual Revenue

Four structural reasons Meta's reported ROAS runs above what your app actually earned — attribution windows, engage-through, modeled iOS conversions, gross revenue — and how to reconcile the two.

By Berk AydınSeptember 15, 20266 min read

Ads Manager says 2.3x. Your subscription platform says the users those campaigns brought in have paid back 0.6x of what you spent. Both numbers are produced honestly, by systems doing exactly what they are configured to do. They are answering different questions.

This is the Meta-specific version of a problem every network has. The mechanics matter because the fix is different for each one.

What Meta's ROAS column is built on

Meta's purchase ROAS is attributed purchase value ÷ amount spent. Three words in that formula carry the whole discrepancy.

Attributed means "fell inside the attribution setting." The default in 2026 is 7-day click, 1-day view, plus 1-day engage-through — the setting Meta renamed from engaged-view in March 2026 and widened to include social engagements such as likes, shares, and saves. Any purchase from a user who did any of those things within the window counts.

Purchase value is whatever your app or CAPI integration sent as the value of the purchase event. For most subscription apps that is the gross list price of the plan, at the moment the event fired.

Amount spent is the only part of the ratio that is unambiguous.

Four reasons the number runs high

1. The window overlaps with every other network's window. A user who saw your Meta ad on Monday, tapped a Google ad on Wednesday, and subscribed on Friday is inside Meta's 7-day click window and Google's 30-day click window. Both report the conversion. Neither is wrong by its own rules; the sum of the two is wrong by yours. This is the over-attribution gap, and it grows with every network you add.

2. Engage-through credits ads that were never clicked. Under the 2026 setting, a like or a save on the ad starts a one-day window. Some of those users would have subscribed anyway — that is exactly the population engage-through is best at capturing. Meta deprecated the longer 7-day and 28-day view-through windows from the Insights API in January 2026, which tightened this somewhat, but the one-day engage window remains in the default.

3. iOS conversions are modeled. After App Tracking Transparency, Meta cannot observe most iOS conversions directly. Aggregated Event Measurement fills the gap with statistical estimates, and CAPI does not change that: it removes the browser dependency, not the ATT constraint. The iOS purchase count in Ads Manager is partly a model's output. Models are calibrated to be right on average, which is not the same as being right for your account this week.

4. The value is gross, and it is the event value, not the realized value. Meta counts the $9.99 the moment the purchase event fires. It does not know that Apple keeps $3.00 of it, that 2% of purchases refund, or that the "purchase" was a trial conversion that will churn before the second renewal. Your bank account knows all three.

30%

App store commission that platform ROAS never sees

Apple and Google Play developer terms, 2026

The trial-start version of the problem

If your Meta pixel or SDK fires the purchase event on start_trial rather than on paid conversion — and many do, because trial starts are plentiful and the algorithm learns faster on them — the ROAS column is valuing a free trial at the plan price. With a 37% trial-to-paid rate, 63% of the "revenue" in that column will never exist.

This is a configuration choice, not a Meta flaw. But it means two accounts with identical real performance can show ROAS figures that differ by 2.7x depending on which event they fire.

Reconciling the two numbers

The reconciliation is a cohort join, not an adjustment factor:

  1. Anchor to install date. Take spend by the day the cohort installed, from Meta. Take realized proceeds by days-since-install, from your subscription platform. Never mix a calendar-month spend figure with a calendar-month revenue figure — the revenue from March installs keeps landing in June.
  2. Use proceeds, not gross. Revenue after the store's cut and refunds. RevenueCat exposes this as a separate figure; the mechanics are in how to calculate true ROAS from RevenueCat.
  3. Fix the window. D30 for a trial-based app at the earliest. Compare every channel at the same n.
  4. Expect the gap. A 30–60% over-attribution gap across four or more networks is normal. Run your numbers through the blended ROAS calculator to see yours.

What to change on Monday

  • Fire the paid conversion event, not the trial start, as the purchase event where volume allows. If volume doesn't allow it, keep trial starts for optimization but stop reading ROAS off them.
  • Send net value in CAPI where your integration supports it, or at least document that the value is gross so nobody compares it to proceeds.
  • Set the break-even bar on the right basis. A 1.5x on gross is roughly 1.05x on proceeds at a 30% commission — the break-even ROAS calculator shows both.
  • Judge Meta against other networks only on realized cohort revenue, never on the sum of platform-reported revenue.
Key takeaway
  • Meta's ROAS = attributed purchase value ÷ spend, with 'attributed' defined by a 7-day click / 1-day view / 1-day engage-through window that overlaps every other network's.
  • iOS conversions are partly modeled through AEM; CAPI doesn't change that.
  • The value counted is gross and fires at event time — before the store's 15–30% cut, refunds, and trial churn.
  • Reconcile by cohort: spend by install date, realized proceeds by days since install, one window for every network.
  • Keep platform ROAS for in-platform optimization; use realized cohort ROAS for budget allocation.

Where this lands

Doing this reconciliation for Meta is a spreadsheet. Doing it every week for Meta, Google, TikTok, Apple Search Ads, AppLovin, Unity, and Snapchat, with one revenue definition applied to all of them, is the job most UA managers are quietly doing instead of running campaigns. Roasy builds that table continuously — every network's spend, Adjust's attribution, and RevenueCat's realized cohorts on one screen. The same math as above, without the Monday.

Next in this series: Google App Campaigns' 30-day window and why its ROAS runs high in a different way.

Berk Aydın

Performance Marketing Lead at Roasy. Writes about ROAS, retention, and the messy economics of mobile UA.

Keep reading

All posts →