A paywall converts when it shows one clear offer, plans with a plain price and billing period, and appears after the user has seen value. You can check any design with four paywall events: shown, plan selected and purchased form the funnel, and dismissed is the fourth.
What a paywall layout needs
- A benefit headline tied to what the app does, not to the subscription.
- Two or three plan cards. More choices slow the decision.
- The price per period and the billing period on every card.
- One preselected plan, so the default action is obvious.
- One primary button whose label says what happens next.
- A visible close or dismiss control.
- Restore purchases and terms links at the bottom.
Measure a paywall with four events
ActivationPal turns four SDK calls into paywall events. Fire them from the paywall screen:
// When the paywall appears. The string names where it appeared.
ActivationPal.paywallShown("onboarding")
// When the user taps a plan.
ActivationPal.paywallPlanSelected("yearly")
// When the store confirms the purchase.
ActivationPal.paywallPurchased("yearly")
// When the user closes the paywall without buying.
ActivationPal.paywallDismissed()
The Android, Flutter and React Native SDKs have the same four calls. The quickstart covers setup and the events reference lists every name.
The ActivationPal dashboard counts shown, selected and purchased as unique devices from the install cohort, shows a per-plan split under selected and purchased, and puts the change from the previous period beside the Paywall headline.
Read three rates in order:
| Rate | What it tells you | What usually moves it |
|---|
| Shown to selected | Whether the screen earns a tap on a plan | Headline, plan cards, how the offer reads |
| Selected to purchased | Whether the price and terms hold up at checkout | Price, trial terms, store confirmation friction |
| Shown to purchased | The overall result of the design | Everything above, plus who sees the paywall |
Plan display: how many plans and which one to highlight
Weekly, monthly and annual cards cover most apps. Show the price per period on each card. Show an annual price as a monthly equivalent only when it matches the store price the user will be charged.
Judge the layout by the per-plan split. A plan that is selected often but bought rarely points at the price or the trial terms shown at confirmation, not at the card design.
Use stable lowercase plan ids such as monthly and yearly, and never rename them. The split groups on the exact string, so a renamed plan starts a new row and breaks the before and after comparison.
Trial wording on the paywall
State the trial length, the first charge date and the amount in the button or the line under it. A charge the user did not expect is the usual reason a trial ends in a cancellation.
Judge a wording change on selected to purchased first. Then check whether those trials turn into paying subscribers: trial conversion rate shows how to measure that without counting trials as revenue. RevenueCat reports a trial start as rc_initial_purchase with period_type TRIAL, and a conversion as rc_renewal with is_trial_conversion true.
If your app fires paywallPurchased at trial start, a trial counts as a purchase in the funnel. Keep that in mind when you compare a trial paywall with a pay-now one.
Paywall placement: onboarding, feature gate or settings
Each placement has a different job, and you name it with the string you pass to paywallShown.
onboarding: shown after the value demo, to every new user. Fix the steps before it first with onboarding completion rate and the first-run flow guide.
feature_gate: shown when the user taps a premium feature. The intent is clear, so the headline can name that feature.
settings: shown to returning users who open the upgrade option themselves.
Compare shown, selected and purchased before and after a redesign
- Pick two windows of the same length. The range switcher offers last 7, 14 or 30 days, this week, this month and a custom range.
- Use the install cohort funnel, not raw event counts.
- Change one thing per release. A new headline and a new price together cannot be separated afterwards.
- Compare install cohorts. The Cohorts view has a Paywall conversion metric, so you can line up users who installed before and after the release.
- Tell the builds apart. Every event carries
app_version, which marks which build produced it.
Plan selected and purchased do not carry the placement. Change one placement per release, then read the change in the Paywall headline.
When a rate looks wrong, replay a single user's events with user journey analysis. For the revenue side of the same funnel, see subscription analytics.