Access: from a campaign → Open builder, or the URL /campaigns/:id/builder (full-screen, no sidebar).

Layout

Node palette (left)

Nodes grouped into Builtin, Contact, Messaging. Drag onto the canvas, or click + on an edge.

Canvas (middle)

ReactFlow. Pan, zoom, multi-select.

Node config (right)

Drawer opens on node click. Form fields are auto-generated from the node’s schema.

Header toolbar

ActionWhat it does
AI GenerateGenerate a graph from a prompt — see AI Generate.
HistoryOpen the execution history modal — view past runs.
Link ProductsModal to attach products to the campaign.
SaveAuto-save in the background. A spinner shows status.

Canvas actions

  • Drag from the palette → drop on the canvas
  • Click + on an edge → modal to pick the node inserted in the middle
Drag from a handle (small circle) on the source node → handle on the target. An edge can have a when to branch by the source node’s output.
Select it → press Del, or use the menu on the node.
Pan: drag the canvas background. Zoom: scroll wheel or the floating canvas controls.

Node config drawer

Form fields are auto-generated from the node’s schema. Each field has:
  • Label + description from the schema
  • Inline validation (required, type, enum)
  • Variable picker — insert {{...}}
  • Template picker (when the field is templateName)
  • Credential picker (when the field is credentialId) — filtered by channel

Variable picker

Click the { } icon in a field → namespace tree popover:
  • firstName / lastName / fullName
  • email / linkedinUrl / phone / telegramChatId
  • language / country / timezone
  • tags[]
  • company.name / company.domain / company.industry
  • type — manual / schedule / webhook / event
  • payload.* — payload data
  • id — workflow run ID
  • startedAt
Output of any upstream node. Example: node.email-1.output.replied.
  • name
Click a leaf → inserts {{customer.firstName}} into the field at the cursor.

Edge conditions

Default edge: “always advance when the source node finishes”. To branch:
On a messaging node, an outgoing edge can set:
  • when: replied → take this path if the customer replies
  • when: clicked → if they clicked a link
  • when: opened → opened the mail
  • when: bounced → bounced
  • default → none of the above

Compile errors

A red banner appears on the header when the flow has issues:
ErrorFix
NO_TRIGGERAdd a Trigger node
DANGLING_NODENode has no path to an Exit — connect more
INFINITE_CYCLEA cycle without a Wait — add a Wait or remove the cycle
MISSING_FIELDA required field is empty
INVALID_CREDENTIALReferenced credential ID doesn’t exist / is disabled
INVALID_TEMPLATEReferenced template name doesn’t exist
Click an error to jump to the relevant node. Campaigns with compile errors can’t be activated.

History modal

The History button on the header → execution table for the campaign:
  • Each row = one run
  • Status: running / completed / failed / partial / canceled
  • Drill into an execution unit → see node-by-node detail for a specific customer
Use it to debug failed nodes, stuck customers, or verify the flow works as expected.

Unsaved changes

Close the tab with pending changes → a warning modal asks: “Save & leave” or “Discard”.
Undo/redo, checkpoint restore (graph version history), explicit Validate button, auto-layout button, canvas lock — coming soon.