Skip to main content
A churn intervention turns a leaving moment into a save. The user has decided your subscription no longer clears the bar (they declined your paywall, or they’re walking through your cancel flow), and instead of letting them go your app presents a premium brand offer: a real perk a brand funds to acquire customers. Because the offer offsets the user’s subscription cost, and the brand pays for it rather than you, staying subscribed suddenly costs the user less than leaving. This page is the canonical description of the use case; the integration walkthroughs are the SDK quickstarts in Integration surfaces.

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.
This is the recommended starting point for a new integration: get this one moment working, measure, then expand to the cancel flow.

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.
Never block the cancel flow. When the user dismisses the offer, your own fallback path must let the cancellation proceed: branch on result.claim == null && result.publisher != PublisherOutcome.Purchased at the call site.

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 to churn-intervention, which is exactly what every Encore integration does today, so existing code is unaffected and no call site needs changing:
If you do name it, note that the case name and the wire value are deliberately unrelated. The SDK case names what the use case does (.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 the paywallUplift 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.