RevenueCat ROAS: How to Calculate True Return on Ad Spend
Platform-reported ROAS overstates returns for subscription apps. Here's how to recalculate it from RevenueCat realized revenue, with a worked example.
Add up the revenue Meta, Google, TikTok, and Apple Search Ads each claim for last month. Compare it to what App Store Connect actually paid you. The first number is almost always bigger — often by 40% or more.
Nobody is lying. Every platform is answering a slightly different question, all of them in their own favor. (If you want to see the size of your own gap first, run the numbers through our blended ROAS calculator.) If you allocate budget on those numbers, you systematically overfund whichever network has the most generous attribution settings.
RevenueCat knows what actually happened. Here's how to use it as the denominator of truth.
Four reasons platform ROAS runs high
Overlapping attribution windows. Meta's default is 7-day click, 1-day view. Google UAC models across a 30-day window. A user who saw a Meta ad on Monday, tapped a Google ad on Wednesday, and subscribed on Friday appears as a conversion in both accounts. Sum the platforms and you've counted one subscriber twice.
Trial starts reported as conversions. Most in-app event setups fire on start_trial. A trial start has a value of zero. If 38% of your trials convert, a platform optimizing to trial starts is optimizing to a number that is 62% noise.
Gross revenue, not proceeds. Platforms report the price the user saw. Apple and Google keep 15–30% of it. That cut alone turns a reported 2.0x into a real 1.5x.
Refunds never travel backward. The purchase event fires. The refund three weeks later usually doesn't. Your ad account's ROAS keeps the revenue permanently.
Store commission removed from every dollar platforms report as revenue
Apple and Google Play developer terms, 2026
What RevenueCat contributes
RevenueCat sits after the store, so it sees what the platforms structurally cannot:
- Realized revenue — money that actually arrived, not a modeled estimate.
- Refunds netted against the period they belong to.
- Proceeds — revenue after estimated store commission and taxes, exposed as a separate figure from gross. In webhooks you can derive it directly:
price * (1 - tax_percentage - commission_percentage). - Cohort timing — when revenue landed relative to install date, which is the only way to build a ROAS window that means anything.
The mechanics of the revenue-vs-proceeds distinction are documented in RevenueCat's taxes and commissions guide. Pick one mode and apply it everywhere.
The formula
True ROAS (Dn) = Realized proceeds from the install cohort, first n days
─────────────────────────────────────────────────────────
Ad spend that acquired that cohort
Two rules make or break it:
- Both halves anchor to install date. Spend on the day the cohort installed; revenue by days-since-install, not calendar month. Mixing the two is the most common error in homemade ROAS reports.
nmatches your funnel. A 7-day trial means D7 revenue is structurally zero. Judge on D30 at the earliest.
A worked example
A subscription app, one month of Meta spend, $9.99 monthly plan with a 7-day trial.
| Line | Value |
|---|---|
| Meta spend | $20,000 |
| Meta-reported revenue | $46,000 |
| Meta-reported ROAS | 2.30x |
| Trial starts | 4,600 |
| Trials converting to paid (37%) | 1,702 |
| Gross revenue at $9.99 | $17,003 |
| Refunds (1.9%) | −$323 |
| Store commission (30%) | −$5,004 |
| Realized D30 proceeds | $11,676 |
| True D30 ROAS | 0.58x |
Meta says 2.30x. The bank says 0.58x on day 30.
Neither number is a lie. Meta counted 4,600 trial starts at full plan value; reality delivered 1,702 paying subscribers, minus refunds, minus Apple's cut. And 0.58x at D30 is not automatically a failure — if those subscribers renew, D180 might clear 1.0x. That's the point: you cannot judge a subscription business on a single-month snapshot, and you certainly can't judge it on the platform's version.
Which number for which decision
| Decision | Use |
|---|---|
| In-platform bidding and creative selection | Platform-reported events |
| Budget split across networks | True ROAS from realized proceeds |
| Pause / scale a campaign | True ROAS, with a minimum conversion threshold |
| Board and investor reporting | Realized proceeds, always |
Running two numbers feels wrong until you've done it for a month. Then running one feels reckless.
Building the report
- Connect attribution. The network needs to be identifiable on the RevenueCat customer — via an MMP like Adjust, or directly for Apple Search Ads through the AdServices token.
- Pull spend by install date from each ad platform's API. Not calendar month. Install date.
- Pull realized proceeds by cohort from RevenueCat, sliced by days-since-install.
- Divide, at a fixed n. Same window for every network, every time.
- Set a volume floor. Under ~50 paid conversions, a cohort's ROAS is mostly variance.
Step 2 is where this usually dies. Seven ad platforms means seven APIs, seven auth flows, and seven different definitions of "spend" — and they all change their reporting schemas without telling you.
- Platform-reported ROAS runs high for four structural reasons: overlapping windows, trial starts valued as conversions, gross revenue, and refunds that never reverse.
- True ROAS = realized proceeds from an install cohort ÷ spend that acquired it — both anchored to install date.
- Store commission alone moves a reported 2.0x to roughly 1.5x before anything else is corrected.
- Keep platform events for in-platform bidding; use true ROAS for budget allocation between networks.
- Below roughly 50 paid conversions, a cohort's ROAS is variance, not signal.
The part nobody warns you about
Doing this for one network is a spreadsheet. Doing it for seven, weekly, with a consistent revenue definition, is a job — and it is the job most UA managers are quietly doing instead of managing campaigns.
Roasy pulls spend from every connected network and RevenueCat cohorts into one table, with one revenue definition applied across all of them. Same math as above, without the Monday morning.
Next: RevenueCat vs Adjust — which one tells you your real LTV, and how the two fit together rather than compete.
Berk Aydın
Performance Marketing Lead at Roasy. Writes about ROAS, retention, and the messy economics of mobile UA.