The paywall decline
The highest-intent moment. The user has seen your paywall, knows your pricing, and is about to leave without purchasing. They’ve already shown purchase intent by getting this far, so an offer that changes the math feels like a personalized win rather than an interruption. Present it as the last screen between them and the exit, triggered when the user:- Taps “X” or swipes to dismiss the paywall.
- Taps “Not now” or “Maybe later”.
- Navigates back from a pricing screen.
The cancel flow
The user is an existing subscriber actively trying to cancel. They’ve already paid before, so the willingness to stay is high if the math changes before the cancellation completes. Trigger the offer when the user:- Taps a cancel or unsubscribe button in your settings.
- Opens subscription management with cancel intent.
- Is about to be redirected to the store’s subscription-management page.
The mechanic
The save is a premium brand offer, paid for by the brand, never by you. A brand funds the perk (a free trial, a discount) as its cost of acquiring a customer; your app supplies the moment and the audience. This use case is SDK-led: your code detects the moment and calls the SDK, Encore renders the offer sheet, and your existing subscription plumbing (native StoreKit or Play Billing, or your subscription manager) completes any subscription purchase the offer leads to. On iOS you can pair the moment with an App Store promotional offer so the save also carries a discounted or free period; see Create a Promotional Offer.Nothing to set in the SDK
This use case is the SDK default. A placement that does not name a use case resolves tochurn-intervention, which is exactly what every Encore integration does today, so existing code is unaffected and no call site needs changing:
.reduceChurn on iOS, UseCase.REDUCE_CHURN on Android, EncoreUseCase.reduceChurn on Flutter), while the value Encore sends and stores is the hyphenated churn-intervention, naming the surface it resolves. Keeping them independent is what stops a rename changing the wire: churn-intervention is a frozen sdui_use_case label the backend rejects anything else for. React Native’s UseCase type is the string union itself, so there you write 'churn-intervention' directly. The same split applies to the other use case; see Reward Users.
To override the screen’s copy, .headline() and .subheadline() on the placement builder replace the paywall headline and subheadline, and they take priority over whatever is configured in your dashboard. The resolution order is the same for both use cases and is spelled out under where the copy comes from.
The economics
Revenue from this use case lands in thepaywallUplift metric: subscription revenue recovered from users who were about to leave. Two rules govern how it’s counted:
- The lift is measured, never assumed. Encore compares exposed users against a holdout, so the subscription ARPU lift you see is incremental, not correlation.
- The value compounds. A saved subscriber keeps renewing, so each save pays out over the subscriber’s remaining lifetime rather than once.
Integration surfaces
React Native and Flutter apps use the bridge SDKs over the same native trees: start from the React Native quickstart or the Flutter quickstart.
The SDK is the lead surface for this use case: the moments live inside your app’s paywall and settings flows, and rendering the offer plus driving the subscription purchase is exactly what the SDK manages for you.
Related
- Enable a Use Case: dashboard setup for this use case (already on by default for most apps; see the page for when that changes).
- Create a Promotional Offer: pair the save with a discounted or free period on iOS.
- Reduce Churn at the Paywall: the Web SDK flow end to end.
- Integration Patterns: how to wire offer results into your paywall and cancel flows on iOS.
- Reward Users: the other use case, for celebrating a win rather than saving a leaver.