Debugging
Debug and troubleshoot your workflows
Debug your workflows to understand execution flow, identify issues, and optimize performance.
Debug Mode Overview
The workflow debugger lets you:
- Step through execution node by node
- Inspect variable values at each step
- Set breakpoints to pause execution
- View execution timing and performance
- Analyze errors and failures
Starting Debug Mode
From the Builder
- Open your workflow in the builder
- Click Debug in the toolbar
- Provide test input data
- Click Start Debug
From Execution History
- Go to workflow executions list
- Click on any execution
- Click Replay in Debug Mode
Debug Controls
┌─────────────────────────────────────────────────────────────┐
│ Debug Controls │
├─────────────────────────────────────────────────────────────┤
│ [▶ Continue] [→ Step Over] [↓ Step Into] [■ Stop] │
│ │
│ Breakpoints: 2 active Execution: Paused │
└─────────────────────────────────────────────────────────────┘
Control Actions
| Control | Shortcut | Description |
|---|---|---|
| Continue | F5 | Run until next breakpoint |
| Step Over | F10 | Execute current node, move to next |
| Step Into | F11 | Enter sub-workflow or loop |
| Step Out | Shift+F11 | Exit current sub-workflow or loop |
| Stop | Shift+F5 | Stop debug session |
| Restart | Ctrl+Shift+F5 | Restart from beginning |
Breakpoints
Setting Breakpoints
- Click the dot icon on any node's left edge
- Red dot indicates active breakpoint
- Click again to remove
Breakpoint Types
| Type | Icon | Description |
|---|---|---|
| Standard | 🔴 | Always pause |
| Conditional | 🟡 | Pause when condition is true |
| Log | 🔵 | Log message without pausing |
Conditional Breakpoints
Right-click a breakpoint to add a condition:
javascript// Pause only when amount exceeds threshold {{ input.amount > 1000 }} // Pause on specific customer {{ input.customer_id == 'cust_123' }} // Pause on error condition {{ nodes.api_call.response.status >= 400 }}
Log Points
Log values without stopping:
javascript// Log current state "Processing order {{ input.order_id }} - Amount: {{ input.amount }}" // Log node output "API Response: {{ nodes.http_request.response.status }}"
Debug Panel
Variables Tab
View all variables at current execution point:
┌─────────────────────────────────────────────┐
│ Variables │
├─────────────────────────────────────────────┤
│ ▼ input │
│ ├─ customer_id: "cust_abc123" │
│ ├─ amount: 150.00 │
│ └─ items: Array(3) │
│ │
│ ▼ nodes │
│ └─ ▼ http_request_1 │
│ └─ ▼ response │
│ ├─ status: 200 │
│ └─ body: {...} │
│ │
│ ▼ variables │
│ ├─ order_total: 450.00 │
│ └─ is_premium: true │
└─────────────────────────────────────────────┘
Call Stack Tab
View the execution path:
┌─────────────────────────────────────────────┐
│ Call Stack │
├─────────────────────────────────────────────┤
│ → [Current] Process Order │
│ ├─ Webhook Trigger │
│ ├─ Validate Input │
│ ├─ Get Customer ← paused here │
│ ├─ Calculate Total (pending) │
│ └─ Send Confirmation (pending) │
└─────────────────────────────────────────────┘
Output Tab
View node output and logs:
┌─────────────────────────────────────────────┐
│ Output │
├─────────────────────────────────────────────┤
│ [14:30:01] Webhook received │
│ [14:30:01] Input validated successfully │
│ [14:30:02] GET /api/customers/cust_abc123 │
│ [14:30:02] Response: 200 OK (145ms) │
│ [14:30:02] ▶ Paused at breakpoint │
└─────────────────────────────────────────────┘
Performance Tab
View timing information:
┌─────────────────────────────────────────────┐
│ Performance │
├─────────────────────────────────────────────┤
│ Node Duration Status │
│ ───────────────────────────────────────── │
│ Webhook Trigger 2ms ✓ │
│ Validate Input 5ms ✓ │
│ Get Customer 145ms ✓ │
│ Calculate Total - ◯ │
│ Send Confirmation - ◯ │
│ ───────────────────────────────────────── │
│ Total 152ms │
└─────────────────────────────────────────────┘
Test Input
Providing Test Data
json{ "customer_id": "cust_abc123", "amount": 150.00, "items": [ { "id": "item_1", "name": "Widget", "price": 50.00 } ], "metadata": { "source": "web", "campaign": "summer_sale" } }
Input History
Recent test inputs are saved:
- Click the clock icon in test input
- Select from recent inputs
- Or save current input with a name
Input Templates
Create reusable test templates:
json{ "name": "Premium Customer Order", "input": { "customer_id": "cust_premium", "customer_tier": "premium", "amount": 5000.00 } }
Execution History
Viewing Past Executions
- Go to Workflows > [Your Workflow] > Executions
- Filter by status, date, or trigger type
- Click any execution to view details
Execution Details
Each execution shows:
- Status: success, failed, running, cancelled
- Duration: Total execution time
- Trigger: What started the workflow
- Input: Original input data
- Output: Final output
- Nodes: Per-node execution details
- Errors: Any errors that occurred
Replaying Executions
To debug a past execution:
- Open execution details
- Click Replay
- Optionally modify input
- Debug with original context
Error Analysis
Error Details
When a node fails:
┌─────────────────────────────────────────────┐
│ Error in: HTTP Request - Get Customer │
├─────────────────────────────────────────────┤
│ Type: HTTP Error │
│ Status: 404 │
│ Message: Customer not found │
│ │
│ Request: │
│ GET https://api.example.com/customers/123 │
│ │
│ Response: │
│ {"error": "Customer not found"} │
│ │
│ Stack Trace: │
│ at HTTPExecutor.execute (line 45) │
│ at WorkflowEngine.runNode (line 123) │
└─────────────────────────────────────────────┘
Common Error Types
| Error | Cause | Solution |
|---|---|---|
| Timeout | Request too slow | Increase timeout or optimize |
| HTTP 4xx | Client error | Check request parameters |
| HTTP 5xx | Server error | Retry or check service |
| Parse Error | Invalid JSON | Validate data format |
| Type Error | Wrong data type | Check variable types |
| Reference Error | Missing variable | Check variable exists |
Live Debugging
Watch Expressions
Add expressions to monitor:
javascript// Watch these values as you step through input.amount variables.order_total nodes.api_call.response.status input.items.length
Edit and Continue
Modify values during debug:
- Pause at a breakpoint
- Click edit icon on any variable
- Change the value
- Continue execution with new value
Hot Reload
Update node configuration while debugging:
- Pause execution
- Edit node settings
- Changes apply immediately
- Continue with updated config
Debug Tips
Effective Breakpoint Placement
[Trigger] → [Validate] → 🔴 [API Call] → [Process] → 🔴 [Send]
↑ ↑
Check API response Verify final output
Debug Strategies
- Binary Search: Place breakpoint in middle, narrow down
- Data Flow: Follow data from input to output
- Error First: Start from failing node, work backwards
- Isolation: Test suspicious nodes individually
Performance Debugging
- Enable performance tab
- Identify slow nodes (>1s)
- Check for:
- Slow API calls
- Large data processing
- Unnecessary loops
- Missing parallelization
Debugging Sub-Workflows
Entering Sub-Workflows
When you hit a sub-workflow node:
- Step Over: Execute entire sub-workflow
- Step Into: Enter and debug sub-workflow
Sub-Workflow Context
Inside a sub-workflow:
- Access parent input via
{{ parent.input }} - View parent variables in Variables panel
- Return to parent with Step Out
Debugging Loops
Loop Iteration Control
┌─────────────────────────────────────────────┐
│ Loop: Process Items (iteration 3 of 10) │
├─────────────────────────────────────────────┤
│ [⏮ First] [◀ Prev] [▶ Next] [⏭ Last] │
│ │
│ Current Item: │
│ { "id": "item_3", "price": 29.99 } │
│ │
│ Loop Variables: │
│ index: 2 │
│ is_first: false │
│ is_last: false │
└─────────────────────────────────────────────┘
Skip to Iteration
Jump to specific iteration:
- Click iteration counter
- Enter iteration number
- Debug continues from that point
Next Steps
- Error Handling - Handle failures gracefully
- Variables - Work with data
- Builder Interface - Master the builder