ActivationPal

Paywall design: layout, plans and placement

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:

RateWhat it tells youWhat usually moves it
Shown to selectedWhether the screen earns a tap on a planHeadline, plan cards, how the offer reads
Selected to purchasedWhether the price and terms hold up at checkoutPrice, trial terms, store confirmation friction
Shown to purchasedThe overall result of the designEverything 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

  1. 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.
  2. Use the install cohort funnel, not raw event counts.
  3. Change one thing per release. A new headline and a new price together cannot be separated afterwards.
  4. Compare install cohorts. The Cohorts view has a Paywall conversion metric, so you can line up users who installed before and after the release.
  5. 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.

Frequently asked questions

What is a good paywall conversion rate?

It depends on the app, the price and where the traffic comes from, so no single number fits. Compare your own rate before and after each change, over windows of the same length.

Where should the paywall go in a mobile app?

Put it where the user has just seen value. Many apps show one after the onboarding demo and another when the user taps a premium feature. Name each placement in paywallShown and change one per release.

How many plans should a paywall show?

Two or three. Each extra card adds a decision, and the per-plan split shows whether a plan is selected but not bought. Preselect one so the default action is clear.

How do I track paywall conversion in my app?

Call paywallShown, paywallPlanSelected and paywallPurchased from the paywall screen. The dashboard builds the funnel and the Paywall headline from them. The quickstart has the setup for each SDK.