Subscription app · This is you if
Your app lives on subscriptions, and a cost per install says nothing about whether a campaign will pay back.
For subscription apps: see when each campaign pays back
Each campaign's revenue — trials, first payments and renewals — day by day from the install, and the day it pays for itself.
Free up to 2,000 conversions a month, per product. No card, no call.
- Campaign A · Meta151%
- Campaign B · TikTok74%
Reading it: the campaign that looks cheaper in the first days never gets back to break-even — the other one crosses it around day 30.
Today
Without Traqio, it looks like this
- A $3 install can be a bargain or a disaster: it all depends on who renews.
- Meta and TikTok each claim the same subscribers, and your subscription tool doesn't know which ad brought whom.
- Free trials push revenue out by a week: on day one, every campaign looks like a loss.
How it works
Three steps, then you read the report
- 1
Add the SDK with your user id
Give it the same user id as your subscription tool. On iOS it also reads Apple Ads attribution — no tracking prompt.
// One user id on both sides — that is the whole join. Traqio.init({ sdkKey: "YOUR_SDK_KEY", userId: user.id }); Purchases.logIn(user.id); // RevenueCat - 2
Connect revenue and spend
RevenueCat or Google Play's purchase notifications bring trials and renewals server to server; Meta, TikTok and Apple Ads bring the spend.
Connects with
- 3
Read the payback curve
Cumulative ROAS per campaign from install day — day 0 counts — at D7, D30 and beyond: cut or scale on payback, not on installs.
Example data- Campaign A · Meta151%
- Campaign B · TikTok74%
What it costs
Free up to 2,000 conversions a month, then $0.04 each
- A conversion is one attributed install, or one new user on a website.
- Purchases, renewals and every other event are measured, never billed.
- Every feature is on every plan — the plans differ in volume only.
Billing is not switched on during early access: nothing is charged today.
See full pricingExample: 3,500 conversions this month
- 2,000
- included
- 1,500 × $0.04
- $60
- Total
- $60 this month
Questions before you start
Does a renewal in month six still count for the original campaign?
Yes. The renewal carries the same user id as the install Traqio attributed, so it is credited to the campaign that acquired the subscriber.
Do I need RevenueCat?
No. Google Play's real-time purchase notifications are read directly, and the SDK can report a purchase itself. On the App Store, purchases come through RevenueCat or the SDK today.
And on iOS, without the tracking prompt?
Apple Ads installs are attributed one by one through Apple's attribution token, no prompt needed. Other iOS campaigns arrive through SKAN: by campaign, delayed, and reported apart from Android's per-user numbers.
I run several apps, or a client's apps. Is it the same price?
Each app gets its own free allowance every month and its own keys; a client can have their own workspace and see only their apps.
The detailed answer, with sources
A subscription app earns from recurring payments, usually after a free trial, so a campaign's value shows over months rather than at install. Traqio joins every trial, first payment and renewal to the campaign that acquired the subscriber, through one shared user id, and plots each campaign's cumulative return on ad spend from the install day. Revenue arrives from RevenueCat, from Google Play's real-time notifications or from the SDK; spend comes from Meta, TikTok and Apple Ads; and every part of it is on the free plan, because Traqio's plans differ in billed volume only.
How RevenueCat revenue reaches the right campaign
The join is one user id. The app gives the same id to the Traqio SDK (userId) and to RevenueCat (app_user_id); RevenueCat's webhook then sends each purchase to Traqio server to server, and Traqio attaches it to the install it attributed for that user.
- Initial purchases, renewals and non-renewing purchases are ingested, with RevenueCat's event id as the deduplication key.
- The webhook is authenticated with a secret shown on the app's RevenueCat card — not the public SDK key that ships in the app.
- No revenue is sent from the device for these purchases, so no client secret lives in the app.
A worked example
ROAS is attributed revenue divided by spend, computed per campaign. In an illustrative month, an app spends $500 on a Meta campaign and $300 on a TikTok campaign; the installs attributed to the Meta campaign generate $1,200 of revenue and those attributed to the TikTok campaign generate $480.
The figures are arithmetic chosen for readability, not a typical or target result; this page publishes no ROAS benchmark. What the example shows is the shape of the calculation Traqio runs for every campaign, ad set and ad, every day.
- Meta campaign: $1,200 ÷ $500 = ROAS 2.4
- TikTok campaign: $480 ÷ $300 = ROAS 1.6
- Both campaigns together: $1,680 ÷ $800 = ROAS 2.1
Why the networks' own numbers don't add up
A self-reporting network is an ad platform — such as Meta, Google or TikTok — that measures and reports its own campaign results, so its numbers cannot be independently verified from the platform itself. When Meta and TikTok both credit themselves with the same install, the revenue of that user is counted twice and both networks' ROAS looks better than the business result.
A typical question from a team running both networks: Meta reports 300 installs, TikTok reports 260, and the app sold 410 subscriptions — what did the $800 actually return? Answering it requires assigning each install to one network before dividing, which is the job of a third party rather than of either network.
Traqio assigns each install once, attaches the revenue of that user to the same campaign, and divides by that campaign's spend. The revenue credited to Meta and to TikTok then adds up to the account's real attributed revenue instead of exceeding it, so the account's ROAS is not inflated.
Where the two halves of ROAS come from
Attributed revenue is in-app revenue — subscriptions and in-app purchases — matched back to the campaign that drove the install of the paying user. Traqio reads that revenue from three sources and reads the spend from the Meta and TikTok ad accounts directly.
Traqio reports attributed revenue gross: the purchase price reported by the SDK or by RevenueCat, before the app store's commission. Traqio's ROAS is therefore a gross-revenue ratio, and a team reasoning in net revenue should apply its own store commission on top.
The RevenueCat join is a single rule: the app user id set in RevenueCat must equal the user id passed to the Traqio SDK. When the two ids match, every renewal attaches to the install that acquired the subscriber, months after the install.
- Revenue events sent by the Traqio SDK, with the value and currency the app provides.
- Subscription and in-app purchase events from RevenueCat webhooks, matched to the install through a shared user id.
- Impression-level ad revenue from AdMob.
- Daily spend from the Meta Marketing API and the TikTok Reporting API, at campaign, ad set and ad level.
D0 cohorts: install day counts
D7 ROAS is the revenue attributed to a campaign within seven days of install, divided by that campaign's spend; D0 counts install day itself. Traqio counts D0, so revenue earned in the first hours after install is part of every cohort instead of being dropped.
An install cohort is the set of users who installed the app on the same day; ARPU for a cohort is its revenue divided by its number of users at a given day since install. Cohort days in Traqio are measured from install, not from the calendar date. Vendors differ on whether day 0 is counted; Traqio states its convention because a stated convention can be compared and a hidden one cannot.
Lifetime value (LTV) is the total revenue a user is expected to generate over their lifetime in the app. Traqio shows realised LTV — revenue observed to date for the cohort — and does not show a predicted LTV.
When the numbers arrive, and why a closed day can still change
Traqio pulls Meta and TikTok spend once a day, at 04:30 UTC, for the previous three days, and never writes the current day. Spend therefore appears in Traqio the day after it is incurred; attributed revenue appears as soon as the revenue event arrives.
The three-day lookback exists because ad networks restate spend after the fact — late-billed impressions and invalid-traffic credits change totals for a few days. Traqio re-pulls those days, so a day that already looked closed can move slightly, in either direction. This is Traqio's own operational observation, not a figure published by Meta or TikTok.
Today's spend is never stored as final. A partial day written as final reads as a sudden spend drop and an inflated ROAS the next morning — a bug many advertisers have seen in some dashboard.
A failure on one connector never stops the other: a revoked TikTok token does not interrupt the Meta spend sync, and the Meta ROAS keeps updating while the TikTok connection is repaired.
How an Apple Ads install is attributed
The Traqio SDK reads the AdServices attribution token on iOS 14.3 and later, and Traqio resolves it with Apple, retrying while Apple has not registered the install yet. No advertising id is read and no tracking prompt is shown.
Apple decides how detailed its answer is from the choice the user already made for the app. With tracking allowed, the answer carries the campaign, ad group, keyword and ad. Without it, the answer only says the install came from Apple Ads — Traqio records exactly that and never guesses a campaign.
Where the spend and the names come from
The customer creates an Apple Ads API user, uploads the public key Traqio generates, and pastes back its ids. Through it Traqio reads campaign and ad group names and daily spend for the campaigns that promote the app, and writes nothing.
How to read campaign ROAS honestly
Campaign ROAS divides the revenue of installs Apple attributed to that campaign by the campaign's spend. Installs Apple did not detail have their own row: their revenue counts in the Apple Ads total and is never spread across campaigns, so the total is complete and each campaign figure is a floor.
How are app installs attributed on iOS after ATT?
SKAdNetwork (SKAN) is Apple's attribution framework: instead of user-level data, Apple sends the ad network a signed, delayed and aggregated postback stating that a campaign produced an install, plus a small conversion value describing early in-app behaviour. Traqio attributes iOS installs from those postbacks.
Traqio verifies Apple's signature on every SKAN postback, decodes the conversion value against a versioned mapping defined per app, and stores the raw postback untouched. Postbacks from SKAdNetwork 2.1 and later are accepted; unsigned or invalid postbacks are rejected.
SKAN attribution is campaign-level, not user-level. Apple's documentation states that the first postback arrives after a random 24–48 hour delay once its conversion window closes, and that Apple limits the detail in each postback according to a crowd-size tier. As a result, per-user iOS ROAS does not exist in Traqio, and Traqio does not model one into existence.
App Tracking Transparency (ATT) is the iOS framework, mandatory since iOS 14.5, that requires an app to ask the user's permission before accessing the IDFA or tracking them across other companies' apps and websites. Traqio does not need that permission, because SKAN attribution does not depend on it.
What the report does not do yet
Revenue is reported gross, before app-store commission and taxes: the commission is stored but not applied. iOS installs attributed through SKAN are campaign-level, so user-level renewal curves exist for deterministic installs only.
One workspace per client, one login
Each client app is a product with its own keys and its own free allowance. Each client can have its own workspace, with its own ad accounts and members; the agency switches between them from one login, and a client invited to their workspace sees their apps only.
Reports that send themselves
Any saved view can be mailed daily, weekly or monthly at a chosen hour, in English, French or Spanish, with the CSV attached — up to twenty recipients per report.
- What is ROAS for a mobile app?
- Return on ad spend (ROAS) is the revenue attributed to an advertising campaign divided by the amount spent on that campaign; a ROAS of 2 means one unit of currency spent returned two. For an app, the revenue side is the in-app revenue of users whose install is attributed to the campaign. Example: $1,200 of attributed revenue on $500 of spend is a ROAS of 2.4.
- Why don't Meta and TikTok install numbers add up?
- Meta and TikTok are self-reporting networks: each measures its own results and credits itself with installs it can connect to its ads. An install that followed ads on both networks is claimed by both, so the two totals exceed the real number of installs. A mobile measurement partner assigns each install to one network before computing ROAS.
- What is D0 ROAS, and why do some tools start at D1?
- D0 ROAS is the revenue attributed to a campaign on install day itself, divided by the campaign's spend. Vendors differ on whether day 0 is counted in cohorts; Traqio counts it, so revenue earned in the first hours after install is never dropped. The convention matters for subscription apps with trials that convert on day 0.
- How soon after spending do I see ROAS in Traqio?
- Traqio pulls Meta and TikTok spend once a day at 04:30 UTC for the previous days, so a day's spend appears in Traqio the following day. Attributed revenue appears as soon as the SDK, RevenueCat or AdMob reports it. ROAS for a day is therefore complete the morning after.
- Why did my ROAS change for a day that had already closed?
- Ad networks restate spend for a few days after the fact, for example through late-billed impressions and invalid-traffic credits. Traqio re-pulls the previous three days on every daily sync, so a recently closed day can move slightly when the network restates its spend. Today's partial spend is never stored as final.
- Can I see ROAS for Google Ads or Apple Ads in Traqio?
- Apple Ads, yes: its spend is pulled through an Apple Ads API user of your own, and ROAS is reported per campaign and ad group. Google Ads, not yet: its spend is not pulled, and a ROAS without a spend figure would have no denominator.
- Do I need a minimum ad spend to get ROAS?
- No. Traqio has no minimum spend and no plan gate on ROAS: ROAS is computed from the first attributed install and the first unit of spend, and it is in the free plan on the same terms as in the paid ones. Traqio's plans differ in billed volume only.
- Does Apple Ads attribution need the IDFA or a tracking prompt?
- No. The AdServices token works without ATT consent, and the Traqio SDK never shows the prompt.
- Can I see keyword-level results?
- Installs carry the keyword id when Apple details them; spend is pulled at campaign and ad group level.
- Do I need the IDFA or the GAID for app attribution?
- No. Traqio requires neither the IDFA nor the GAID. Android attribution uses the Google Play Install Referrer and iOS attribution uses SKAdNetwork, both of which are provided by the platform owner and work without an advertising identifier or ATT permission. Sending the advertising id is an opt-in in the Traqio SDK that only sharpens attribution for networks that attribute by it, such as AppLovin.
Sources
- Apple — Receiving postbacks in multiple conversion windows — checked 2026-09-19
- Apple — Receiving ad attributions and postbacks (SKAdNetwork) — checked 2026-09-19
- Apple — User Privacy and Data Use — checked 2026-09-19
Last updated 2026-11-12
Related
- What is ROAS, and how is it calculated?
- SKAN (SKAdNetwork), explained
- What is an MMP (Mobile Measurement Partner)?
- AppsFlyer alternative: how Traqio compares
- Adjust MMP alternative: published pricing compared
- Singular MMP alternative: how Traqio compares
- Traqio vs AppMetrica
- Linkrunner alternative: how Traqio compares
See this report with your own numbers.
Create an account, declare your app or site, get your keys. Nobody will call you.
Free up to 2,000 conversions a month, per product. No card, no call.
Other cases
Use cases- Mobile game
Your game earns from ads and in-app purchases, and you can't tell which campaign brings players who stay and pay.
Per campaign: D1 and D7 retention, ad and in-app revenue, and ROAS at D0, D7 and D30 — against what the campaign cost.
See this caseExample data- Meta · Lookalike_payers1.73×
- AppLovin · Playable_v21.24×
- SaaS & web app
Your ads send people to your SaaS or web app, and you can't tell which campaign brings customers who pay.
Per campaign: sign-ups, how many became paying customers, and the revenue they brought — tied to the ad click, first-party.
See this caseExample data- Meta · Retargeting_blog1.16×
- Meta · Lookalike_trial0.56×
- App + website
You have an app and a website: some people sign up on the site, others install the app, and each tool sees half of what a campaign did.
Web sign-ups and app installs per campaign, side by side, with the revenue of both — and links that open the app on the right screen.
See this caseExample data- Meta · Web_quiz1.70×
- TikTok · App_install_ugc1.20×