How to Track App Campaign ROAS After a Free Trial
Measure app campaign ROAS when revenue arrives after a free trial, with mature cohorts, subscription events, refunds, and renewals.

A campaign with free trials has at least two scoreboards.
The early scoreboard tracks installs and trial starts. The mature scoreboard tracks paid conversions, refunds, renewals, revenue, and ROAS after the trial has had time to finish.
Mix those scoreboards and a healthy campaign can look unprofitable for its first week. A weak campaign can also look excellent because it starts many trials that never pay.
The fix is cohort maturity: compare users acquired in the same period after each cohort has reached the same age.
The short answer
For every campaign cohort, track:
- Acquisition date.
- Spend.
- Attributed installs.
- Trial starts and expected trial end dates.
- Paid conversions.
- Refunds and later subscription events.
- Attributed revenue at a fixed cohort age.
Then calculate:
ROAS = attributed revenue divided by campaign spend
The formula is simple. Choosing which revenue and which observation window belong in the numerator takes the real work.
Why same-day ROAS fails for free trials
Suppose a campaign spends $500 on Monday and starts 40 seven-day trials. It records no revenue that day.
The same-day ROAS is zero. That number is mathematically correct and operationally useless.
One week later, some trials convert. A month later, some subscriptions renew and others refund. The economic result changes even though Monday's spend stays fixed.
Free trials create a reporting delay:
| Cohort age | What you can reasonably know |
|---|---|
| Day 0 | Spend, clicks, installs, early activation |
| Trial period | Trial starts, cancellations, active trials |
| Trial end | Initial paid conversion begins to settle |
| Refund window | Early revenue quality becomes clearer |
| First renewal | Retention and repeat revenue appear |
Your exact windows depend on the products you sell. A three-day weekly trial and a fourteen-day annual trial should not share one maturity rule.
Start with the subscription products
List each trial and billing combination before building the report.
| Product | Trial | Billing period | First useful paid checkpoint |
|---|---|---|---|
| Monthly plan | 7 days | 1 month | Trial end plus payment processing time |
| Annual plan | 14 days | 1 year | Trial end plus payment processing time |
| Weekly plan | 3 days | 1 week | Trial end plus the chosen refund window |
| No-trial plan | None | Varies | Initial purchase |
Do not average these into one vague "conversion delay." Save the product or offering with the event so you know when each trial has matured.
RevenueCat webhook events include product, purchase, expiration, period, currency, and transaction context when available. Superwall webhooks similarly distinguish initial purchases, renewals, cancellations, expiration, billing issues, and product changes.
That lifecycle context lets the report move beyond a client-side "purchase button tapped" event.
Define three cohort states
Active
The user is still inside the trial window. They have not had a fair chance to convert.
Report active trials as a leading indicator, not revenue failure.
Mature
The trial end has passed and enough processing time has elapsed for the paid result to arrive.
This is the first point where trial-to-paid conversion can support a bid or budget decision.
Revenue-mature
The cohort has passed the business window you use for ROAS, such as day 30, day 60, or the first renewal.
This state supports payback and customer-quality decisions. It will always lag the acquisition dashboard.
Keep the labels visible in the report. A user should be able to see whether the number beside a campaign is early, mature, or revenue-mature without reading a methodology note.
Build the event chain
The report needs four connected sources:
| Source | Data |
|---|---|
| Ad platform | Spend, impressions, clicks, campaign context |
| Attribution layer | The campaign connected to the install |
| Product analytics | Activation, onboarding, and paywall behavior |
| Subscription source | Trial, purchase, renewal, refund, and revenue events |
The attribution identity is the join. If a RevenueCat or Superwall webhook cannot find the original install, the event may be valid but the campaign revenue remains unknown.
With Postback, the SDK creates a postbackId for the install. Your app saves that value as a RevenueCat subscriber attribute or Superwall user attribute. Later webhooks carry the identity back, which lets Postback attach the subscription event to the acquisition source.
Current setup instructions:
Choose the revenue definition
Teams can disagree about ROAS while using the same events because they count different revenue.
Write down the numerator:
- Customer price or estimated proceeds?
- Gross revenue or net of refunds?
- Initial purchase only or renewals too?
- Revenue in transaction currency or a normalized reporting currency?
- Event date or acquisition-cohort date?
There is no universal answer for every business question.
Initial-purchase ROAS is useful for fast campaign feedback. Proceeds after refunds are better for payback. Renewal-inclusive ROAS is better for customer quality, but slower.
Use separate columns rather than forcing one metric to do every job:
| Metric | Use |
|---|---|
| Initial revenue ROAS | Early paid conversion |
| Day-30 cohort ROAS | Comparable short-term payback |
| Renewal ROAS | Subscriber quality |
| Net revenue ROAS | Economics after refunds and adjustments |
Label each one clearly.
Calculate the supporting metrics
ROAS should not stand alone.
Cost per trial
Cost per trial = spend divided by attributed trial starts
This helps judge early intent while the cohort is active.
Mature trial conversion
Mature trial conversion = paid conversions divided by mature trials
Do not include active trials in the denominator. Doing so pushes the rate down whenever a campaign grows quickly.
Cost per paid subscriber
Cost per paid subscriber = spend divided by attributed paid subscriptions
Use spend and paid subscriptions from the same acquisition cohort and observation window.
Refund-adjusted revenue
Refund-adjusted revenue = recognized attributed revenue minus attributed refunds
Make sure the subscription provider's sign convention is understood. Some webhook sources represent a refund as a negative price or proceeds value.
Use a cohort table
A practical weekly table might look like this:
| Campaign cohort | Spend | Trials | Mature trials | Paid | Refunds | Day-30 revenue | Day-30 ROAS |
|---|---|---|---|---|---|---|---|
| Campaign A, week 1 | Known | Known | Fully mature | Known | Known | Complete | Comparable |
| Campaign A, week 2 | Known | Known | Partly mature | Early | Early | Partial | Provisional |
| Campaign B, week 1 | Known | Known | Fully mature | Known | Known | Complete | Comparable |
Do not put provisional and comparable ROAS in the same ranking without a maturity label. The freshest campaign will almost always be punished.
Make decisions in two passes
Early operating decisions
Use delivery, install, activation, and trial signals to catch obvious problems.
Pause or repair when:
- Tracking is broken.
- The campaign spends without attributed installs.
- Installs never reach activation.
- Trials are absent despite enough traffic.
- The campaign targets the wrong store, country, or product.
These are guardrails. They do not require a final revenue answer.
Mature budget decisions
Once trials mature, compare paid conversion, refund-adjusted revenue, and ROAS at the same cohort age.
Then decide whether to:
- Raise or lower bids.
- Move budget between campaigns.
- Change the audience or keyword.
- Match the product page more closely to the ad promise.
- Improve onboarding or the paywall.
- Wait for the first renewal before scaling further.
The Apple Search Ads subscription guide applies this logic to keyword-level intent. The TikTok attribution guide covers the store-first paid-social flow.
Read the funnel before changing spend
Two campaigns with the same ROAS can have different problems.
| Pattern | Likely constraint |
|---|---|
| Cheap installs, few trials | Traffic quality or onboarding |
| Many trials, weak paid conversion | Offer, trial quality, or pricing |
| Good paid conversion, weak ROAS | Acquisition cost or price |
| Good initial ROAS, heavy refunds | Customer expectation or product quality |
| Good first purchase, weak renewal | Retention or long-term fit |
The next action should follow the constraint. Lowering a bid will not fix a paywall promise. Rewriting onboarding will not fix irrelevant traffic.
Handle ongoing campaigns without going blind
You do not need to wait a month before making any change.
Use rolling cohorts:
- Review delivery and tracking daily.
- Review trial quality once each cohort reaches trial end.
- Review paid conversion on a fixed schedule.
- Review day-30 or renewal ROAS when those windows mature.
- Compare every campaign at the same age.
Keep a maximum exposure rule for new campaigns. You can cap spend while evidence matures without declaring the campaign permanently good or bad.
Avoid these reporting mistakes
Using event date instead of acquisition cohort
A renewal today may belong to a user acquired two months ago. Credit it to the acquisition cohort when measuring campaign payback.
Counting active trials as failed trials
An unfinished trial has no paid outcome yet. Keep it out of the mature conversion denominator.
Mixing products with different delays
A monthly plan with a seven-day trial reaches maturity sooner than an annual plan with a fourteen-day trial. Segment or normalize them.
Ignoring refunds
Gross purchase events can make a campaign look healthier than the realized revenue.
Backfilling attribution that never existed
Historical subscription events cannot reliably recover a campaign source that was never captured. Mark the date when the complete identity chain went live.
Comparing platform and attribution dashboards without definitions
Different windows, currencies, event dates, and claim rules create legitimate differences. Reconcile the definitions first.
How Postback reports the chain
Postback connects supported ad campaign context to the install, then attaches product and subscription events to that install.
For Apple Search Ads, the SDK captures AdServices attribution and the API connection adds spend and delivery metrics. For TikTok Signal Campaigns, the Signal link captures the click before the store redirect and selected downstream events can return through Events API.
RevenueCat or Superwall supplies the later subscription lifecycle. The joined report can show spend, installs, trials, paid subscriptions, revenue, and ROAS without treating an active trial as final revenue.
What to do next
Write down the trial length and first useful revenue checkpoint for every product. Then build one weekly cohort table with spend, attributed trials, mature trials, paid conversions, refunds, revenue, and ROAS at a fixed age.
Review Postback attribution pricing when maintaining that identity, cohort, and event pipeline internally starts taking more time than the campaign decisions it supports.
Sources
- RevenueCat webhook event types and fields - Current subscription events, transaction fields, identity fields, and trial-period context
- RevenueCat webhook guide - Current production, sandbox, authorization, and webhook behavior
- Superwall webhooks - Current purchase, renewal, refund, lifecycle, currency, and user-attribute fields
- Postback RevenueCat integration - Current postbackId and webhook setup
- Postback Superwall integration - Current postbackId and signed webhook setup
FAQ
Track provisional ROAS while the trial is active, but make paid-conversion decisions only after the relevant cohort has passed the trial end and processing window. Compare campaigns at the same cohort age.
No. Keep active trials separate from mature trials. Including unfinished trials in the denominator makes fast-growing campaigns look artificially weak.
Include renewals when the question is long-term campaign payback or subscriber quality. Keep an initial-purchase ROAS column as well so the slower renewal metric does not replace every early operating signal.
Subtract attributed refunds when you report realized or net revenue. Keep the exact revenue definition visible because subscription platforms can expose price, proceeds, and refund values differently.
They provide subscription revenue and lifecycle events. Campaign ROAS also needs acquisition attribution and ad spend joined to those events under a consistent identity and observation window.
You might also like
See all posts →
Do You Need an MMP for Apple Search Ads?
Learn what Apple Search Ads attribution gives you, what a DIY setup requires, and when an MMP is worth adding for subscription ROAS.

RevenueCat Attribution: What It Tracks and When You Need an MMP
Learn what RevenueCat knows about subscriptions, where campaign attribution comes from, and when an app needs an MMP beside RevenueCat.

TikTok App Attribution for Subscription Apps
Connect a TikTok click to an app install, trial, subscription, and revenue using a store-first campaign and server-side event feedback.