A workflow has two editing surfaces, and **both are fully editable**. The **canvas** is a drag-and-drop flowchart; the **source editor** is the SendFlow program. They are two views of one definition — a change in either updates the other immediately. Work in whichever suits the moment; most people sketch structure on the canvas and fine-tune conditions in the source.


  The canvas is not a read-only preview of the code. Editing a node on the canvas rewrites the underlying SendFlow source; editing the source re-draws the canvas. Comments and formatting survive the round-trip.


## The canvas

Open the **Canvas** tab on a workflow to build visually:

- **Add steps** — the **Add a step…** palette inserts a send, wait, branch, split, exit, or any other statement at the point you choose.
- **Reorder** — drag a node onto an insertion slot to move it; the canvas shows where it will land.
- **Edit a node** — select any node to open its **property panel**, where you set that step's fields (template and topic for a send, the duration for a wait, the condition for a branch, and so on).
- **Reposition & tidy** — drag nodes freely, and use **Auto-arrange** to re-lay-out the whole graph top-to-bottom.
- **Nested control flow** — `if`, `split`, `wait up to` and `repeat` render as **framed containers** that hold their body steps, so the structure of a branch or loop is visible at a glance.

Illegal structures — arbitrary jumps, cross-branch joins — are impossible to draw by construction, so anything you build on the canvas is a valid workflow.

## The source editor

Open the **Source** tab to edit the SendFlow source directly. The editor gives you:

- **Live validation** — errors are underlined as you type, with the same checks the canvas enforces.
- **Hover help** on keywords, and **autocomplete** for the entities a statement expects — templates, topics, segments, lists, attributes, and custom activity names — offered per slot (a `send … via topic` completes topics; a condition completes attributes and activities).
- **Versioning** — every save creates a new version. Active runs keep going on the version they enrolled under, so editing is always safe.

See the [SendFlow reference](/workflows/flow-reference) for the full syntax.

## Read-only detail view

Git-backed workflows (and any workflow you're just inspecting) open in a read-only detail view with **Graph** and **Source** tabs, a node detail panel, and — when a definition has a validation error — the offending node highlighted directly on the graph so you can see where the problem is.