← All posts
Subscription attribution9 min read

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.

Postback attribution dashboard illustration for measuring app campaign ROAS after a free trial

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:

  1. Acquisition date.
  2. Spend.
  3. Attributed installs.
  4. Trial starts and expected trial end dates.
  5. Paid conversions.
  6. Refunds and later subscription events.
  7. 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 ageWhat you can reasonably know
Day 0Spend, clicks, installs, early activation
Trial periodTrial starts, cancellations, active trials
Trial endInitial paid conversion begins to settle
Refund windowEarly revenue quality becomes clearer
First renewalRetention 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.

ProductTrialBilling periodFirst useful paid checkpoint
Monthly plan7 days1 monthTrial end plus payment processing time
Annual plan14 days1 yearTrial end plus payment processing time
Weekly plan3 days1 weekTrial end plus the chosen refund window
No-trial planNoneVariesInitial 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:

SourceData
Ad platformSpend, impressions, clicks, campaign context
Attribution layerThe campaign connected to the install
Product analyticsActivation, onboarding, and paywall behavior
Subscription sourceTrial, 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:

MetricUse
Initial revenue ROASEarly paid conversion
Day-30 cohort ROASComparable short-term payback
Renewal ROASSubscriber quality
Net revenue ROASEconomics 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 cohortSpendTrialsMature trialsPaidRefundsDay-30 revenueDay-30 ROAS
Campaign A, week 1KnownKnownFully matureKnownKnownCompleteComparable
Campaign A, week 2KnownKnownPartly matureEarlyEarlyPartialProvisional
Campaign B, week 1KnownKnownFully matureKnownKnownCompleteComparable

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.

PatternLikely constraint
Cheap installs, few trialsTraffic quality or onboarding
Many trials, weak paid conversionOffer, trial quality, or pricing
Good paid conversion, weak ROASAcquisition cost or price
Good initial ROAS, heavy refundsCustomer expectation or product quality
Good first purchase, weak renewalRetention 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:

  1. Review delivery and tracking daily.
  2. Review trial quality once each cohort reaches trial end.
  3. Review paid conversion on a fixed schedule.
  4. Review day-30 or renewal ROAS when those windows mature.
  5. 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

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 →