Traqio.

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.

Reports
Example data
Cumulative ROAS by campaign, from install day
0%50%100%150%Break-evenD0D7D14D30D60D90
  • 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. 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. 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. 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 pricing

Example: 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

Last updated 2026-11-12

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