Making sure that users exit a journey when you expect them to is almost as important as ensuring that they enter it when they're supposed to. After all, you don't want to keep sending messages to users after the content is no longer relevant to them!
This article tells you everything you need to know about setting up exit paths for users in your journeys.
# In this article
# Filtering users out of a journey at a specific point
You can use filter tiles to remove users at different stages of the journey. Let's consider a couple of examples.
# Removing users who don't have a specific attribute
Let's say you want to remove users from a journey who don't match the conditions of an Attribute split tile. To do this, leave the Everyone else branch unconnected Users who don't match any of the criteria you've set up will be sent down this path and be removed from the journey.
Alternatively, you can uncheck the Add an "Everyone else" branch when you're setting up the Attribute Split tile—users who don't match the criteria you've set up will be removed from the journey.
If you want to remove users at a specific point in the journey, use a filter tile.
# Removing users who don't engage with a message
Let's say you want to remove users who aren't engaging with a promo sequence. You could add a Yes/No Split tile that checks for an open or click after a message tile. If you want to remove users who haven't opened or clicked the message, leave the "No" branch unconnected.
# Removing users for a specific action or attribute
If you want to remove users when a certain event occurs — no matter where they are in the journey — use an exit rule. Removing a user from a promo sequence as soon as they make a purchase is a good example.
Review these points to understand how exit rules work:
Users who meet the criteria for an exit rule are removed from a journey when they finish the tile they're on.
Users in a Time Delay tile are an exception to the previous behavior — they are removed from the journey within 48 hours of the occurrence of the event or user profile update, or before moving to the next tile (whichever comes first).
Exit rules apply to an entire journey, not just a specific step. Wherever a user is in a journey, they stop receiving messages as soon as they meet an exit rule's criteria.
You can set up as many exit rules as you like. Users only need to match the criteria for one of your exit rules to be removed from a journey.
If a user satisfies exit criteria in a journey that has STO enabled, the message will still be sent at the optimized time chosen by STO, even though the user exited the journey.
# Creating exit rules
To add exit rules to a journey, click Exit rules in the lower left of Studio.
As you're setting up your exit rules, think about whether you want users to be removed from the journey when they meet a single condition or a group of conditions:
To remove users when they have met multiple criteria, add a single exit rule with multiple conditions. Use the + Condition button to add each additional condition to the exit rule.
To remove users who meet at least one of many separate conditions (or groups of conditions), add multiple exit rules to the journey. Use the + Add rule button to add each additional rule.
# Configuring exit rules based on changing list membership
When configuring an exit rule to remove users from the journey when their list
membership changes, it's important to consider your use case requirements and
how the different options for exit rule criteria work. It's possible to create
exit rules that check for updated list membership using either the Property Changes
or Event Occurs option, and the results of these two options are
fundamentally different. In general, use Property Changes when list
membership is updated by changing a user's emailListIds or userListIds
field through user update API calls, and use Event Occurs when list
membership changes need to be detected through subscribe or unsubscribe events.
Before setting up an exit rule that removes users from a journey when they're
subscribed to or unsubscribed from one of your lists, consider how you plan to
trigger those changes and choose the right option for your use case
accordingly.
# Property Changes
The Property Changes option is triggered only when the user's
emailListIds
(for email-based projects) or userListIds
(for userID-based and hybrid projects) user profile field is updated through a
call to the following API endpoints:
- Update a single user:
POST /api/users/update - Bulk update users:
POST /api/users/bulkUpdate
These endpoints update the user's profile fields directly rather than generating subscribe or unsubscribe events.
An exit rule configured with the Property Changes option isn't triggered when a user's list membership is updated through:
- Calls to the following Iterable API endpoints:
- Bulk update subscriptions for a list of users:
PATCH /api/subscriptions/{subscriptionGroup}/{subscriptionGroupId}/user/{userEmail} - Update subscriptions for a user (by
userId):PATCH /api/subscriptions/{subscriptionGroup}/{subscriptionGroupId}/byUserId/{userId} - Update subscriptions for a user:
POST /api/users/updateSubscriptions
- Bulk update subscriptions for a list of users:
- CSV uploads that update user profile fields
# Event Occurs
If you want users to exit a journey when they're added to a particular list, configure an exit rule with Event Occurs > Subscribe > User List for that list. If you want users to exit when they're removed from a list, use the corresponding unsubscribe event condition for that list.
An exit rule configured with the Event Occurs option (such as Subscribe > User List) can be triggered when the user's list membership status is updated through methods such as:
- Calls to the following Iterable API endpoints:
- Bulk update subscriptions for a list of users:
PATCH /api/subscriptions/{subscriptionGroup}/{subscriptionGroupId}/user/{userEmail} - Update subscriptions for a single user (by
userId):PATCH /api/subscriptions/{subscriptionGroup}/{subscriptionGroupId}/byUserId/{userId} - Update subscriptions for a single user:
POST /api/users/updateSubscriptions - Subscribe users to a list:
POST /api/lists/subscribe - Unsubscribe users from a list:
POST /api/lists/unsubscribe
- Bulk update subscriptions for a list of users:
- CSV uploads that update user profile fields
# Users who unsubscribe
Let's say you want users to exit a journey if they unsubscribe from
your newsletter. You could set up an exit rule that checks your Newsletter Subscribers
list for an Unsubscribe event and removes a user from the journey when one is found.
# Additional uses for exit rules
Some other possible uses related to exit rules include:
Removing a user from a journey immediately after they complete a specific action, by using journey conversions as exit criteria. After they're removed, you can send them to a different journey, if you want to.
Excluding users from a journey who have a certain user profile attribute (and may have been removed from the journey previously via exit rules), by setting up entry rules in the Start tile to filter them out.
NOTE
Handlebars expressions are not supported in exit rules.
# Journey exit events
When a user exits a journey, you can set up your journey to track a journeyExit
event. When a journey exit event is logged, the event includes an exitReason field
that contains the reason for the user's exit.
To learn more about journey event tracking, see Monitoring Journey Engagement.
# Expected exit reasons
Expected exit reasons occur when the journey is working as designed. No action is required.
# CampaignSelectorGoalAchieved
The user met the goal condition configured in the journey.
# CampaignSelectorNoMoreTemplates
The journey had no remaining campaigns or templates to send to the user.
# Completed
The user completed the journey as expected.
# ExitRulesMatched
The user satisfied one or more of a journey's configured exit rules.
# InAnotherJourney
The user is excluded by concurrent-journey entrance criteria.
# NoTriggerMatch
The user did not meet the entry conditions for their triggering event or profile data.
# UserIsDeleted
The user's profile was deleted from Iterable, and they were removed from the journey. Iterable normally does not log a journeyExit event because the profile no longer exists. When no event is logged, the exit does not count toward your Journey Events limit.
# UserIsForgotten
The user was forgotten through a GDPR request, and they were removed from the journey. Iterable normally does not log a journeyExit event because the profile no longer exists. When no event is logged, the exit does not count toward your Journey Events limit.
# WorkflowDisabled
The journey is disabled.
# Unexpected exit reasons
In general, unexpected exit reasons point to a journey configuration issue, a missing referenced asset, or an integration problem. While send, campaign, template, and channel errors are especially unlikely to occur, when they do, they are most likely due to a change made outside of journeys, like archiving or deleting a campaign or message type.
Descriptions for these unexpected exit reasons are for both technical and non-technical users:
CallWebhookExceptionCampaignNotFoundCustomEventFromUserUpdateNotAllowedDraftNodeDataInvalidGenericSendActionCampaignContextNotFoundGenericSendActionMessageMediumNotFoundGenericSendActionTemplateNotFoundInvalidDateInputInvalidHandlebarInvalidJsonInvalidQueryInvalidWebhookUrlMessageChannelNotFoundMessageTypeNotFoundNoABSplitFoundNoFieldSplitMatchNotEnoughMessageMediumsConfiguredProjectNotFoundRetryLimitExceededUnknownExitReasonUserUpdateFieldLimitExceededUserUpdateFieldTypeMismatchUserUpdateFieldsAreForbiddenUserUpdateFieldsUnprocessableWebhookBodyIsNotJsonWebhookBodyIsNotJsonObjectWebhookPermanentFailureWebhookSSLErrorWorkflowNotFoundWorkflowStepNotFound
TIP
To troubleshoot unexpected journey exits, start with the tile immediately upstream from the tile where the user exited and verify the existance and validity of any referenced campaign, template, webhook, message type, or profile field. If the tile depends on incoming data, confirm the live event, webhook response, or user profile value is present and correctly formatted.
# CallWebhookException
The journey stopped while trying to run a Webhook tile because the webhook request or configuration failed unexpectedly. Verify that the Live Data or Webhook tile, its endpoint URL, and any dynamic values used in the URL or request body are valid.
# CampaignNotFound
The journey tried to send a message using a campaign that could not be found. Look at the relevant send tile and confirm the referenced campaign exists and is valid.
# CustomEventFromUserUpdateNotAllowed
A User Update tile attempted to create unsupported custom event data. Verify that the User Update tile only writes valid user profile fields, not event-like payloads.
# DraftNodeDataInvalid
The journey tried to use a tile whose draft configuration was invalid or incomplete. Verify that the required settings are complete in the tile where the user exited and any recently edited upstream tiles.
# GenericSendActionCampaignContextNotFound
The journey reached a Generic Send step, but it could not find the campaign or template context needed to send. Verify that the relevant send tile and any upstream data provide the needed campaign selection context.
# GenericSendActionMessageMediumNotFound
The journey found the selected send context, but could not determine which message medium to use. Verify that the content in the send tile or campaign/template setup is configured for the intended channel.
# GenericSendActionTemplateNotFound
The journey reached a Send tile, but the expected message template or sendable content could not be found. Look at the relevant send tile, and verify that the linked template or campaign content exists or is properly formatted.
# InvalidDateInput
The journey tried to evaluate a date-based condition, but the date value was missing or not in a valid format. Look at any filter, split, start condition, or upstream event/webhook field used in that comparison.
# InvalidHandlebar
The journey tried to evaluate a Handlebars expression in a user update flow, but the expression was invalid. Look at the User Update or User Profile tile and verify that the Handlebars syntax, referenced fields, and rendered JSON values are valid.
# InvalidJson
The journey encountered JSON data or a configuration it could not parse. Verify that tiles that use JSON payloads or webhook responses have rendered content in a valid JSON format with the expected structure.
# InvalidQuery
The journey hit a query or filter rule that it could not evaluate successfully. Verify that each query condition for any filter, split, start condition, or exit rule is fully valid and references the expected fields or events.
# InvalidWebhookUrl
The journey could not call a webhook because the step contains an invalid URL. Verify that the Live Data, Webhook, or User Profile tiles reference complete and valid URLs. Inferred from reason name.
# MessageChannelNotFound
The journey found the message or template, but could not resolve the required sending channel. Verify that the channel associated with the affected send tile is still configured and active.
# MessageTypeNotFound
The journey found the message or template, but could not resolve the required sending message type. Verify thatthe message type associated with the affected send tile is configured and active.
# NoABSplitFound
The journey reached an A/B Split, but could not determine a valid branch for that user. Verify that the branch setup on the A/B Split tile is complete and that the published version contains the expected split configuration.
# NoFieldSplitMatch
The journey reached a Yes/No Split or Attribute Split tile, but none of the configured branch values matched the available field value, and no ‘other’ or ‘No” option was configured. Look at the split tile, the field source being checked, and whether an ‘Everyone else’ path should catch unmatched users.
# NotEnoughMessageMediumsConfigured
A channel-optimization or multi-channel send step did not have enough configured message mediums to run. Verify that the multi-channel send or channel-optimization tile has at least two channel options fully configured.
# ProjectNotFound
The journey could not find the project context it needed to continue processing. Review the current journey setup and any linked journeys, campaigns, templates, or integrations to ensure that they reference the correct (and unarchived) project and aren’t missing any project-level resources. Inferred from reason name.
# RetryLimitExceeded
The journey retried a step after a temporary failure, but it didn’t succeed before the retry limit was reached. Confirm that the destination endpoints for any webhook-based tiles are not timing out, rate limiting, or returning retryable errors.
# UnknownExitReason
The user exited unexpectedly, but the system did not have a more specific reason code to attach. Start with the tile where the user exited, then inspect any referenced asset or external integration that may have failed in a way that was not classified more precisely.
# UserUpdateFieldLimitExceeded
A user profile update step tried to create or update more fields than the project allows. Verify that the User Update or User Profile tile is only writing the intended set of fields and that your project has not reached a field limit.
# UserUpdateFieldTypeMismatch
A user profile update tried to write a value with a type that did not match the destination field’s existing type. Verify that the types align in the User Update tile, upstream payload values, and the destination field type in your profile schema.
# UserUpdateFieldsAreForbidden
A user update step tried to write fields that Iterable does not allow that tile to modify. Verify that the User Profile tile is only updating editable user profile fields; if you’re trying to manage subscriptions with this step, consider using a Subscription tile instead.
# UserUpdateFieldsUnprocessable
The journey tried to update the user profile, but one or more fields could not be processed. Verify that the User Profile tile, any webhook-fed profile data, and your field schema have supported payload shape and values.
# WebhookBodyIsNotJson
The webhook step encountered invalid JSON in the response body. Verify that the Live Data, Webhook or User Profile tile endpoints return valid JSON for real journey requests.
# WebhookBodyIsNotJsonObject
The response received by the webhook step was not a JSON object that the journey could use. Verify that the Live Data, Webhook, or User Profile tileendpoints return a JSON object with key-value pairs, not a string, array, or HTML page.
# WebhookPermanentFailure
The webhook call failed and couldn’t be retried, so the user exited at that step. Verify that the Live Data or Webhook tiles, auth setup, endpoint behavior, and request payload destinations accept the request successfully.
# WebhookSSLError
The journey could not complete a webhook call because the secure HTTPS connection failed. Verify that the Webhook tile or Live Data tile has a destination endpoint with a valid SSL/TLS setup.
# WorkflowNotFound
The system could not find the journey workflow the user was supposed to continue in. ReviewSend to Journey paths and the journey publish state to ensure that no recent delete, clone, or replace actions are affecting the destination journey.
# WorkflowStepNotFound
The system could not find the next tile or step on the user’s path, often because it was deleted or disconnected while users were in flight. Look at the exit tile, the next downstream tile, and any recently changed split or delay paths.
# Triggering journey exits with list and subscription imports
If you want a list or subscription import to remove users from a journey, enable the Trigger journey entries and exits with this import option while setting up the import.
With this setting enabled, list imports can remove users from journeys when linked exit rules using Subscribe to User List conditions are met, and when Property Changes conditions for supported user profile fields are met. Property Changes > List Membership isn't triggered by list imports. To learn more, see Configuring exit rules based on changing list membership. Subscription imports can remove users when linked subscribe or unsubscribe message channel exit rule conditions are met. The same setting also controls whether those imports can add users to journeys through related entry sources.
To learn more about this setting, see Adding Users and Creating Lists. For guidance on when to use a list-based entry source instead of a schedule, see Choosing between Schedule and Subscribe to List.
# Troubleshooting journey exits
Ideally, users will only exit a journey when they've satisfied the criteria you've set up. But sometimes, an unexpected condition triggers a user's exit from a journey. If a user exits a journey unexpectedly, consider whether any of the following circumstances exist.
# Unconnected tiles
Any tile that isn't connected to another tile in a journey is an exit point. Keep this in mind as you build a journey. You can intentionally leave a tile unconnected if you want users to exit the journey after they finish that tile. But remember not to leave a tile unconnected if you want users to continue beyond that step in the journey!
If you want users who reach the end of a path in one of your journeys to be added to another sequence, add a Send to journey tile to the end of the path.
# Failed webhook calls
If a webhook call fails for one of your users, the user will exit the journey. Keep this in mind as you set up any Call webhook and User profile tiles you've added to your journey.
See Journey Webhooks to learn more.
# Deleting tiles
When you delete tiles from a live journey, any users who are in those tiles at the time you publish your changes are removed from the journey. This is true for all tile types—however, users in deleted Time Delay tiles must complete the delay period before they exit the journey. To learn more, see Deleting Tiles.
# Null fields and journey exits
In some cases, null values for boolean fields may prevent users from exiting a journey. If you update fields (for example, in a user profile) and null values are added, consider the potential impact to journey exits.
# Turning a journey off
When you turn a journey off, users who are in the journey will be removed after they complete the step they're on. However, if the journey is turned back on while a user is still in a Time Delay tile, the user is not removed from the journey when they reach the end of their delay — they proceed to the next tile.
If you don't want to remove any users from the journey, but you want to prevent new users from entering it, disconnect the Start tile.
# Want to learn more?
For more information about some of the topics in this article, check out this Iterable Academy course. Iterable Academy is open to everyone — you don't need to be an Iterable customer!
Iterable Academy:
Support docs: