Onboarding
| Journey setting | Description |
|---|---|
| Entry rules | User matches the segment criteria. Subscribed users, future additions only — existing users do not enter. |
| Exit rules | They moved through the entire journey. |
| Re-entry rules | No |
| Content | Welcome new users to your app or website; encourage them to accomplish certain tasks over the first several days or weeks. |

Re-engagement campaign
| Journey setting | Description |
|---|---|
| Entry rules | User’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 rules | They moved through the entire journey or meet certain conditions — exit when the user becomes active in your app or website. |
| Re-entry rules | Yes, after a certain amount of time: 7 days. Users re-enter whenever they go inactive again. |
| Content | Remind users to come back to your app when they haven’t opened it in a while, and entice them with rewards or discounts. |

Abandoned cart
Abandoned cart example
Use Custom Events or Tags to track cart activity and send abandoned cart messages.
Promotional campaign
| Journey setting | Description |
|---|---|
| Entry rules | User matches the segment criteria. Subscribed users, or a segment relevant to the promotion. |
| Exit rules | They moved through the entire journey or meet certain conditions. Select a segment that defines the goal (for example, users who purchased). |
| Re-entry rules | No — for one-off campaigns, send once. |
| Content | Prepare them for the event, remind them when it starts, and offer a discount or reward as it gets close to ending. |

Send a message after a user leaves without completing an action
Initial setup- Use Tags to mark that the action needs to be performed by the user. Remove the tag when the action is completed.
- Set up the segment for this tag.
| Journey setting | Option | Description |
|---|---|---|
| Entry rules | The 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. |
| Audience | Include the segment you want to target with the tag. | These are the users eligible to receive the message. |
| Exit rules | Exit 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 rules | Yes, 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. |
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.
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.
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 setupCreate a new segment
Create a segment called 
iam_journey with filter: User Tag iam_journey is 1- You can change
iam_journeyto whatever name you choose. - This tag will be set on each user that finishes the journey and gets all messages.

Create the in-app messages
See design in-app messages with drag and drop for more.
Set up the following journey
| Journey setting | Option | Description |
|---|---|---|
| Entry rules | User matches the segment criteria | These are the users eligible to receive the message. |
| Audience | Include segment & exclude segment | Include the “Subscribed Users” segment. Exclude the “iam_journey” segment from step 1. |
| Exit rules | They moved through the entire journey | No additional conditions necessary. |
| Re-entry rules | Yes, after a certain amount of time | 2 minutes |
-
Add an in-app message step.
- Name the message, for example:
IAM 1. - At the bottom of the message, set delivery schedule to 1 day.
- Name the message, for example:
-
Add a yes/no branch action before the in-app message step.
- Set your branching condition: previous message behavior: “
IAM 1viewed”. - Follow the No branch
- Drag the
IAM 1to the No branch. - Add a wait step for 1 day.
- Drag the
- Follow the Yes branch
- Within the Yes branch, repeat steps 1 and 2 for all messages, replacing
IAM 1with the next in-app message (IAM 2,IAM 3). - At the final Yes branch, add tag user action.
- Tag the same key used in Initial setup → Step 1 segment.
- Example
iam_journey : 1.
- Example
- Tag the same key used in Initial setup → Step 1 segment.
- Within the Yes branch, repeat steps 1 and 2 for all messages, replacing
- Set your branching condition: previous message behavior: “

Limited entry journey
Ensure users can only enter a journey a limited number of times while controlling the experience at each stage.| Journey setting | Description |
|---|---|
| Entry rules | User matches the segment criteria (for example, subscribed users or any relevant target segment). |
| Audience | Include your target segment. Exclude users with the tag journey_count = 2 to cap entries at two times. |
| Exit rules | They moved through the entire journey. |
| Re-entry rules | Yes, after a certain amount of time: 15 days. |
| Content | Provide a first-time experience on initial entry, and a tailored second-time experience on re-entry. Prevent any further entries beyond the second. |

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.Configure audience include/exclude
In journey audience:
- Include your target segment (for example, “Subscribed Users”).
- Exclude users where user tag
journey_countis2.

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).
No branch (first time entry)
- Add tag user action: set
journey_countto1. - Send your first-time messages and actions.
- Continue to end or additional logic as needed.
Yes branch (second time entry)
- Add tag user action: set
journey_countto2. - Send your returning-user messages and actions.
- Continue to end or additional logic as needed.
Recurring journeys for specific days
Send recurring messages that align with a specific day of the week, like weekly promotions or event reminders.| Journey setting | Description |
|---|---|
| Entry rules | User matches the segment criteria (for example, subscribed users). |
| Audience | Include your target segment. |
| Exit rules | They moved through the entire journey. |
| Re-entry rules | Yes, after a certain amount of time: 7 days. |
| Content | A weekly message sent on a specific day (for example, every Friday). |

Configure audience
Include your target segment so eligible users can enter the journey at any time during the week.
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.

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.
Users entering the journey will wait until the next matching day.
Add your message after the time window
Place the message node immediately after the time window so it sends when the day is reached.
Progressive journeys (event-driven)
Escalate engagement based on user progression using custom events and wait-until conditions.| Journey setting | Description |
|---|---|
| Entry rules | Custom Event = Progression_Level, with filter progression_level = 0. |
| Audience | Optional 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 rules | No |
| Content | Stage-based messages that escalate as users complete milestones (emails in this example). |

User enters the journey
All eligible users enter based on entry rules.
Trigger: Custom Event
Start: Immediately.
Trigger: Custom Event
Progression_Level with progression_level = 0.Start: Immediately.
Level 1
- Wait until custom event
Progression_Leveloccurs withprogression_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.
Level 2
- Wait until custom event
Progression_Leveloccurs withprogression_level = 2. - Send: Level 2 Complete, you are doing great! message.
- (Optional) Apply expiration or branch/tag to re-engagement.
Level 3
- Wait until custom event
Progression_Leveloccurs withprogression_level = 3. - Send: You’ve reached level 3! message.
- (Optional) Apply expiration or branch/tag to re-engagement.
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 setting | Description |
|---|---|
| Entry rules | User matches the segment criteria (for example, subscribed users or a campaign-specific segment). |
| Exit rules | They moved through the entire journey. |
| Re-entry rules | No |
| Content | Send a push with multiple action buttons, then branch follow-up messages based on which button the user tapped. |
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
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.See Custom events for event requirements and limits.
The Web SDK example requires version
160500 or later. Users should be logged in for custom events to be tracked.Add a Wait Until step in the Journey
After the push message step in your Journey:
- Add a Wait Until step.
- Add a condition for each button: Custom Event
cta_clickedwhere propertybuttonequals the Action ID (for example,shop_now). - Add additional conditions for each Action ID you want to branch on (for example,
learn_more). - Set an expiration (for example, 3 days) so users who don’t click any button continue down a fallback path.
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.
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.Related pages
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.