Skip to main content
Each example below includes the recommended Journey settings and step-by-step configuration. Start with the simpler patterns (onboarding, re-engagement) and work up to more advanced workflows (recurring sends, event-driven progression, action button branching).

Onboarding

Journey settingDescription
Entry rulesUser matches the segment criteria. Subscribed users, future additions only — existing users do not enter.
Exit rulesThey moved through the entire journey.
Re-entry rulesNo
ContentWelcome new users to your app or website; encourage them to accomplish certain tasks over the first several days or weeks.
Onboarding welcome journey flow with push and email steps

Re-engagement campaign

Journey settingDescription
Entry rulesUser’s last session is greater than 7 days; subscribed users. Consider excluding segments like paid customers if the goal is to re-engage free users.
Exit rulesThey moved through the entire journey or meet certain conditions — exit when the user becomes active in your app or website.
Re-entry rulesYes, after a certain amount of time: 7 days. Users re-enter whenever they go inactive again.
ContentRemind users to come back to your app when they haven’t opened it in a while, and entice them with rewards or discounts.
Re-engagement journey flow with wait steps and exit conditions

Abandoned cart

Abandoned cart example

Use Custom Events or Tags to track cart activity and send abandoned cart messages.

Promotional campaign

Journey settingDescription
Entry rulesUser matches the segment criteria. Subscribed users, or a segment relevant to the promotion.
Exit rulesThey moved through the entire journey or meet certain conditions. Select a segment that defines the goal (for example, users who purchased).
Re-entry rulesNo — for one-off campaigns, send once.
ContentPrepare them for the event, remind them when it starts, and offer a discount or reward as it gets close to ending.
Promotional campaign journey flow with timed messages

Send a message after a user leaves without completing an action

Initial setup
  1. Use Tags to mark that the action needs to be performed by the user. Remove the tag when the action is completed.
  2. Set up the segment for this tag.
Journey settingOptionDescription
Entry rulesThe user’s last session is greater than the amount of time.The threshold for how long the user has been inactive in your app or website.
AudienceInclude the segment you want to target with the tag.These are the users eligible to receive the message.
Exit rulesExit when the user no longer matches the audience conditions.When the user leaves the segment, they are no longer eligible for the journey message.
Re-entry rulesYes, after a certain amount of time.The amount of time you want to wait for the user to be eligible to get the message again.
Journey steps
1

Add the desired message(s)

Choose a template for the message step. You can use push, email, SMS, or in-app depending on the action you want the user to take.
2

Set a wait node for the amount of time you want the user to wait

This can be a short or long interval depending on whether the message should repeat as a reminder. In this example, the wait is set to 104 weeks (2 years).

A/B test within a Journey

Using a split branch node, you can set a 50/50 split within your journey. Create two different message templates and as your users flow through, half will get “Template A” and the other “Template B”. Export the message data from each template to compare analytics between variants.
A/B test journey with a 50/50 split branch and two message templates

Display in-app messages in order and once per day

This example displays 3 or more in-app messages in sequence, showing one per day. If a user does not open the app, the next message appears the next time they open it. Initial setup
1

Create a new segment

Create a segment called iam_journey with filter: User Tag iam_journey is 1
  1. You can change iam_journey to whatever name you choose.
  2. This tag will be set on each user that finishes the journey and gets all messages.
Segment creation screen with iam_journey tag filter
2

Create the in-app messages

3

Set up the following journey

Journey settingOptionDescription
Entry rulesUser matches the segment criteriaThese are the users eligible to receive the message.
AudienceInclude segment & exclude segmentInclude the “Subscribed Users” segment. Exclude the “iam_journey” segment from step 1.
Exit rulesThey moved through the entire journeyNo additional conditions necessary.
Re-entry rulesYes, after a certain amount of time2 minutes
Journey stepsRepeat this order for the number of messages you want to display. This example uses 3 in-app messages (IAM 1, IAM 2, IAM 3).
  1. Add an in-app message step.
    1. Name the message, for example: IAM 1.
    2. At the bottom of the message, set delivery schedule to 1 day.
  2. Add a yes/no branch action before the in-app message step.
    1. Set your branching condition: previous message behavior: “IAM 1 viewed”.
    2. Follow the No branch
      1. Drag the IAM 1 to the No branch.
      2. Add a wait step for 1 day.
    3. Follow the Yes branch
      1. Within the Yes branch, repeat steps 1 and 2 for all messages, replacing IAM 1 with the next in-app message (IAM 2, IAM 3).
      2. At the final Yes branch, add tag user action.
        1. Tag the same key used in Initial setup → Step 1 segment.
          1. Example iam_journey : 1.
Complete in-app message journey with branching and daily delivery

Limited entry journey

Ensure users can only enter a journey a limited number of times while controlling the experience at each stage.
Journey settingDescription
Entry rulesUser matches the segment criteria (for example, subscribed users or any relevant target segment).
AudienceInclude your target segment. Exclude users with the tag journey_count = 2 to cap entries at two times.
Exit rulesThey moved through the entire journey.
Re-entry rulesYes, after a certain amount of time: 15 days.
ContentProvide a first-time experience on initial entry, and a tailored second-time experience on re-entry. Prevent any further entries beyond the second.
Limited entry journey settings with audience exclusion and re-entry rules
Initial setup
1

Prepare your tag strategy

Use a user tag named journey_count to track entries. Tags are created automatically when you set them in the Journey. See tag action for details.
2

Configure audience include/exclude

In journey audience:
  • Include your target segment (for example, “Subscribed Users”).
  • Exclude users where user tag journey_count is 2.
3

Set re-entry rules

Set re-entry rules to “Yes, after a certain amount of time: 15 days.”
This allows exactly one re-entry between the first and second runs.
Journey steps
Limited entry journey flow with yes/no branch based on journey_count tag
1

Add a yes/no branch at the start

Condition: user tag journey_count equals 1.
  • Yes branch = returning users (second entry).
  • No branch = first-time users (no tag present yet).
2

No branch (first time entry)

  • Add tag user action: set journey_count to 1.
  • Send your first-time messages and actions.
  • Continue to end or additional logic as needed.
3

Yes branch (second time entry)

  • Add tag user action: set journey_count to 2.
  • Send your returning-user messages and actions.
  • Continue to end or additional logic as needed.
4

Enforce the limit

Because the audience excludes users with journey_count = 2, any attempted third entry is blocked automatically.

Recurring journeys for specific days

Send recurring messages that align with a specific day of the week, like weekly promotions or event reminders.
Journey settingDescription
Entry rulesUser matches the segment criteria (for example, subscribed users).
AudienceInclude your target segment.
Exit rulesThey moved through the entire journey.
Re-entry rulesYes, after a certain amount of time: 7 days.
ContentA weekly message sent on a specific day (for example, every Friday).
Recurring journey settings with 7-day re-entry
Initial setup
1

Configure audience

Include your target segment so eligible users can enter the journey at any time during the week.
2

Set re-entry rules

Set re-entry rules to “Yes, after a certain amount of time: 7 days” to enable weekly recurrence.
  • The re-entry timer starts when the user exits the Journey, not when they entered.
  • A 7-day re-entry ensures users re-enter in time for the next week’s time window.
  • The re-entry duration must be longer than the time window duration to avoid double-sends.
See Using time windows for recurring sends for details.
Journey steps
Recurring journey flow with time window node and message step
1

Add a time window node (first step)

Configure the time window to filter for your target day of week (for example, Friday).
Users entering the journey will wait until the next matching day.
2

Add your message after the time window

Place the message node immediately after the time window so it sends when the day is reached.
3

End the journey

Let users exit after the message sends. With re-entry at 7 days, they will rejoin and repeat weekly.
Update the message content regularly to avoid sending the same copy each week.

Progressive journeys (event-driven)

Escalate engagement based on user progression using custom events and wait-until conditions.
Journey settingDescription
Entry rulesCustom Event = Progression_Level, with filter progression_level = 0.
AudienceOptional segment filter. You can run this for all users or restrict to a subset; no tags required.
Exit rules- They moved through the entire journey.
- Or when maximum progression level is reached (progression_level = 3).
- Optionally: exit when a Wait Until node expires.
- Optionally: branch from a Wait Until node to tag users who do not complete the event, leading them into a re-engagement journey.
Re-entry rulesNo
ContentStage-based messages that escalate as users complete milestones (emails in this example).
Progressive journey flow with wait-until nodes for each level milestone
Journey steps
1

User enters the journey

All eligible users enter based on entry rules.
Trigger: Custom Event Progression_Level with progression_level = 0.
Start: Immediately.
2

Level 1

  • Wait until custom event Progression_Level occurs with progression_level = 1.
  • Send: Level 1 Complete! message.
  • (Optional) Apply expiration on the wait node → exit user if milestone not reached.
  • (Optional) Branch: if expiration hits, tag the user and send them into a re-engagement journey.
3

Level 2

  • Wait until custom event Progression_Level occurs with progression_level = 2.
  • Send: Level 2 Complete, you are doing great! message.
  • (Optional) Apply expiration or branch/tag to re-engagement.
4

Level 3

  • Wait until custom event Progression_Level occurs with progression_level = 3.
  • Send: You’ve reached level 3! message.
  • (Optional) Apply expiration or branch/tag to re-engagement.
5

Exit

End the journey once users complete Level 3, or when a Wait Until node expires.
Optionally, use branch/tag paths to route stalled users into a re-engagement track.
Schedule: Start immediately, Never stops.
This method ensures progression happens only when real engagement signals occur. Adding expiration and branch/tag logic lets you handle stalled users gracefully — either exiting them or re-routing into a re-engagement Journey.

Branch a Journey by action button clicked

Route users down different Journey paths based on which push notification action button they tapped. This pattern uses action buttons, a custom event, and a Wait Until step to branch users by their specific button click — not just whether they clicked or not.
This example requires website or app code to capture the button click and send a custom event. It cannot be done entirely through the OneSignal dashboard.
Journey settingDescription
Entry rulesUser matches the segment criteria (for example, subscribed users or a campaign-specific segment).
Exit rulesThey moved through the entire journey.
Re-entry rulesNo
ContentSend a push with multiple action buttons, then branch follow-up messages based on which button the user tapped.
The built-in Yes/No branch message behavior conditions detect whether a user clicked or was delivered a message — but not which button they clicked. To branch by specific button, you capture the Action ID from the click event and send it as a Custom Event property that the Journey can branch on.
1

Add action buttons to your push

When creating the push message in the Journey (or in a template), open Advanced Options > Action Buttons and assign a unique Action ID to each button.Example: A promotional push with two CTAs:
  • Button 1: “Shop Now” → Action ID: shop_now
  • Button 2: “Learn More” → Action ID: learn_more
See Action buttons for full setup details.
2

Add a click listener and send a Custom Event

On your website or in your app, listen for the notification click event and send a Custom Event that includes the Action ID as a property.
The Web SDK example requires version 160500 or later. Users should be logged in for custom events to be tracked.
OneSignalDeferred.push(function(OneSignal) {
  OneSignal.Notifications.addEventListener("click", function(event) {
    var actionId = event.result.actionId;
    if (actionId) {
      OneSignal.User.trackEvent("cta_clicked", { button: actionId });
    }
  });
});
See Custom events for event requirements and limits.
3

Add a Wait Until step in the Journey

After the push message step in your Journey:
  1. Add a Wait Until step.
  2. Add a condition for each button: Custom Event cta_clicked where property button equals the Action ID (for example, shop_now).
  3. Add additional conditions for each Action ID you want to branch on (for example, learn_more).
  4. Set an expiration (for example, 3 days) so users who don’t click any button continue down a fallback path.
Users follow the branch for the first condition they meet. If no condition is met before the expiration, they follow the expiration branch.
4

Add follow-up messages to each branch

On each branch after the Wait Until step, add the appropriate follow-up message or action:
  • “Shop Now” branch: Send a product recommendation or discount code.
  • “Learn More” branch: Send educational content or a feature overview.
  • Expiration branch: Send a re-engagement message or exit the Journey.
You can chain multiple Wait Until steps to branch on subsequent interactions too — there is no limit on the number of Wait Until steps in a Journey.

FAQ

Can I schedule a message to send every day?

Yes. Add a time window node as the first step and configure it for every day of the week with the hours you want the message to send (for example, 10 AM to 6 PM in the user’s time zone). Then set re-entry rules to re-enter after a time shorter than one day but longer than the time window duration — for example, 12 hours for an 8-hour window. This ensures users re-enter early enough to catch the next day’s time window without risking a double-send within the same window.

Can I A/B test different messages in a Journey?

Yes. Add a split branch node to divide users evenly (for example, 50/50). Place a different message template on each branch, then compare analytics between the two templates after the Journey runs.

How do I limit how many times a user can enter a Journey?

Use a tag (for example, journey_count) to track entries. Increment the tag each time the user enters, and add an audience exclusion rule that blocks users once the tag reaches your desired limit. See the Limited entry journey example above.

Why did my recurring Journey send on the wrong day?

The time window node filters by the user’s local time zone if time zone data is available. If a user does not have time zone data, the message sends based on your app’s default time zone. Verify that your time window settings and user time zone data are correct.

How do I stop a running Journey?

Set the Journey status to Paused or Stopped in the Journey settings. Paused Journeys retain users at their current step; stopped Journeys exit all users immediately. See Journey settings for details.

Journeys overview

Introduction to Journeys and how they work.

Journey actions

Add wait steps, branching logic, time windows, and split paths.

Journey settings

Configure entry rules, exit rules, re-entry, and scheduling.

Journey messages

Configure push, email, SMS, and in-app message steps in a Journey.

Abandoned cart

Full walkthrough for building an abandoned cart Journey.

Custom events

Trigger Journeys and pass event properties for personalization.