For the complete documentation index, see llms.txt. This page is also available as Markdown.

Feature-wall contextual paywall

Show a paywall tailored to the specific Pro feature the user just tried to use, instead of a generic one.

Use this when your product has several distinct Pro features and users try different ones; a single headline paywall underserves all of them. Don't use this when there is only one Pro feature worth selling; the generic paywall already talks about it.

Goal

A generic "Upgrade to Pro" paywall has to speak to everyone, so it speaks to nobody. The user who just tapped "Export to PDF" is not shopping for the abstract idea of premium — they want to export a PDF right now. This recipe intercepts the feature tap, fires a paywall whose hero section is about that exact feature, and preserves the user's intent to complete the export on conversion.

Setup

The recommended primary shape is a single campaign that handles every gated feature and lets the app pick the matching paywall screen locally. It keeps the dashboard small even when you ship more Pro features. (See Variants for a per-feature alternative.)

In the dashboard

  • Create one campaign feature-wall.

  • Trigger: event FeatureGateTriggered. No property filter on feature — you will branch in the app.

  • Conditions: subscription_status = "free".

  • Action: fire yourapp://paywall/feature-wall?feature={{feature}}. The app reads the feature query parameter and chooses the right paywall screen.

  • Frequency: unlimited — the user keeps hitting features; keep offering the relevant paywall.

  • On conversion, resume the blocked action (see engineering hand-off).

In the app (engineering hand-off)

  • On a Pro feature tap, track the gate event with a feature property instead of showing a generic paywall:

  • Register a single deeplink handler for yourapp://paywall/feature-wall. Read the feature query parameter and route to the matching paywall screen locally.

  • Ship each contextual paywall screen in the build before the campaign goes live. The deeplink cannot introduce new screens.

  • When the user converts, resume the feature action the user originally tapped. Do not dump them back on the home screen.

How it runs

  1. Free user taps "Export to PDF" on a report screen.

  2. App fires FeatureGateTriggered { feature: "pdf_export", source_screen: "report_detail" }.

  3. Amply evaluates event-triggered campaigns. feature-wall matches.

  4. Amply fires yourapp://paywall/feature-wall?feature=pdf_export. The app reads feature=pdf_export and opens the PDF-export paywall screen with its own hero and preview.

  5. User taps subscribe, completes purchase, subscription_status becomes "pro".

  6. App returns the user to the report screen and completes the export automatically.

  7. A different free user taps "Offline mode." Same flow — feature-wall matches again, the deeplink carries feature=offline_mode, and the app opens the offline-mode paywall screen instead.

Variants

If you need to target or schedule paywalls per feature independently — for example, running a limited-time discount only on the export-to-PDF paywall — use one campaign per feature:

  • feature-wall-pdf-export, feature-wall-offline-mode, feature-wall-custom-themes.

  • Each campaign triggers on FeatureGateTriggered with a feature = "pdf_export" property filter and fires its own deeplink (yourapp://paywall/pdf-export, etc.).

  • Each contextual paywall can be activated, cancelled, or re-audienced independently.

This scales poorly as the Pro feature set grows — prefer the single-campaign variant unless you need per-feature control.

Metrics to watch

  • Conversion rate per feature gate. Compare to the generic paywall baseline — expect significant lift on the features users actually reach for.

  • Gate-to-convert time. Contextual paywalls usually convert faster because the intent is already there.

  • Top-converting features. This data tells you which Pro features to invest more in.

  • Post-purchase action completion. If most converters never actually export a PDF after subscribing, the intent-preservation path is broken.

Last updated