--- title: Visual Workflow Builder description: Build workflows with drag-and-drop icon: Workflow --- ## Overview The workflow builder is a node-based visual editor for creating email automation. Each node is a step (send email, delay, condition, etc.) and connections define the flow. ## Canvas controls - **-** / **+** - Zoom out/in - **Fit** - Center and zoom to show entire workflow - **Auto-Layout** - Automatically arrange nodes - **Minimap** - Toggle overview map (bottom right) ## Step types ### Trigger The starting point. Every workflow has one trigger. **Types:** - Event (e.g., `user_signed_up`) - Segment entry/exit - Schedule (cron) Cannot be deleted. ### Send Email Sends an email to the contact. **Configuration:** - Template (required) - Variables (optional overrides) Contact must be subscribed for marketing templates. Transactional templates send regardless. ### Delay Pauses execution for a specified time. **Configuration:** - Duration: Number - Unit: Minutes, Hours, or Days **Example:** Delay 24 hours before next email. ### Wait for Event Pauses until an event occurs or timeout is reached. **Configuration:** - Event name - Timeout duration (optional) **Requires two outgoing connections:** - Event triggered path - Timeout path **Example:** ``` [Wait for: purchase_completed, timeout: 48h] ├─ Purchased → Send thank you └─ Timeout → Send discount reminder ``` ### Condition Branches workflow based on contact data. **Configuration:** - Field to check - Operator (equals, contains, greaterThan, etc.) - Value to compare **Requires two outgoing connections:** - True path - False path **Example:** ``` [Condition: plan equals "premium"] ├─ True → Send premium features └─ False → Send upgrade offer ``` ### Webhook Sends HTTP request to external URL. **Configuration:** - URL - Method (GET, POST, PUT, DELETE) - Headers (optional) - Body (JSON, optional) **Example:** Update CRM when workflow completes. ### Update Contact Updates contact data fields. **Configuration:** - Fields: Key-value pairs **Example:** ``` Fields: onboardingCompleted: true lastWorkflowStep: "welcome_series_done" ``` ### Exit Ends workflow execution. Can have multiple exit points for different paths. ## Building a workflow ### Add a step **Method 1:** Click **+** button below any node **Method 2:** Drag step type from sidebar onto canvas ### Configure a step 1. Click node to select 2. Right panel opens 3. Fill required fields 4. Save ### Connect steps Connections auto-create when using + button. To manually connect: 1. Drag from node's bottom handle 2. Drop on another node's top handle ### Arrange layout Click **Auto-Layout** for automatic top-to-bottom arrangement. ## Example workflows ### Linear sequence ``` [Trigger: user_signed_up] ↓ [Send: Welcome] ↓ [Delay: 24h] ↓ [Send: Feature tour] ↓ [Exit] ``` ### With condition ``` [Trigger: trial_started] ↓ [Send: Welcome] ↓ [Condition: plan equals "enterprise"] ├─ True → [Send: Enterprise onboarding] └─ False → [Send: Standard onboarding] ``` ### With event wait ``` [Trigger: cart_abandoned] ↓ [Delay: 1h] ↓ [Send: First reminder] ↓ [Wait for: purchase_completed, timeout: 23h] ├─ Purchased → [Exit] └─ Timeout → [Send: Discount offer] → [Exit] ``` ## Validation The builder validates in real-time. Red border = error. **Common errors:** - "No outgoing connections" → Add connection to next step - "Wait for Event requires two paths" → Add event + timeout paths - "Condition requires true and false paths" → Add both paths - "Template not found" → Select valid template ## Testing ### Manual execution 1. **Workflows** → Your workflow → **Executions** 2. **Create Execution** 3. Select test contact 4. Provide test data (JSON) 5. **Start** Watch execution progress in real-time. ### Faster testing For testing delays: - Temporarily change to 5 minutes instead of days - Test the flow - Change back to real durations ## Keyboard shortcuts | Key | Action | |-----|--------| | Delete | Delete selected node | | Cmd/Ctrl + Z | Undo | | Cmd/Ctrl + Shift + Z | Redo | | + / - | Zoom | | F | Fit to screen | | Esc | Deselect | ## Troubleshooting **Workflow not triggering** - Workflow is enabled (toggle ON) - Event name matches exactly (case-sensitive) - Contact exists and is subscribed **Execution stuck** - Check delay configuration - Verify wait timeout hasn't expired - No circular references **Email not sending** - Template exists - Contact is subscribed - Variables in data match template ## Best practices **Keep it simple** - 5-10 steps per workflow. Break complex flows into multiple workflows. **Descriptive names** - "Send Welcome Email - Day 0" not "Email 1" **Test first** - Always test with a test contact before enabling. **Space emails** - Minimum 12-24 hours between emails to avoid fatigue. ## Next steps - [Build your first workflow](/tutorials/welcome-series-workflow) - [Workflow patterns](/automation-patterns/workflow-patterns) - [Conditional branching](/automation-patterns/conditional-branching)