ROAS — return on ad spend — is revenue attributed to a campaign divided by what you spent on it. Spend $1,000 and drive $2,000 in revenue and your ROAS is 2x, or 200%; 100% is break-even (AppsFlyer). The formula is trivial. On mobile, the hard part is the numerator: attributing revenue to the right campaign when iOS hides most user-level data. This is how to measure mobile ROAS honestly given those limits.
The formula and what it leaves out
ROAS = revenue attributed to the campaign / ad spend on the campaign
ROAS deliberately ignores everything except ad cost and ad-driven revenue — no COGS, no salaries, no overhead. That's what separates it from ROI, which accounts for total profitability (AppsFlyer). ROAS is a campaign-efficiency metric: it tells you whether a specific ad is pulling its weight, not whether the business is profitable.
Because it's tied to a specific ad, ROAS is usually measured over a relatively short window after install. That short window is exactly where mobile measurement gets complicated.
Why mobile ROAS is hard to measure
Three things make the numerator unreliable on mobile, especially iOS:
- Attribution is privacy-limited. Since iOS 14.5, most installs are attributed through Apple's SKAdNetwork, which credits a campaign without identifying the user and returns aggregated, delayed, sometimes-suppressed data (Apple Developer). You often can't tie a specific purchase to a specific user.
- Revenue arrives later than the ad window. Subscriptions and in-app purchases can land days or weeks after install, past the short window SKAdNetwork reports on.
- Self-reported network numbers conflict. Meta, TikTok, and others each claim credit generously; without one independent source they don't reconcile.
The result: a naive "today's revenue ÷ today's spend" calculation will be both incomplete and inconsistent across channels.
How to measure it properly
A defensible mobile ROAS comes from a few disciplined choices:
- Use one attribution source. A Mobile Measurement Partner (AppsFlyer or similar) gives you a single, consistent view across networks instead of each platform's self-report, and handles SKAdNetwork reconciliation for iOS.
- Encode revenue into the conversion value. SKAdNetwork's conversion value is a small number, so map purchase tiers onto it before campaigns run and read revenue back from the bucket. Get the encoding right up front — you can't re-run history.
- Measure early ROAS, then project. Because real revenue lags, teams track an early-window ROAS (for example day-7) and use it to predict where a cohort will land. Predicted ROAS is an estimate; label it as one.
- Pair ROAS with LTV. ROAS over a short window doesn't capture a user's full value. Lifetime value (LTV) estimates the revenue a user generates over their whole time in the app, so reading ROAS alongside LTV keeps you from killing a campaign that's break-even at day 7 but strongly profitable by day 90 (AppsFlyer).
A worked example
Say you spend $5,000 on a TikTok install campaign. By day 7, attributed in-app purchase revenue is $3,000 — a day-7 ROAS of 0.6x, which looks like a loser. But this is a subscription app, and your cohort data shows day-7 revenue historically reaches about 2.5x by day 90 as trials convert and renew. Projected day-90 ROAS is therefore roughly $3,000 × 2.5 ÷ $5,000 = 1.5x. Kill the campaign at day 7 and you'd have cut a profitable channel; judge it on projected, LTV-aware ROAS and you keep it. The numbers are illustrative, but the trap is real: short-window ROAS on a delayed-revenue app systematically understates performance.
Blended vs per-campaign ROAS
Two views are worth tracking side by side. Per-campaign ROAS divides one campaign's attributed revenue by its spend — essential for deciding where to put the next dollar, but exposed to all the iOS attribution gaps above. Blended ROAS divides your total revenue by your total ad spend across every channel, sidestepping attribution entirely. Blended is harder to game and a good sanity check on whether marketing is paying off overall, but it can't tell you which campaign to cut. Mature teams watch per-campaign ROAS to allocate budget and blended ROAS to confirm the whole engine is profitable.
Reconcile against owned data
Attribution tools tell you which campaign to credit, but the revenue itself should be confirmed against data you own. First-party purchase events captured in your own database are the resilient source of truth for how much money came in; the MMP and SKAdNetwork answer which campaign drove it. When the two diverge sharply, the gap is the signal — usually a tracking or mapping problem, not a real performance swing.
The honest takeaway
Mobile ROAS is easy to define and hard to trust, because iOS turned attribution into an aggregate, delayed estimate. Treat any single-day ROAS figure with suspicion, anchor on one attribution source plus your own revenue data, and read ROAS next to LTV rather than alone. The number that survives all three checks is the one worth optimizing against.