Execution lifecycle
An execution is one run of a workflow. It starts with a trigger fire, moves through a sequence of states, and ends at a terminal state. This page maps the journey.
The state machine
┌──────────┐
│ pending │ ← queued, waiting for a worker
└─────┬────┘
▼
┌──────────┐
│ running │ ← currently executing
└─────┬────┘
├─────────────────┬─────────────────┬─────────────────┐
▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────────┐
│ success │ │ failed │ │timed out │ │waitingForInput │
└──────────┘ └──────────┘ └──────────┘ └────────┬───────┘
│
▼
(back to running
after resume)
┌────────────┐
│ cancelled │ ← user pressed Stop at any point during pending or running
└────────────┘Terminal states (run is finished, won't change): success, failed, cancelled, timeout.
Non-terminal: pending, running, waitingForInput.
The states in detail
Pending
The trigger fired. The execution row has been written to the database. Now it sits in the queue (RabbitMQ) waiting for a worker to pick it up.
Typical duration: milliseconds to seconds. Longer means the workers are saturated, see Monitoring dashboard.
Running
A worker has the execution. It's evaluating nodes one at a time, in topological order.
Typical duration: depends entirely on what the workflow does. From milliseconds for an "if/log" to many minutes for big data sync workflows.
Success
The workflow reached its terminal state, either a Terminal node, or simply ran out of downstream nodes. Final output is captured. Execution row is closed.
Failed
A node threw an exception that wasn't caught (no Error Handling node, no continue on fail). The workflow's error policy setting decides whether this propagates to overall failed status.
The failure is recorded with the failing node, the exception type and message, and a stack trace (developer-facing, in the inspector's "Raw" tab).
Cancelled
Someone clicked Stop, or the API was called with a cancel request. The currently executing node is allowed to complete; no further nodes run.
Timeout
The workflow exceeded its executionTimeout (default 5 minutes; configurable in workflow settings). The execution is force-stopped.
WaitingForInput
A node (typically Approval) paused. The execution is durable, workers can be restarted and the wait continues. When the approver responds, the workflow resumes.
There's no timeout on waitingForInput by default; approvals can sit for days. The Approval node has its own timeout setting if you want one.
Sub-state: per-node statuses
Inside a running execution, each node has its own status:
| Status | Meaning |
|---|---|
pending |
Not yet reached |
running |
Currently executing |
success |
Completed cleanly |
failed |
Threw an exception |
skipped |
Intentionally not run (e.g. on the wrong branch of an If) |
disabled |
Marked disabled by the user |
waiting |
Paused (approval, delay, sub-workflow) |
You see these as the colours on the canvas during a live run, and in the timeline on the execution detail page after.
What's stored
For every execution:
- Execution ID (UUID).
- Workflow ID and version.
- Trigger metadata (which trigger, what input).
- Start time, end time, duration.
- Final status.
- Per-node timeline: status, start / end, input, output, errors.
- Final output (terminal node).
- Cost metrics (tokens, API calls, $).
- Worker / region info.
Stored for the retention period configured in workspace settings (default 30 days). Older executions are purged.
Sandbox executions
A run made in sandbox mode is tagged sandbox: true and stored separately from production execution history (unless you opt to mix them). They have all the same state transitions and metadata but are filtered out of "real" execution counts in the monitoring dashboard.
Tips & gotchas
pendinglonger than 30 seconds usually means the queue is backed up. Check the dashboard, scale workers.waitingForInputis not stuck. Approvals can sit indefinitely. To unstick, find the run in/logs, then resolve the approval in/approvals.- Execution IDs are immutable and unique, safe to share in tickets ("see exec
abc-123for repro"). - Storage cost scales with retention × executions per day. Set retention deliberately. 30 days is generous for most teams; compliance regimes may want longer.
Related
Found something out of date? This page lives in the Flero docs content set.