Appearance
Journeys
Multi-step messaging flows. A journey is a trigger plus a steps graph — build it in the dashboard's visual editor (Journeys → New journey) or as JSON via the API. Unlimited journeys on every plan.
A journey is triggered either by an event the subscriber performs, or by their entry into a segment (the scheduler sweeps segment-triggered journeys every few minutes and enrols new members). Re-entry is configurable: once means a subscriber is enrolled at most once ever; always re-enrols them after they exit.
How a journey runs
Subscribers enroll when your app tracks the trigger event (WingBlaze.trackEvent("cart_created") or a Segment inbound event). They then advance through the steps on the scheduler's sweep; sends apply frequency caps and quiet hours like campaigns.
Step types
| Step | Behavior |
|---|---|
| Wait | Pause for minutes/hours/days (max 30 days per wait). |
| Send | Deliver a message to the subscriber's enabled devices — pick an existing message or compose inline in the editor. An optional channels list on the step restricts it like a campaign's; without one, every enabled device receives it. Either way the subscriber's channel preference applies: journeys are marketing. |
| Branch | Evaluate a segment filter at that moment — tags, event history ({ "event": "purchase", "withinDays": 7 }), activity, channels (see Concepts); run the matching side, then continue after the branch. A branch looks at the past; to wait for an event, use a goal. |
| Goal | Wait up to N hours for a conversion event. If it happens, the subscriber exits as converted — nothing after runs. On timeout, the flow continues (the nudge path). |
The canonical example — abandoned cart
json
{
"name": "Abandoned cart",
"triggerEvent": "cart_created",
"reentry": "always",
"steps": [
{ "id": "g", "type": "goal", "event": "purchase", "timeoutHours": 24 },
{ "id": "c", "type": "condition",
"filter": { "all": [{ "tag": "plan", "eq": "pro" }] },
"then": [ { "id": "pro_nudge", "type": "send", "messageId": "..." } ],
"else": [ { "id": "free_nudge", "type": "send", "messageId": "..." } ] }
]
}Cart created → enroll. Purchase within 24h → exit converted, no nudge. Otherwise the nudge sends, split by plan.
Lifecycle & rules
- Go live / pause any time; the graph is frozen while live, and pausing exits in-flight subscribers at their next wake.
- Re-entry:
once(default — a subscriber ever enrolls a single time) oralways(re-enroll after finishing; never two active runs at once). - Stats: enrolled / in flow / completed / converted / exited, in the editor header and at
GET /apps/:appId/journeys/:id/stats. - Analytics events
journey_enrolled,journey_converted,journey_completedland in the event stream; delivery receipts carrymeta.journeyId.