Find the campaigns that bring paying subscribers
Connect every campaign to trial starts, first payments, renewals and refunds. RevenueCat, store billing and web checkout revenue land on the attributed user, so ROAS reflects money collected, not trials started.
Learning, kids, dating and wellness teams measure installs to first payment with Linkrunner
Customers include Stimuler, Lingopanda, Matiks, Omli Kids, Kulfi, Kine, CycleBae.







Optimise on the first payment, not the trial
The value event is FIRST_PAYMENT. A trial costs you nothing to give away and many trials never convert, so a campaign that wins on trials can still lose money. FIRST_PAYMENT always means a real paid transaction, whether from a paid first purchase or a converted trial, while trial starts remain a useful early signal because they arrive in the same session.
- Install
- 1TRIAL_STARTEDSame session to day 1Fastest intent signal; carries no revenue, so it never inflates ROAS
- 2TRIAL_CANCELLEDDay 0 to end of trialEarly warning that a campaign's trials will not convert
- Optimise on thisFIRST_PAYMENTDay 0 for paid starts; after the trial (commonly day 3 or day 7) for trial conversionsThe first real charge; the event that pays back acquisition cost
- 4SUBSCRIPTION_RENEWEDAround day 30 to 37 for a monthly plan; day 365 or later for annualProves the subscriber stayed past the first period
- 5SUBSCRIPTION_REFUNDEDAny time after a paymentMoney you thought you had collected; some campaigns refund more than others
Why subscription attribution breaks in standard setups
A trial start is not revenue
Linkrunner keeps TRIAL_STARTED, which carries no revenue, apart from FIRST_PAYMENT. You can let networks learn from trial starts while ROAS counts only money collected, so a campaign full of trials that never convert cannot look profitable.
See how RevenueCat events map →
| RevenueCat event | Linkrunner revenue type | Status |
|---|---|---|
| INITIAL_PURCHASE (trial) | TRIAL_STARTED | No revenue |
| INITIAL_PURCHASE (paid) | FIRST_PAYMENT | Completed |
| RENEWAL (trial conversion) | FIRST_PAYMENT | Completed |
| RENEWAL | SUBSCRIPTION_RENEWED | Completed |
| REFUND | SUBSCRIPTION_REFUNDED | Cancelled |
| BILLING_ISSUE | SUBSCRIPTION_BILLING_ISSUE | Failed |
| CANCELLATION (trial) | TRIAL_CANCELLED | Cancelled |
Monthly renewals land just after the D30 window
With a 7-day trial and a monthly plan, the first charge lands around day 7 and the first renewal around day 37, outside D30 ROAS. It still attaches to the attributed user and shows in cohorts, the Users tab, webhooks and exports.
See how ROAS windows work →
- Install4,210$2.00$8,420 ÷ 4,210
- Sign-up1,684$5.00$8,420 ÷ 1,684
- Purchase421$20.00$8,420 ÷ 421
Revenue arrives from more than one billing route
App Store, Google Play and web checkout each report payments differently, and the same charge can arrive twice if two sources send it. Pick one source per transaction: RevenueCat, the SDK's capturePayment, or the server API, which also carries payments from other billing tools and web checkouts. App payments are deduplicated by payment ID.
Read the revenue tracking API docs →
- type
- FIRST_PAYMENT
- payment_id
- ord_88213
- user_id
- user_2041
iOS trials report through SKAN, coarsely
Without ATT consent, iOS campaigns report through SKAN and AdAttributionKit. Only the first postback window, day 0 to 2, carries fine values; trial conversions after that land in coarse windows where you only get low, medium or high. Map trial start and first payment ranges deliberately to see paid conversion on iOS campaigns.
See how SKAN mapping works →
SKAN 4 postbacksCopies to Linkrunner
- Postback 1Day 0 to 242Fine value
- Postback 2Day 3 to 7MediumCoarse value
- Postback 3Day 8 to 35HighCoarse value

| RevenueCat event | Linkrunner revenue type | Status |
|---|---|---|
| INITIAL_PURCHASE (trial) | TRIAL_STARTED | No revenue |
| INITIAL_PURCHASE (paid) | FIRST_PAYMENT | Completed |
| RENEWAL (trial conversion) | FIRST_PAYMENT | Completed |
| RENEWAL | SUBSCRIPTION_RENEWED | Completed |
| REFUND | SUBSCRIPTION_REFUNDED | Cancelled |
| BILLING_ISSUE | SUBSCRIPTION_BILLING_ISSUE | Failed |
| CANCELLATION (trial) | TRIAL_CANCELLED | Cancelled |
Where subscription teams find users who pay
- Meta: Send trial starts as an early signal and FIRST_PAYMENT with revenue, so creative-level ROAS reflects first payments rather than trials.
- Google App campaigns: Import trial start and first payment as conversion actions and choose which one the campaign optimises toward.
- Apple Ads: iOS users searching for a category ("learn English", "period tracker") arrive with clear intent; attribution runs through Apple AdServices with keyword-level spend.
- Creators and influencers: One link per creator, with an Influencer role so each creator sees only their own campaigns; first payments tie back to the creator who sent the user, not just installs.
- Web-to-app and web checkout: Meta Sales (Website) campaigns and link-based flows send users to a web paywall, and each completed web payment reaches Linkrunner through the server API.
- TikTok: Short product demos suit learning and wellness apps; campaign links carry the ttclid click ID for deterministic matching.
Frequently asked questions
Measure subscribers, not trial starts
Live within a week, with every campaign tied to first payments, renewals and refunds, and your first 25,000 attributed installs free.