- Paid plan or subscription data sent to OneSignal: an
auto_renew_disabledCustom Event and aplan_expires_attimestamp Tag - A win-back email that fires the moment auto-renew is turned off
- Reminder emails at T-3 days, T-2 days, and day-of expiration
- Separate messaging for monthly vs yearly plans
- Exit rules so users who re-enable auto-renew or renew stop receiving messages
This Journey mixes a Custom Event entry trigger with segment-based Wait Until steps. Review Journey settings and Journey actions first if you are new to Journeys.
Before you start: what you need in OneSignal
Time-based reminders depend on OneSignal knowing each user’s expiration date and auto-renew state. If your app does not already send that data, a developer must send it once (via SDK, API, or an integration such as Mixpanel or Amplitude) before the Journey can work. You need two pieces of data:
Optionally, add a
plan_tier Tag (for example monthly or yearly) if you want different messaging per plan.
The plan_expires_at Tag is only required if you want OneSignal to calculate the reminder timing. If your backend already detects when a plan is approaching expiry, you can skip the timestamp Tag and the reminder segments: send a Custom Event (for example, plan_expiring) at each reminder point and trigger the message from that event instead. Use the Tag-based approach when OneSignal owns the timing, and the event-based approach when your backend owns it.
There is no special “future date” field in OneSignal. A Tag that stores a Unix timestamp is what enables date-relative segments. Time Operators compare that stored timestamp against the current time. See Time Operators.
Setup
Step 1: Send paid plan data to OneSignal
Send the expiration date as a Tag and the auto-renew-off action as a Custom Event.- Frontend SDK
- REST API
Set the expiration Tag (and optional plan tier)
Track auto-renew turned off
OneSignal now knows when each user’s paid plan expires and when they turn off auto-renew, the two signals this Journey depends on.
Step 2: Create your email templates
Create the templates you will use in the Journey. A typical set is:- Auto-renew off: what they will lose if they don’t renew
- T-3 days: reminder that the paid plan ends in 3 days
- T-2 days: 2 days left
- Day-of: final notice
{{ journey.first_event.properties.plan_tier }}). See Personalize with Custom Events and Liquid syntax.
Step 3: Create the reminder segments
Skip this step if your backend detects expiration itself and sends a Custom Event (for example,plan_expiring) at each reminder point. In that case, trigger the reminder messages from that event instead of segments.
Reminder timing comes from segments built on the plan_expires_at timestamp Tag using Time Operators. Create one segment per reminder window, for example:
- Expiring in 3 days:
plan_expires_atis within the next 3 days - Expiring in 2 days:
plan_expires_atis within the next 2 days - Expiring today:
plan_expires_atis within the next 1 day
You now have segments that a user moves into automatically as their expiration date approaches.
Step 4: Build the Journey
Create a Journey (see Journeys).Entry and exit rules
Entry rule: Custom Eventauto_renew_disabled. The user enters the moment they turn off auto-renew. See Custom Event entry rules.
Exit rule: Add an exit condition so users who change their mind stop receiving reminders. Use a plan_renewed or auto_renew_enabled Custom Event as an exit rule, so anyone who renews or re-enables auto-renew leaves the Journey immediately. See Exit when Custom Event condition occurs.
Journey steps
1
Send the win-back email
Add a Message step using your “auto-renew off” template. This fires immediately on entry, while intent is highest.
2
Wait Until: expiring in 3 days
Add a Wait Until step with the condition user enters the “Expiring in 3 days” segment. When they enter it, send the T-3 email.
3
Repeat for T-2 and day-of
Add Wait Until steps for the “Expiring in 2 days” and “Expiring today” segments, each followed by its reminder email.
4
Branch by plan (optional)
If monthly and yearly subscribers need different copy, add a Yes/No or segment branch on the
plan_tier Tag and use plan-specific templates. Alternatively, run two Journeys, one per plan tier.Users now enter when they turn off auto-renew, receive a win-back email immediately, then get timed reminders as their expiration date approaches, and exit early if they renew.
FAQ
Can I build this without developer help?
Only if OneSignal already has the data. The reminder timing needs each user’s expiration date stored as aplan_expires_at timestamp Tag, and the entry trigger needs an auto_renew_disabled Custom Event. If those are not already being sent, a developer must send them once via the SDK, API, or an integration. After that, building and editing the Journey is self-serve.
Should the reminders use segments (Time Operators) or a Custom Event?
Use segments with Time Operators when OneSignal owns the timing: store the expiration date as theplan_expires_at Tag and let OneSignal compute the reminder windows. Use a Custom Event when your backend owns the timing and fires the reminder moment itself (for example, a plan_expiring event), in which case you do not need the timestamp Tag or the reminder segments. Choose the Tag-based approach if you already store the expiration date and want to avoid extra backend events.
What is the “future date” tag the AI assistant mentioned?
There is no separate “future date” tag type. It refers to a Tag storing a Unix timestamp (likeplan_expires_at). Time Operators compare that stored timestamp against the current time to build “expiring in N days” segments.
Why did my users get stuck in the Journey?
Almost always a Wait Until step without an expiration branch. If the user never enters the segment the step is waiting for, they wait forever. Add an expiration to every Wait Until and choose whether to continue or exit the user. See Journey actions.How do I handle monthly vs yearly subscribers?
Add aplan_tier Tag and branch on it inside the Journey, or run a separate Journey per plan tier. Both approaches let you tailor copy and timing per plan.
Need help?Chat with our Support team or email
support@onesignal.comPlease include:- Details of the issue you’re experiencing and steps to reproduce if available
- Your OneSignal App ID
- The External ID or Subscription ID if applicable
- The URL to the message you tested in the OneSignal Dashboard if applicable
- Any relevant logs or error messages