Know which campaigns bring paying subscribers
Trials, subscriptions and renewals tied back to their source — with free receipt validation for the App Store and Google Play, SKAN revenue buckets and cohort revenue in your reporting currency.

What gets in the way
- 01
Installs aren’t the goal
Trials start on day 0, but paid conversions and renewals come days or weeks later.
- 02
Reported revenue isn’t validated revenue
Purchase events can be faked or replayed. Revenue you optimise on should be checked first.
- 03
iOS signal is aggregated
Without ATT consent, SKAN and AdAttributionKit conversion values are what you get — so their design matters.
From trial to renewal
An illustrative walk-through for a subscription app sold through both app stores.
- attribution
Install attributed
Apple Ads through AdServices, or the Play referrer for an Android campaign link.
- SKAN
Trial starts
av_trial_startis tracked — and sets a SKAN flag bit on device if it’s in your schema. - receipt validation
Subscription purchased
trackPurchase()sends the StoreKit 2 transaction or Play purchase; AppVero verifies it and counts it as validated revenue. - S2S events
Renewals from your backend
Forward renewals you already receive from the stores with the S2S events API, so they join the same install.
- cohorts
Cohorts decide budgets
Cumulative revenue per install on day 0, 1, 3, 7, 14 and 30 — by media source, in your currency.
The parts of the platform you’ll use most
- Free receipt validationStoreKit 2 JWS and Google Play signatures verified, with replay detection.
- SKAN schema editorEvents, revenue buckets and coarse rules, applied on device by the SDK.
- Cohort revenueRetention, revenue and events by install cohort and source.
- Renewals via S2SSend server-side renewals so lifetime value stays attributed.
- Purchase webhooksSigned, real-time purchase events for your own systems.
- 30+ currenciesRevenue normalised to your reporting currency with daily ECB reference rates.
A starting event plan
Standard av_ events where they fit, your own names where they don’t. Events from the SDK and the S2S API both inherit the install’s attribution.
| Event | When | Sent from |
|---|---|---|
av_trial_start | Free trial started | SDK |
av_purchase | Subscription purchased — sent by trackPurchase() with the receipt, validated server-side | SDK |
subscription_renewed | Renewal confirmed by the store | S2S |
av_registration | Account created | SDK |
let result = try await product.purchase()
if case .success(let verification) = result {
AppVero.shared.trackPurchase(verification) // validated server-side from the JWS
if case .verified(let transaction) = verification { await transaction.finish() }
}Good to know
Does receipt validation cost extra?
No. Receipts are verified cryptographically without calling store APIs, so there are no quotas or fees.
How do renewals get attributed?
Send renewal events from your backend with the S2S events API, identified by install ID or customer user ID; they inherit the install’s attribution.
Other solutions
See your own data in AppVero
Bring a campaign, a link or an app build. We’ll walk through attribution, deep links and raw data with your team, on data that looks like yours.