Pushlane: Win-Back Push for Subscription Apps
Build a restrained win-back push campaign for expired subscribers, with correct RevenueCat triggers, useful copy, stop rules and honest measurement.
A win-back push is for someone whose subscription has ended, not every subscriber who turned off auto-renew. That boundary is the difference between a relevant invitation and a premature discount shown to someone who still has paid access.
RevenueCat makes the lifecycle state observable. Pushlane makes the resulting iOS push flow executable. The strategy is still yours: choose who should hear from you, offer a credible reason to return, and stop when the person's state changes.
This guide focuses on that decision. It gives you a practical flow, copy patterns and an evaluation plan without assuming a universal discount or inventing a reactivation benchmark.
Start on expiration, not cancellation
RevenueCat defines CANCELLATION as a subscription being cancelled or refunded. In the ordinary auto-renew-off case, the subscriber can retain access until the current period ends. EXPIRATION means the subscription has expired and access should be removed. RevenueCat's official event reference documents both states, and its common webhook flows shows cancellation followed later by expiration.
Use the Pushlane event revenuecat.expiration as the entry for a true lapsed-subscriber campaign. Keep a cancellation flow separate. A cancellation message can acknowledge remaining access or ask for feedback. A win-back message can truthfully say that premium access has ended and offer a path back.
There are exceptions. Refunds, billing errors and developer-initiated changes can also lead to expiration. Pushlane currently projects common event fields such as product, store, environment, period type, entitlement IDs and timestamps into flow properties, but it does not expose RevenueCat's expiration_reason as a branch property. Do not pretend you can filter on a field that is not available.
If reason-specific eligibility is essential, validate it in your own server-side webhook logic and emit a separate, narrowly named event into Pushlane. Otherwise, keep the message cause-neutral and avoid blaming the subscriber.
Define the eligible audience before the offer
"Expired" is a state, not a complete audience. Add only conditions that change the usefulness of the message.
- Prior value: the person completed a meaningful product action while subscribed.
- Reachability: an active iOS device is registered and notification consent still applies.
- Product availability: the plan or feature being promoted still exists.
- Recent contact: the person has not already received another high-priority lifecycle push.
- Support state: exclude accounts in a refund, fraud or unresolved support process when you can identify them reliably.
Do not require a notification open as proof of interest. Lock-screen copy can be read without a tap. Do not infer financial intent from a failed charge. That belongs in the billing recovery path, covered in RevenueCat billing issue push notifications.
For a first version, one expiration event, one supported device check and one frequency guard are enough. Add segmentation only after you can explain what action changes for each branch.
Build a three-state flow
A simple Pushlane win-back flow can use three states rather than a calendar of repeated offers:
revenuecat.expiration
-> branch: production event, eligible iOS user
-> wait: product-appropriate cooling-off period
-> send: value reminder with a direct return path
-> wait: only if a second message has a different job
-> stop on revenuecat.renewal or revenuecat.initial_purchase
-> optional send: new value or plan choice
-> exit
The cooling-off period is not a universal number. A daily fitness habit, a monthly budgeting workflow and an annual reference tool have different natural return moments. Look at when formerly active subscribers normally revisit the product, then choose a delay that meets that behavior. Document the rationale before viewing campaign results.
Use is_production to prevent RevenueCat sandbox events from entering a customer-facing path. RevenueCat retries webhooks and can deliver duplicates; Pushlane deduplicates connected RevenueCat events by event ID, but your sequence should also avoid overlapping win-back journeys for the same lapse.
The exit matters more than the second push. RevenueCat can represent a resubscription with RENEWAL or INITIAL_PURCHASE depending on store and timing. Its current webhook flow guide notes those variations. Stop the campaign when either verified paid state arrives. Never send an offer after access has already returned.
Give each message one job
The first push should reconnect the person with a value they already understand. It does not need to announce a discount.
Your saved plan is still here
Restart Premium to continue the program you built.
This works only if the plan is genuinely preserved and the deep link can open the relevant screen. A generic "We miss you" asks the recipient to do emotional work for the brand without telling them what they regain.
If you have a legitimate product improvement, the second message can introduce it:
A faster way to review your week
Premium now includes the summary you asked for. See what changed before you decide.
Do not imply the feature was built for that individual unless you know it was. Do not use false scarcity. If an offer has a real end date, state it accurately and ensure the destination displays the same terms.
A discount message needs extra care:
Come back on the annual plan
Review the current offer and renewal terms before restarting Premium.
The notification is not the place to hide conditions. The deep-linked screen should show price, billing period, renewal behavior, eligibility and cancellation path. RevenueCat now offers its own web win-back campaigns in beta, which use expiration as the trigger and a web purchase link as the destination. Its win-back documentation is useful context even if you choose a push-native path.
Make the return destination state-aware
A win-back push can fail despite good copy when the tap lands on a generic home screen. Choose the destination based on what you promised:
- open the saved plan when the promise is continuity;
- open a clear feature preview when the promise is new value;
- open the correct store management or purchase experience when the action is resubscription;
- open support when an account problem must be resolved first.
RevenueCat warns that a user can manage a subscription only on the platform where it was purchased. Its customer identity guidance also explains why a stable App User ID matters across devices. Test the path for the actual store, entitlement and identity state rather than assuming one purchase screen fits every subscriber.
Pushlane delivery is currently proven end to end for iOS through APNs. Android FCM tokens can be registered, but Android delivery is not live. Keep the campaign scoped to reachable iOS users until that boundary changes.
Test the journey, including silence
Before activation, run the flow with distinct sandbox users and verify:
- A cancellation without expiration does not enter the win-back flow.
- An expiration enters once and uses cause-neutral language.
- A sandbox event is suppressed from the production branch.
- A renewal during the first wait cancels every pending push.
- A resubscription represented as an initial purchase also cancels the sequence.
- A person without an active APNs device is logged as suppressed, not sent.
- Every deep link works from a terminated app and a logged-out state.
- A user already contacted by another lifecycle flow respects your frequency rule.
Silence is a valid outcome. Someone who deliberately left does not owe the app another session. Cap the sequence and let the person remain lapsed.
Measure incremental return, not taps alone
The business outcome is restored paid access within a predefined window. Track sends and taps to diagnose the path, but do not report them as win-back success.
Useful measures include:
- eligible expired subscribers;
- sends, suppressions and notification interactions;
- verified resubscriptions after entry;
- time from expiration to resubscription;
- offer views and completed purchases by destination;
- notification opt-outs and support contacts;
- renewed access that happened without a push tap.
A resubscription after a push is not automatically caused by the push. People return on their own, stores retry transactions, and other product activity can intervene. When volume supports it, assign an eligible holdout before the first send and compare verified paid return within the same observation window. Keep assignment stable across the whole sequence.
For mechanics around variants and guardrails, use Pushlane A/B testing for subscription apps. Test one meaningful difference at a time, such as value reminder versus offer, not five simultaneous copy changes.
Win back trust before revenue
A useful campaign respects the state the subscriber is actually in. It waits for expiration, reaches only a relevant and contactable person, promises something the destination can deliver, and exits the moment paid access returns.
Build the first version with one message and a strong stop rule. If that message does not help people return, adding urgency will not fix the underlying value or destination. Pushlane supplies the event-driven control; the campaign earns its place by staying true at every step.