> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xpander.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Workflow Canvas

> Add nodes, wire them into a pipeline, and use the save-and-publish cycle to deploy versioned workflows.

The canvas is the workspace where you build workflow pipelines. Triggers on the left, processing logic in the middle, outputs on the right. This page covers placing nodes, testing, and the save-and-publish cycle.

<Tip>
  **Canvas vs. node configuration:** This page covers the canvas workspace. For configuring individual node types (writing instructions, selecting tools, setting up classification groups), see [Agent Nodes](/guides/building-workflows/agent-nodes), [Action Nodes](/guides/building-workflows/action-nodes), and [Flow Control](/guides/building-workflows/flow-control).
</Tip>

## Canvas layout

Every workflow flows left to right: a **START block** on the left, an **END block** on the right, and a purple connection line between them. Events enter from the left, pass through each node in sequence, and exit as output on the right.

<Frame caption="A new workflow canvas. The START block holds triggers, the END block holds outputs, and the purple connection line is where you add processing nodes.">
  <img src="https://mintcdn.com/xpanderai-099931d1/q5b617qiln7jh1pm/images/workflows/workflow-canvas-full.png?fit=max&auto=format&n=q5b617qiln7jh1pm&q=85&s=1e0daaee2e75bb0266e629c1b7868aa2" alt="Workflow canvas layout" width="1512" height="770" data-path="images/workflows/workflow-canvas-full.png" />
</Frame>

The **START block** stacks five trigger types vertically (Webhook, API, Chat, Slack, Schedule). Each row shows a green dot when enabled and a badge below counts active triggers ("3 events").

The **END block** stacks three output options:

* A **Summarizer** for natural language digests
* A **JSON Object** for structured data against a schema
* **Notifications** for emails or webhooks on success or failure

When a node branches (Classifier, Condition, Guardrail), the canvas expands vertically to show parallel paths, but the left-to-right direction stays the same.

## Add nodes

Click the **+** button on any connection line to open the node picker. It organizes 15 node types into three categories.

**Agents** use AI to reason about data:

| Node           | What it does                                            |
| -------------- | ------------------------------------------------------- |
| **Agent**      | Full AI agent with tool access for multi-step reasoning |
| **Classifier** | Routes inputs to different branches based on meaning    |
| **Summarizer** | Condenses or extracts from content                      |

**Actions** run deterministic operations without an LLM:

| Node                | What it does                                                      |
| ------------------- | ----------------------------------------------------------------- |
| **Action**          | Invokes a connector tool (Salesforce, GitHub, Slack, 2,000+ more) |
| **Workflow**        | Nests a separate workflow as a sub-process                        |
| **Custom Function** | Executes a custom function you've defined                         |
| **Code**            | Runs Python for calculations and transformations                  |
| **Email**           | Sends an email                                                    |
| **OCR**             | Extracts text from images                                         |
| **Upload File**     | Uploads a file to a destination                                   |

**Flow** nodes control branching and execution:

| Node            | What it does                                                       |
| --------------- | ------------------------------------------------------------------ |
| **Condition**   | Splits flow based on values (contains, equals, regex, comparisons) |
| **Guardrail**   | AI judge that validates output as Pass or Fail                     |
| **Wait**        | Pauses for human approval before continuing                        |
| **Send to End** | Finishes the workflow immediately                                  |
| **Parallel**    | Runs child nodes concurrently and combines results                 |
| **Schedule**    | Can schedule runs on new/existing nodes at a set frequency         |

<Frame caption="The node picker showing all 15 node types organized into Agents, Actions, and Flow categories.">
  <img src="https://mintcdn.com/xpanderai-099931d1/q5b617qiln7jh1pm/images/workflows/workflow-add-node-dropdown.png?fit=max&auto=format&n=q5b617qiln7jh1pm&q=85&s=747ff2c471d77bd79e1f02a5c4a81d4e" alt="Add node dropdown" width="1512" height="770" data-path="images/workflows/workflow-add-node-dropdown.png" />
</Frame>

Clicking a node type inserts it at that position. A configuration panel opens on the right where you write instructions, select tools, or define conditions.

Every connection line between nodes has its own **+** button, so you can insert steps anywhere in the pipeline without rebuilding the flow.

Branching nodes (Classifier, Condition, Guardrail) automatically create output branches. A Classifier with "Billing," "Technical Support," and "Other" groups fans out into three branches, each with its own **+** buttons for adding downstream logic.

## Test workflows

The top toolbar has a green **Run** button labeled with the active test preset name (e.g., "Hello World"). Click the gear icon next to it to configure your test payload: plain text or JSON, with optional file attachments.

Save named presets so you can re-run the same test cases quickly.

When a test starts, the **Output Console** appears at the bottom of the canvas showing real-time execution events: task creation, tool requests, tool results, and the final outcome. Click any entry to expand the full JSON payload.

<Frame caption="The test input panel and Output Console. Configure payloads, run the workflow, and watch events stream in real time.">
  <img src="https://mintcdn.com/xpanderai-099931d1/q5b617qiln7jh1pm/images/workflows/test-input-panel.png?fit=max&auto=format&n=q5b617qiln7jh1pm&q=85&s=0c6cfd2199adcd1a8edf108f0e278f0d" alt="Test input and output console" width="1512" height="770" data-path="images/workflows/test-input-panel.png" />
</Frame>

If your workflow handles different input shapes, create a preset for each one and cycle through them before publishing.

The top toolbar also has **Builder** and **Monitor** tabs. Builder is the canvas. Monitor shows execution history, logs, and metrics after the workflow has run.

## Save and publish

Changes are not saved automatically. When you modify anything, a floating toolbar appears at the bottom with **Undo**, **Reset**, and **Save**. It disappears once you save or reset.

<Frame caption="The floating save toolbar appears whenever unsaved changes exist.">
  <img src="https://mintcdn.com/xpanderai-099931d1/3CZQi4ZQk-tz_FUE/images/workflows/canvas-save-toolbar.png?fit=max&auto=format&n=3CZQi4ZQk-tz_FUE&q=85&s=2ec44c027b0ff570c4b83d71cb5de6d6" alt="Floating save toolbar" width="1512" height="770" data-path="images/workflows/canvas-save-toolbar.png" />
</Frame>

Saving stores your changes but does not deploy them. The live version that triggers run against stays unchanged until you publish. This lets you iterate without affecting production traffic.

The cycle:

1. Make changes on the canvas
2. **Save** using the floating toolbar
3. The **Publish** button in the top toolbar turns purple with a red dot
4. Click **Publish**, confirm the dialog, and the new version goes live

Each publish creates a new live version. All triggers (webhooks, schedules, API calls) immediately execute against it.

If something goes wrong, you can roll back to a previous version. The platform keeps immutable snapshots of every published version.

<Tip>
  **Save vs. Publish:** Save is a checkpoint. Publish is a release. Save frequently as you work. Publish when the workflow is ready for production traffic. You can save many times between publishes, but only a publish pushes changes to the live version.
</Tip>

## What's next

<CardGroup cols={2}>
  <Card title="Triggers" icon="bolt" href="/guides/building-workflows/triggers">
    Configure webhooks, schedules, API calls, and other trigger types in the START block.
  </Card>

  <Card title="Agent Nodes" icon="robot" href="/guides/building-workflows/agent-nodes">
    Add AI-powered reasoning steps that query systems, classify inputs, and summarize results.
  </Card>

  <Card title="Action Nodes" icon="gear" href="/guides/building-workflows/action-nodes">
    Run deterministic operations: tool invocations, code, email, and OCR.
  </Card>

  <Card title="Flow Control" icon="code-branch" href="/guides/building-workflows/flow-control">
    Branch with conditions, validate with guardrails, and pause for human approval.
  </Card>
</CardGroup>
