Push Notifications for Subscription Apps: The Complete Lifecycle Playbook
A full lifecycle playbook for push notifications in subscription apps: opt in timing, trial nurture, billing recovery, cancellation saves and win backs.
Subscription apps do not win on installs. They win on a chain of small conversions: permission granted, first value moment reached, trial started, trial converted, renewal survived, billing failure recovered, cancellation reversed. Push notifications are the one channel that can reach a user at each of those moments, on the device where the subscription actually lives. This playbook walks the whole chain, stage by stage: the goal, the trigger, the timing, and one copy principle that holds up in practice.
Why subscription apps need lifecycle push, not blasts
A blast campaign asks "who can we message today?" A lifecycle flow asks "what just happened to this user, and what is the one message that helps right now?" For a subscription app the second question is the only one that matters, because subscription revenue events are individual, not scheduled.
Trials expire on a per-user clock. Billing failures happen whenever a card does. Cancellation is one user's decision on one afternoon. A Tuesday 10am blast is always early for some users and late for the rest, and the ones it is late for are the ones who already churned.
Lifecycle push means every message is triggered by a real event in that user's subscription state. In Pushlane you build these as flows in a visual flow builder (see /docs/building-flows): the entry point is an event, and the delays, branches and messages hang off it. If you want the deeper pattern catalog for each flow shape, read subscription push notification flows. What follows is the map of which flows to build and why.
Stage 1: Permission and opt-in timing
Goal: earn notification permission from as many users as possible without burning the prompt.
On iOS you get one system prompt per install. If the user taps "Don't Allow", your app cannot ask again; the user would have to dig into Settings themselves. Apple's own guidance is to ask in context, when the user understands what notifications will do for them. Firing the system prompt on first launch, before the user has seen any value, is how apps end up with a permanently unreachable install base.
The pattern that works: let the user do the thing that makes notifications obviously useful, then show your own pre-permission screen ("Want a heads-up before your trial ends?"), and only trigger the system prompt after they agree on your screen. If they decline your screen, you have lost nothing: the one-shot system prompt is still intact for a better moment later.
Android 13 and up has a runtime notification permission too (POST_NOTIFICATIONS), so the same choreography applies there.
Timing: after the first value moment, not at first launch. Copy principle: the pre-permission screen should promise one specific benefit tied to the subscription ("we'll tell you before you're charged"), never "stay up to date".
Stage 2: Onboarding and activation
Goal: get the new user to the moment where the app becomes worth paying for.
Trigger: your own activation events. Pick the two or three actions that define "this user got it" (first workout logged, first scan completed, first project created), track them as events (/docs/events), and send only to users who have not fired them. Pushlane audience segments (/docs/audiences) let you scope a flow to exactly that slice: installed yesterday, key action still missing.
Timing: one nudge inside the first day or two if the key action has not happened. One is usually enough. An unactivated user who ignores two pushes is telling you something, and a third push mostly teaches them where the opt-out switch is.
Copy principle: name the action, not the app. "Your first scan takes 30 seconds" beats "Come check out everything we offer!"
Stage 3: Trial nurture
Goal: stack enough value moments during the trial that paying feels like the obvious next step.
Trigger: trial started. With Pushlane's RevenueCat integration this arrives as a webhook event and is matched to the device through the shared app user id, so there is no purchase-tracking code to write in your client at all. Setup lives at /docs/revenuecat, and the full walkthrough is in RevenueCat push notification integration.
A trial nurture flow is a short sequence: a welcome on day zero, a feature-depth push a couple of days in, a concrete use case mid-trial, each step gated on what the user has and has not done yet. The complete sequence, with example copy for every step, is in the trial-to-paid push notification sequence.
Timing: front-load value in the first half of the trial. The second half belongs to the expiry sequence below, and mixing the two muddles both.
Copy principle: sell the outcome the trial has already delivered ("You've tracked 5 meals this week. Keep the streak.") rather than features the user has never touched.
Stage 4: Trial expiry
Goal: make sure no trial ends silently.
Trigger: computed from trial start plus trial length for the pre-expiry messages, and the expiration event itself for the post-expiry message.
Two pushes carry most of this stage. One lands a day or two before expiry: "Your trial ends Thursday. Subscribe now and you keep your history and offline access." One lands at expiry itself. Being upfront about the upcoming charge is not just decent behavior; surprise charges are where refund requests and one-star reviews come from. The dedicated playbook for this stage is trial expiry push notifications.
Copy principle: state the date and the price plainly. Vague urgency reads as a dark pattern. A plain "Your trial ends tomorrow" reads as a service, and it converts the users you actually get to keep.
Stage 5: The conversion moment
Goal: confirm the purchase and reinforce the decision.
Trigger: trial converted, or initial purchase for apps that sell without a trial. Both come straight off the RevenueCat webhook.
One thank-you push closes the loop: confirm what the user now has, then point at the single most valuable feature they have unlocked but not used. This is also the moment to make every sales-flavored flow stop for this user. Pushlane flows can branch on subscription state, so a paying user simply exits the nurture path instead of getting a "subscribe now" push about a thing they already bought.
Copy principle: no upsell in the confirmation. "You're in. Offline mode and unlimited history are now yours." is the entire job.
Stage 6: Renewals
Goal: keep renewals uneventful.
For monthly plans, silence is usually the right move: a renewal that goes through needs no push at all. For annual plans, a reminder a few days before the renewal date is worth testing. It will cost you some renewals from people who forgot they subscribed, and it will save you the refunds, chargebacks and support tickets from those same people. Whether it nets out positive depends on your price and your audience: measure it in your app.
Trigger: renewal date minus a few days, derived from the subscription record. Copy principle: neutral and factual. Date, amount, and a link to manage the subscription. This is the one push in the lifecycle that should read like a receipt.
Stage 7: Billing failure recovery
Goal: recover involuntary churn, the cheapest churn to fight because the user never decided to leave.
Trigger: the billing issue event from RevenueCat. When a renewal charge fails, the store retries during a grace period, but the user usually has no idea anything went wrong. Their card expired, they got a new phone, the bank flagged the charge.
A push is the fastest route to the fix: "There's a payment issue with your subscription. Update your payment method to keep your access." Deep link as close to the platform's payment settings as the OS allows. Send one push immediately, and one reminder before the grace period runs out if the issue is still open.
Copy principle: no shame, no drama. A failed card is weather, not a betrayal. Write it like you are helping, because you are.
Stage 8: Cancellation save
Goal: reach the user in the window between "turned off auto-renew" and "access actually ends".
Trigger: the cancellation event. RevenueCat fires it when auto-renew is switched off, which is typically well before the expiration date. That gap is your save window, and push is the only channel that reliably reaches it on device.
Wait a beat before sending: a day, not a minute. An instant reaction to a cancellation feels like surveillance. Then send one honest message: acknowledge the cancellation, remind them what they lose and when, and offer a path back. If you have a cheaper plan or a pause option, this is where it earns its keep.
Copy principle: acknowledge the cancellation explicitly. A cheery "We miss you!" sent to someone who still has active access reads as either creepy or broken. "Your subscription ends June 30. Your data stays safe if you come back." reads as honest.
Stage 9: Win-back for lapsed subscribers
Goal: bring back users whose access has fully ended.
Trigger: the expiration event, followed by delays: one message shortly after access ends, then a small number of touches spaced out over the following weeks.
This is the stage where consent discipline matters most. A lapsed subscriber who kept your app installed and never opted out of notifications is giving you a real signal, but it decays. Cap the sequence and then stop for good. Pushlane's sending is consent-aware by default: opt-outs are honored automatically, so a user who disabled notifications never receives your win-back sequence no matter what the flow says.
Copy principle: lead with what changed since they left. "New: offline maps for your whole region" gives a lapsed user a fresh reason. "We miss you" gives them nothing they did not already decline.
Wiring it up: RevenueCat events in, push flows out
Every stage above hangs off subscription state, which is why Pushlane treats RevenueCat webhooks as first-class flow triggers. Trial started, trial converted, billing issue, cancellation and expiration all arrive server-side and are matched to the right device through the shared app user id. You write zero client-side purchase code: identify the user with the same id in both SDKs and the events line up on their own.
The client side is one lightweight integration for the push token and your activation events: iOS installs via Swift Package Manager (/docs/ios-quickstart), and Expo, React Native, Flutter and Android use zero-dependency drop-in clients, one pasted file with no package to install (/docs/expo-quickstart). If a coding agent is doing your setup, there is an agent-driven install path over MCP (/docs/mcp).
One honesty note, because delivery claims deserve precision: iOS delivery through APNs is proven end to end in production. On Android, the SDK registers FCM tokens, but we do not claim end-to-end Android delivery today.
Test the stages, not the whole funnel
Every stage has copy and timing choices baked in, and your first version of each is a guess. Treat the guesses as hypotheses: Pushlane supports A/B testing inside flows, so you can split the trial expiry message or the cancellation save copy without duplicating the whole flow. The methodology, including what is actually worth testing first, is in push notification A/B testing for subscription apps.
To avoid starting from a blank canvas, flow templates and notification templates (/docs/flow-templates) cover the stages in this playbook, and AI-generated push copy gives you variants to test instead of a single hunch.
Start with one flow, not nine
You do not need all nine stages on day one. Start where the money is most concentrated: trial expiry and billing failure recovery are usually the highest-leverage flows per hour of setup, because both catch revenue that was already in motion. Add nurture, cancellation save and win-back once the first two are live.
Pushlane has a free tier, so you can wire up RevenueCat, build your first flow in the visual builder, and see real subscription events triggering real pushes before paying anything. Start at https://pushlane.io.