Trigger
ID: trigger · Kind: action
The starting node of every workflow. Every campaign has exactly one Trigger.
| Field | Meaning |
|---|
title | Display label |
type | manual / schedule / webhook / event |
Output: trigger metadata (type, payload if any).
Wait
ID: wait · Kind: action
Pause the customer in the workflow for a duration.
| Field | Meaning |
|---|
waitType | duration (relative) or until-date (absolute) |
durationMs | Wait time in ms (when duration) |
untilDate | ISO date (when until-date) |
Place a Wait before a Send to avoid hammering the inbox (e.g. 24h–72h between follow-ups).
Conditional Split
ID: conditional-split · Kind: branch
Splits the workflow into N branches. Each branch must start with a Path node that guards the condition.
| Field | Meaning |
|---|
branches[] | Array { id, label } — describes each branch for UI/analytics |
Path
ID: path · Kind: action
The node that immediately follows a Conditional Split — guards the condition for entering that branch. If the rule fails, the workflow stops on that branch.
| Field | Meaning |
|---|
rules[] | Array of AND conditions |
match | any (OR) or all (AND) across rules |
Each rule has:
input — {{...}} expression or value
condition — equals, not-equals, greater-than, less-than, contains, not-contains, starts-with, ends-with, empty, not-empty
value — right-hand side
“Conditional Split → Path → …” vs edge.when: use Conditional Split when branches converge later; use edge.when for message-outcome branching (replied/clicked/opened).
Exit — Cooldown
ID: exit-cooldown · Kind: action
Ends the workflow because the customer isn’t ready yet. Moves them into a cooldown segment + (optional) lowers a fit score.
| Field | Meaning |
|---|
segmentId | Cooldown segment — usually static, e.g. “Cooldown — Q1 inactive” |
criterionId | (Optional) Fit criterion to decay |
decayDelta | Negative delta on the score (e.g. -0.2) |
The workflow ends with status canceled (cooldown is treated as a reasoned cancellation).
Exit — Handoff
ID: exit-handoff · Kind: action
Promote the customer to sales-ready. The “hot” exit.
| Field | Meaning |
|---|
stage | (WIP) Stage tag to assign — the stage system isn’t wired yet |
claimUserId | (Optional) Sales user claims the customer |
conversionEvent | (Optional) Name of the conversion event logged |
The workflow ends with status success — analytics treats this as goal reached.
Exit — Suppress
ID: exit-suppress · Kind: action
Hard exit. Flags the contact suppressed → every future automated send skips them.
| Field | Meaning |
|---|
channel | (Optional) Suppress on a specific channel — empty = all channels |
reason | unsubscribe / bounce / complaint / manual / do_not_contact |
Suppression is a hard action. No override. Use only on real unsubscribes, hard bounces, or “do not contact” decisions.