Wait
Delay the user’s Journey progression by a specific amount of time—minutes, hours, days, or weeks. Use it to:- Space out messages and steps
- Allow time for users to engage with a message before branching

A wait node with users currently waiting to progress in the journey
Wait Until
Hold a user at this step until they meet specific conditions:- Entering a segment
- Triggering a message event (e.g., specific message delivered, opened, or clicked)
- Only one message event per wait until step is supported at this time.
- Triggering a custom event (e.g., onboarding complete, purchase made)

Wait Until user is in a segment or triggers a custom event
Event Matching
Using the Custom Events entry rule, you can have users enter a Journey multiple times. With the Wait Until step’s Event Matching setting, you can control which instance of the user to progress through the Journey. Requirements:- Set the Journey Entry Rules to use a custom event.
- Include an event property when entering users into the Journey.
Set the Journey Entry Rules and custom event properties
survey_start
Journey Entry Rules using a custom event
name set to survey_start and a payload property survey_id with a value of the survey they are taking (e.g., survey_1).Create a Wait Until step and custom event properties
survey_completeSet the Event Matching option to specify which instance of the user to progress through the Wait Until step by matching the:- Trigger Event Property: set in the Journey entrance trigger event (e.g.,
survey_id) - Wait Event Property: set in the Wait Until event (e.g.,
survey_type)
survey_id matches the value of survey_type, that instance of the user will progress through the Journey.Expiration branch:If the Wait Until event does not occur within the expiration time, the user will progress through the Journey. This example gives the user 1 week to complete the survey.
Wait Until step using a custom event
Add a message step

Message step within the Expiration branch
Test it out!
- Replace the
external_idin the Custom Event API with your external ID - Trigger the
survey_startevent with asurvey_idofsurvey_1- You will see your user enter the Journey and flow into the Wait Until step
- Trigger another
survey_startevent with asurvey_idofsurvey_2- You will see 2 users enter the Journey and Wait Until step
- Trigger the
survey_completeevent with asurvey_typeofsurvey_1- You will see your user progress through the Journey
- Trigger another
survey_completeevent with asurvey_typeofsurvey_2- You will see both instances of your user progress through the Journey and exit
Time Window
Restrict when users can move to the next step in the Journey based on specific days and times. Example: Only allow users to receive a message on weekends in the evening.
Screenshot showing an example of a time window node
How time window behavior works
When a user enters this node, OneSignal checks whether the current time falls inside the allowed window:- If the window is currently open, the user continues immediately with no delay.
- If the window is in the future (or has already closed for the day), OneSignal delays the user until the next available window. To prevent traffic spikes at the moment a window opens, each user’s release time is randomized between the window start and window start + 15 minutes.
Using time windows for recurring sends
Combine a time window node with re-entry rules to send recurring messages on a schedule (daily, weekly, etc.). Place the time window as the first step in the Journey so users wait for the right day and time before receiving the message. When choosing a re-entry duration, set it longer than the time window duration but shorter than the send interval. This prevents double-sends within the same window while ensuring users re-enter early enough to catch the next window. Example — daily send:- Time window: every day, 10 AM – 6 PM (8-hour window)
- Re-entry: 12 hours (longer than the 8-hour window, shorter than 24 hours)
- Result: users re-enter ~12 hours after exiting, always arrive before the next day’s window closes, and receive one message per day
Yes/No branch
Branch users based on segment membership or message behavior.Segment membership
Create branches based on what segment a user is in. Example: If users are tagged by plan type:- “Free” branch = promote upgrade
- “Paid” branch = highlight premium features
Message behavior
Branch based on interaction with previous messages in the Journey:- Push: Clicked, Delivered
- Email: Clicked, Opened, Delivered
Split Branch
Randomly distribute users across different paths to test messaging, channels, or Journey flows.
An example of a 3-way split branch
How it works
- Up to 20 branches
- Set equal or custom percentage splits
- Percentages round to whole numbers (e.g., 3-way split becomes 34/33/33)
- Distribution may vary slightly with small sample sizes

Split branch settings
A/B/N Tests
Use nested Split Branches to test more than two variants simultaneously. Example: To split users equally across 3 variants:- First branch: 33% vs 67%
- Under the 67% branch, add another 50/50 Split Branch
Control Groups
Test the impact of messaging by leaving one branch empty (no message nodes). This lets you compare against users who receive no message at all.Choosing a Winner
Once a winning variant is identified, update the branch to send 100% of traffic down that path (and 0% down the losing branch). To continue measuring impact over time, consider keeping a small holdout group—a percentage of users who don’t receive the winning message.Tag User
Use this action to apply or remove tags during a Journey. Common use cases:- Track Journey progress (e.g.,
journeyStep: welcome) - Power in-app messages by tagging users at key moments
- Exclude users from other Journeys using active tags

A simple onboarding/welcome flow
Example: onboarding flow control
- First step: Add a tag (e.g.,
onboardingJourney: active) - Use this tag to create a segment for exclusion from other Journeys
- Last step: Remove the tag by setting the value to blank

A tag node settings to remove the tag from the user
Best practice: Using tags with webhooks or personalization
When you add or remove tags in a Journey, it can take a short time before those changes are ready to use in the next step. To make sure everything works smoothly:- For Webhooks: Add a short wait after setting a tag before sending data with a webhook.
- For Personalization: Add a short wait after setting or removing a tag before using it in an email to personalize content.