subscription-push-lifecycle

Free-Trial Expiry Push Notifications: When to Send and What to Say

Exactly when to send trial expiry push notifications: 24 hours before, on expiry day, and just after, with verbatim copy examples and RevenueCat triggers.

Every free trial ends, and how you handle the final 48 hours decides whether a trial user converts deliberately, drifts away quietly, or gets surprised by a charge and files a refund request. Push is the one channel that can reach a trial user who has stopped opening your app, which makes the expiry sequence some of the highest-leverage messaging a subscription app ever ships.

This is a narrow guide to that one moment. It covers the three pushes worth sending (24 hours before expiry, on expiry day, and just after expiry), what each one is for, copy you can adapt verbatim, what to do about the users you cannot reach by push, how to trigger it all off RevenueCat trial events in Pushlane, and how to measure the result without fooling yourself.

For the full trial window from day zero onward, read the trial-to-paid push notification sequence guide. This article stays on the cliff edge itself.

The three pushes and what each one is for

You do not need seven touchpoints crammed into two days. You need three pushes, each with one distinct job. Send more than one per moment and you are noise. Skip a moment and you leave a specific failure mode uncovered.

24 hours before expiry: the honest warning

The user agreed to a trial days ago and has probably forgotten the exact end date. This push does two things, in this order: it removes the surprise from the upcoming charge, and it makes the case for staying.

That order matters. A user who cancels after a clear warning is a refund request you avoided and a review you did not take. A user who subscribes after a clear warning chose you on purpose, which is a far better start to the relationship than a charge they did not see coming.

Lead with what they lose access to, name the price, and name the time. Some copy to adapt:

Title: Your free trial ends tomorrow Body: After tomorrow you lose access to your 14 saved routines and your progress charts. Keep them for $6.99/month, cancel anytime.

Title: 24 hours left on your trial Body: Your streak, your notes, and your history stay unlocked if you subscribe: $39.99/year, and that is the full price. Not for you? Cancel in Settings in two taps.

Title: Heads up: your trial ends Thursday at 5 PM Body: We charge $4.99/month after that. Keep everything you built this week, or drop to the free plan with read-only access.

Swap the nouns for whatever your users actually make in your app: routines, entries, decks, projects, streaks. The concrete noun is the whole trick.

Expiry day: the decision push

This is the real deadline, so urgency is legitimate here and nowhere else. Send it a few hours before the cutoff, while the user is likely awake and able to act, not at midnight when the entitlement flips. Deep link straight to your paywall or subscription screen so the tap lands one step from the decision.

Title: Last day: your trial ends tonight Body: Subscribe now and your 21 day streak keeps counting. $4.99/month, cancel whenever you want.

Title: Your trial ends at 6 PM today Body: Everything you logged this week stays unlocked for $59.99/year. That is the whole deal, no hidden tiers.

Title: Today is the day Body: Your trial wraps up tonight. Keep full access for $6.99/month, or stay on free and your data stays safe.

Just expired: the save

Some users do not reject your app, they just drift. The trial lapses out of inattention, not decision. The just-expired push exists for them, and its tone is completely different: the door is open, nothing was lost, come back whenever.

Do not manufacture urgency here. The deadline already passed, so a countdown would be a lie. What you have instead is reassurance: their data survived.

Title: Your trial ended, your data did not Body: All 34 journal entries are saved and waiting. Resubscribe anytime and pick up exactly where you left off.

Title: Trial over. Progress saved. Body: We froze your streak at day 19. Unlock it again for $4.99/month whenever you are ready.

Title: Still here when you are Body: Your workout history is intact on the free plan. Pro is $6.99/month if you want the full toolkit back.

What to say: three rules for the copy

Lead with what the user loses access to

"Unlock premium features" is abstract and belongs to you. "Your 14 routines" is concrete and belongs to them. The expiry moment is about their data, their streak, their progress, so the copy should point at the thing they made, not at your feature list.

If your event data lets you fill in real counts, do it. If it does not, name the category of thing they created and keep it specific: "your saved workouts" beats "your content".

Urgency without dark patterns

The deadline is real, so state it plainly and let it do the work. What you do not need:

  • Fake countdowns or "offer expires" language on an offer that does not expire.
  • Hiding the cancel path. Mentioning it, as in the examples above, signals confidence and costs you nothing but the users who were leaving anyway.
  • Guilt copy. "We'll be sad to see you go" converts nobody and reads as manipulation.

A real deadline stated honestly is more persuasive than a manufactured one, because users have seen the manufactured kind a thousand times.

Price transparency

Put the price in the push. Two reasons. First, trust: a user who taps through already knowing the number never feels ambushed at the paywall. Second, qualification: the taps you get are from people who saw the price and came anyway, which is exactly who you want on the paywall. Hiding the price does not make it smaller.

The user you cannot reach: opted out is a real state

Push permission is opt-in on iOS (see Apple's documentation on asking permission to use notifications), and since Android 13 it is a runtime permission there too (see the notification runtime permission docs). Some of your trial users said no, and no platform will let you reach them by push at expiry.

Pushlane is consent-aware by design: opted-out users are never sent to, full stop. That is the correct behavior, but it means you have to plan around the gap rather than pretend it does not exist:

  • Build the expiry warning into your own app UI. A banner or modal on app open during the final 48 hours of the trial covers the opted-out user who still launches the app. That moment lives in your code. Pushlane is push only and will not pretend to own it.
  • Treat push as strong best effort, not certified mail. Even for opted-in users, delivery is not guaranteed: devices go offline, focus modes defer notifications, users mute individual apps. Never make the push the only place a charge is disclosed.
  • A delivery honesty note about Pushlane itself: iOS delivery through APNs is proven end to end. On Android, the SDK registers FCM tokens, but we do not claim proven end-to-end Android delivery today. If Android is a large share of your base, verify delivery with your own devices before you lean on this sequence.

Triggering the sequence off RevenueCat events in Pushlane

The reason this sequence is annoying to build by hand is timing: you need to know when each individual user's trial started and when it ends, per store, per product. RevenueCat already knows all of that, and Pushlane's RevenueCat webhook integration turns it into triggers.

RevenueCat sends subscription lifecycle events to Pushlane as they happen: trial started, trial converted, billing issue, cancellation, expiration. Users are matched through the shared app user id, the same identifier you already pass to RevenueCat, so there is no client-side purchase tracking code to write at all.

The mapping for this sequence:

  • Trial started kicks off a flow in the visual flow builder. Space the day-before and expiry-day pushes with timing steps sized to your trial length: for a 7 day trial, the honest warning goes out after day 6.
  • Trial converted arrives as its own event, so you can keep converted users out of the remaining sends, for example by gating each push on an audience segment of users still in trial. Nothing erodes trust faster than "your trial ends tomorrow" landing on someone who already paid.
  • Expiration triggers the just-expired push directly. No timers to maintain and no guessing: the event is the ground truth that the entitlement actually lapsed.
  • Billing issue covers the adjacent failure case, a card that declines at conversion, which deserves its own message. That is a different moment with different copy, covered in the broader guide to subscription push notification flows.

Setup is deliberately light. The iOS SDK installs via Swift Package Manager, and Expo, React Native, Flutter and Android each get a zero-dependency drop-in client: one pasted file, no npm package to install. Flow templates give you a starting sequence to edit instead of a blank canvas, and AI-generated push copy gives you first drafts to sharpen. The full wiring walkthrough is in the RevenueCat push notification integration guide.

Measure conversions, not opens

Open and tap rates will flatter this sequence, because a push about losing your data gets taps regardless of whether it changes anyone's decision. The number that matters is trials converted to paid, attributed to the sequence, and RevenueCat's trial converted event gives you the ground truth side of that for free.

Three habits keep the measurement honest:

  • Count conversions among users who entered the flow, not taps on the pushes. A user who read the notification on the lock screen and subscribed from inside the app never "engaged" with your push by any click metric, but the sequence did its job.
  • Compare variants inside the flow. Pushlane supports push A/B testing inside flows, so run your loss-framed copy against a feature-framed variant and judge them on conversions, not opens. There is a full playbook in push notification A/B testing for subscription apps.
  • Resist crediting the sequence for every conversion it touched. Some of those users were converting anyway. The A/B comparison inside the flow is the honest instrument you have for separating lift from coincidence.

You will notice this section contains no benchmark conversion rates. That is on purpose: any number a blog post hands you was measured on someone else's app, someone else's trial length, and someone else's price. Measure it in your app.

Ship it this week

The expiry sequence is three pushes, one webhook, and an afternoon of copywriting, and it sits at the exact moment your trial users decide whether to pay you. Pushlane was built for subscription apps doing exactly this: RevenueCat events in, a visual flow builder to time the sends, segments to keep paid users out, A/B tests to sharpen the copy, and consent handling you never have to think about. There is a free tier to start, so you can have the sequence live before your next trial cohort hits its cliff.

Start free at https://pushlane.io, or read how Pushlane works first.