Traqio.

One ROAS number across Meta and TikTok

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. Traqio computes ROAS for Meta and TikTok campaigns from one attributed dataset — each install credited to one network — per campaign, ad set and ad, on every plan including the free one.

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.

Campaign, ad set, ad — read one level at a time

Traqio stores spend at three levels — campaign, ad set and ad — and the three levels nest, because an ad belongs to an ad set that belongs to a campaign. Every Traqio ROAS report therefore reads one level at a time; adding the levels together would count the same money three times.

The rule is enforced in code and covered by a regression test, because a tripled denominator divides ROAS by three without any visible error. The same caution applies to any spreadsheet built from an export of several levels at once.

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.

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.

What Traqio does not do

Traqio does not convert currencies, does not model user-level iOS ROAS, and does not pull spend from ad networks other than Meta and TikTok. The three limits are stated here because each one changes how a Traqio ROAS figure should be read.

  • No currency conversion: spend is stored in the ad account's billing currency and revenue in the purchase currency. A ROAS row reports both currencies, and a row mixing several revenue currencies carries no single revenue currency instead of being silently converted.
  • No Google Ads or Apple Search Ads spend: installs from those channels can be recorded, but without their spend there is no ROAS for them.
  • No modelled iOS ROAS per user: SKAN postbacks are campaign-level, and Traqio reports modelled SKAN revenue separately from measured revenue.

Sending conversions back to Meta and TikTok

The Meta Conversions API is a server-to-server interface for sending conversion events directly from an advertiser's server to Meta, instead of relying only on a client SDK or pixel. The TikTok Events API is TikTok's server-to-server interface for sending conversion events from an advertiser's server to TikTok Ads Manager.

Traqio forwards install and purchase events to both APIs with one shared event id, so an app that also runs Meta's or TikTok's own SDK has each conversion counted once. The forwarding feeds each network's optimisation; it does not change how Traqio attributes the install. Each channel has its own page: Meta app campaign ROAS and TikTok app campaign attribution.

FAQ

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.
What happens if my ad account and my revenue are in different currencies?
Traqio does not convert currencies. Spend is stored in the ad account's billing currency and revenue in the currency of the purchase, and each ROAS row reports both. A row that mixes several revenue currencies carries no single revenue currency rather than being converted at an invented exchange rate.
Can I see ROAS for Google Ads or Apple Search Ads in Traqio?
No. Traqio pulls ad spend from Meta and TikTok only. Installs from other networks can be recorded, but their spend is not joined, so no ROAS is computed for them. 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.

Sources

Start measuring your ROAS — free.

1,000 conversions/mo free · no minimum · no sales call.

Start free

Related

Other use cases

Last updated 2026-09-19