Skip to main content

Overview

Journeys are multi-step customer engagement workflows that orchestrate a sequence of Next-Best-Action (NBA) decisions, waits, branches, and actions over time. Unlike a single Decision Flow that produces an instant recommendation, a journey guides a customer through a series of interactions over days or weeks.
Journey Builder showing a multi-step flow with Entry Trigger, Wait/Delay, NBA Decision, Condition Split, Channel Action, and Exit steps

Visual Flow Editor

You build journeys using a visual drag-and-drop flow editor. Each journey is a directed graph of steps connected by transitions. The editor supports:
  • Drag-and-drop step placement
  • Visual connection of steps with edges
  • Step configuration panels
  • Real-time validation of flow structure

Keyboard Shortcuts

ShortcutAction
Ctrl/Cmd + ZUndo last action
Ctrl/Cmd + Shift + ZRedo last undone action
Undo/redo buttons are also available in the editor toolbar.

Step Types

Step TypeIconDescription
entry_triggerPlayDefine how customers enter the journey (segment membership or event)
waitClockPause the journey for a specified duration or until an event arrives
nba_decisionBrainExecute a Decision Flow and select the best offer
condition_splitSplitEvaluate a field condition and route the customer down different paths
channel_actionSendDeliver a recommendation through a channel
exitStopEnd the journey with a reason

Entry Trigger Step

Defines the entry point for the journey. Customers can enter via segment membership, an inbound event, or both.
{
  "type": "entry_trigger",
  "config": {
    "segmentId": "seg_premium_customers",
    "eventType": "customer.updated",
    "condition": {}
  }
}

Wait Step

Pauses the journey for a configurable duration before proceeding to the next step. Optionally, a waitForEvent field can resume the journey early when a specific event arrives for the customer.
{
  "type": "wait",
  "config": {
    "delayHours": 48,
    "waitForEvent": "email.opened"
  }
}
Runtime behavior: The engine records the scheduled resume time (now + delayHours) on the enrollment record. A periodic scheduler polls for enrollments whose resume time has passed and advances them to the next step. If waitForEvent is set and that event arrives before the timer expires, the customer advances immediately.

NBA Decision Step

Executes a Decision Flow to select the best offer for the customer at this point in the journey. This triggers an internal Recommend API call scoped to the customer.
{
  "type": "nba_decision",
  "config": {
    "decisionFlowKey": "df_personal_loans",
    "limit": 1
  }
}
Runtime behavior: The engine calls the Recommend API internally with the customer’s ID and any context accumulated from prior steps. The response (ranked offers) is stored on the enrollment record so downstream steps can reference it.

Condition Split Step

Evaluates a field condition and routes the customer to different subsequent steps based on the result.
{
  "type": "condition_split",
  "config": {
    "field": "customer.segment",
    "operator": "eq",
    "value": "premium"
  }
}
Runtime behavior: The engine evaluates the condition against the customer’s current data (enriched attributes, prior step results). If the condition is true, the customer follows the “true” edge; otherwise, the “false” edge. Supported operators are standard comparison operators: eq, neq, gt, gte, lt, lte, in, contains.

Channel Action Step

Delivers a recommendation or message through a specified channel.
{
  "type": "channel_action",
  "config": {
    "channelId": "ch_email",
    "creativeId": "treat_loan_email_v1"
  }
}
Runtime behavior: The engine looks up the channel’s delivery configuration and dispatches the message. For API-mode channels (push, in-app), the payload is sent to the provider endpoint. For file-mode channels (email batch, CSV export), the record is appended to the channel’s output batch. Delivery status is recorded on the enrollment step record.

Exit Step

Terminates the customer’s journey with a reason code.
{
  "type": "exit",
  "config": {
    "reason": "completed"
  }
}

Enrollment Lifecycle

Each customer enrollment in a journey progresses through its own lifecycle, independent of the journey-level status:
active → paused → completed
                → failed
Enrollment StatusDescription
activeCustomer is progressing through journey steps
pausedCustomer is frozen in place (journey was paused or manual hold)
completedCustomer reached an exit step with a “completed” reason
failedA step encountered an unrecoverable error (delivery failure, missing data)
When a journey’s status changes to paused, all active enrollments are also paused. When the journey is resumed to active, enrollments pick up where they left off. If the journey is archived, all enrollments are force-completed.

Worked Example

A retail bank wants to nurture premium customers with personalized loan offers:
1

Customer enters the journey

The entry trigger fires for customers in the premium_customers segment. Customer cust_42 enters with enrollment status active.
2

Wait 2 days

A wait step with delayHours: 48 pauses the journey. The scheduler records a resume time of 48 hours from now.
3

Branch on segment

After the wait resolves, a condition_split step evaluates customer.segment == "premium". Since cust_42 is premium, they follow the “true” edge.
4

NBA Decision

An nba_decision step triggers an internal Recommend API call with decisionFlowKey: "df_personal_loans" and limit: 1. The flow returns “Personal Loan Gold” as the top offer with a score of 0.91.
5

Send email

A channel_action step dispatches an email via channel ch_email using creative treat_loan_email_v1. The creative template is populated with the offer details from the decision step.
6

Exit

The customer reaches an exit step with reason completed. The enrollment status changes to completed.

Field Reference

FieldTypeRequiredDescription
namestringYesJourney name (1-255 characters)
descriptionstringNoDescription of the journey’s purpose (max 2000 characters)
definitionobjectNoGraph structure containing nodes and edges arrays
entryConditionobjectNoCriteria for customer enrollment (segment ID, event type, filters)
maxDurationDaysnumberNoMaximum journey duration in days (1-365, default 30)
statusenumAutoLifecycle status: draft, active, paused, archived

Step Node Fields

FieldTypeRequiredDescription
typeenumYesOne of: entry_trigger, wait, nba_decision, condition_split, channel_action, exit
configobjectYesType-specific configuration (see step type sections above)

Entry Trigger Config

FieldTypeRequiredDescription
segmentIdstringNoSegment to use for enrollment eligibility
eventTypestringNoEvent type that triggers enrollment
conditionobjectNoAdditional filter conditions

Wait Config

FieldTypeRequiredDescription
delayHoursnumberNoHours to wait before advancing (default 24)
waitForEventstringNoEvent type that can end the wait early

NBA Decision Config

FieldTypeRequiredDescription
decisionFlowKeystringNoKey of the Decision Flow to execute
limitnumberNoMaximum number of offers to return (default 3)

Condition Split Config

FieldTypeRequiredDescription
fieldstringYesField path to evaluate (e.g., customer.segment)
operatorstringYesComparison operator (eq, neq, gt, gte, lt, lte, in, contains)
valueanyYesValue to compare against

Channel Action Config

FieldTypeRequiredDescription
channelIdstringYesChannel to deliver through
creativeIdstringNoCreative template to use for the message

Exit Config

FieldTypeRequiredDescription
reasonstringNoExit reason code (default completed)

Status Lifecycle

draft → active → paused → archived
StatusDescription
draftBeing designed; no customers are enrolled
activeLive; new customers can be enrolled and existing customers progress
pausedNo new enrollments; existing customers are paused in place
archivedPermanently retired; all enrolled customers are exited
Archiving a journey immediately exits all enrolled customers. Any in-progress steps are terminated. Use pause instead if you want to temporarily halt without losing journey state.

Creating a Journey

1

Navigate to Journeys

Go to Studio > Journeys in the sidebar.
2

Click Create Journey

Click the + New Journey button.
3

Name the journey

Enter a name and description for the journey.
4

Set max duration

Configure the maximum number of days a customer can remain in the journey.
5

Build the flow

Use the visual editor to add steps, configure each step, and connect them with transitions.
6

Define entry conditions

Specify which customers should be enrolled (segment membership, event triggers, or manual enrollment).
7

Validate

Click Validate to check the journey structure for errors (unreachable steps, missing configurations).
8

Save and activate

Save as draft, test with a sample customer, then set status to active when ready.

API Reference

Create a Journey

POST /api/v1/journeys
Content-Type: application/json
Request body:
{
  "name": "Personal Loan Nurture",
  "description": "3-week nurture journey for loan-interested customers",
  "maxDurationDays": 21,
  "entryCondition": {
    "segmentId": "seg_loan_interested",
    "minDaysSinceLastJourney": 30
  },
  "definition": {
    "nodes": [
      {
        "id": "step_entry",
        "type": "entry_trigger",
        "config": { "segmentId": "seg_loan_interested" }
      },
      {
        "id": "step_wait_2d",
        "type": "wait",
        "config": { "delayHours": 48 }
      },
      {
        "id": "step_decide",
        "type": "nba_decision",
        "config": { "decisionFlowKey": "df_personal_loans", "limit": 1 }
      },
      {
        "id": "step_send_email",
        "type": "channel_action",
        "config": { "channelId": "ch_email", "creativeId": "treat_loan_email_v1" }
      },
      {
        "id": "step_check_response",
        "type": "condition_split",
        "config": { "field": "outcome", "operator": "eq", "value": "conversion" }
      },
      {
        "id": "step_exit",
        "type": "exit",
        "config": { "reason": "completed" }
      }
    ],
    "edges": [
      { "source": "step_entry", "target": "step_wait_2d" },
      { "source": "step_wait_2d", "target": "step_decide" },
      { "source": "step_decide", "target": "step_send_email" },
      { "source": "step_send_email", "target": "step_check_response" },
      { "source": "step_check_response", "target": "step_exit" }
    ]
  }
}
Response (201 Created):
{
  "id": "jrn_loan_nurture",
  "name": "Personal Loan Nurture",
  "status": "draft",
  "maxDurationDays": 21,
  "createdAt": "2026-03-10T14:30:00Z",
  "updatedAt": "2026-03-10T14:30:00Z"
}

List Journeys

GET /api/v1/journeys?status=active&limit=50&offset=0
Query parameters:
ParameterTypeDefaultDescription
statusstringallFilter by journey status
limitnumber50Page size (max 200)
offsetnumber0Pagination offset

Update a Journey

PUT /api/v1/journeys/:id
Active journeys can only be updated with non-structural changes (name, description). To modify steps, pause the journey first.

Delete a Journey

DELETE /api/v1/journeys/:id
Only draft journeys can be deleted. Active/paused journeys must be archived first.

Next Steps

Triggers

Automate journey enrollment with event-driven triggers.

Runs

Execute Decision Flows in batch against customer segments.