
Campaign = workflow + audience
A campaign holds:Workflow (graph)
Nodes + edges drawn in the builder. Each node = one step (send, wait, branch, exit…). Stored in the
Node table + campaign.data (layout).Audience
A segment or a list of customers. Customers matching the audience enroll into a workflow run.
Triggers (optional)
Webhook URL, cron schedule, event listener. See Triggers.
Products link (optional)
Attach the campaign to one or more products → analytics split per product, messages can reference product info.
Statuses
| Status | Enrolls new customers? | Existing customers? |
|---|---|---|
| draft | ❌ | ❌ |
| active | ✅ | Keep running |
| paused | ❌ | Frozen at their current node |
| completed | ❌ | Continue until end-of-flow |
| archived | ❌ | ❌ — read-only analytics |
Create a campaign
+ New campaign
The create campaign modal opens. Fields:
- Name (required)
- Description
- Audience (segment or all customers)
- Owner (defaults to you)
Draw the workflow
Drop nodes + connect edges. See Builder.
AI Generate workflow
Generate a graph from a natural-language prompt. See AI Generate.Generate
The LLM emits a JSON graph, the validator compiles + places layout. Replaces the campaign’s current nodes (warns if there are existing nodes).
Duplicate
Campaign table → ”…” menu → Duplicate. Creates a newdraft campaign with:
- Name: “[Old name] (copy)”
- All nodes + edges + layout
- Does NOT copy the audience (pick again to avoid double-sends)
- Does NOT copy triggers
- Does NOT copy stats
Link products
Campaign → Products tab → pick one or more products. Effects:- Analytics splits metrics per product (compare product lines in one campaign).
- Template variable
{{product.*}}resolves to the primary product. - The fit criterion auto-resolves from the product when an
adjust-scorenode doesn’t specify a criterion.
Enrollment lifecycle
A customer doesn’t re-enter a campaign they already completed — unless an admin resets it via the ”…” menu → “Re-enroll”.
Manual run
On the campaign page → Run now (campaigns with amanual trigger or no trigger). Fires the trigger manually so the current audience enrolls immediately.