EzFlowEzFlow Docs
Jobs & Actions

Job & action model

How EzFlow models jobs, actions, retries, and failure handling.

Every Workflow execution is modelled as a Job containing one Action per node that ran. This page documents the fields on each record and explains the outbox pattern EzFlow uses to keep execution state durable.

See Executions & Jobs for a higher-level explanation of how a run progresses.

Job

A Job is created when a Workflow trigger fires (or a test run begins) and tracks the full execution.

FieldTypeWhat it is
idstringUnique identifier (CUID)
statusstringCurrent state of the run (e.g. COMPLETED, WAITING)
startedAtdatetimeWhen execution began
finishedAtdatetime?When execution ended — null if the Job is still running or WAITING
durationfloat?Total wall-clock time in milliseconds
workflowIdstringThe Workflow that owns this run
firedTriggerIdstring?The FiredTrigger record that initiated this run, if trigger-driven
tenantIdstringThe workspace that owns this Job
originIpstring?IP address of the request that started the run (HTTP triggers only)

Action

An Action is created for each node that executes within a Job.

FieldTypeWhat it is
idstringUnique identifier (CUID)
moduleTypestringThe node type that ran (e.g. SEND_WHATSAPP, LLM_COMPLETION, CONDITIONAL)
moduleIdstringThe node's ID within the Workflow DAG
statusstringWhether the node succeeded or failed
payloadstringSerialised input data the node received
outputJSON?The data the node produced for downstream nodes
startedAtdatetimeWhen this node began executing
finishedAtdatetime?When this node finished
durationfloat?Time the node took, in milliseconds
jobIdstring?The parent Job

The outbox pattern

EzFlow uses an outbox pattern to guarantee that Job and Action records are written durably even if a failure occurs mid-execution.

JobOutbox

Buffers a new Job record before it is committed to the main jobs table. The status field cycles through:

ValueMeaning
WAITINGThe Job has been queued but not yet committed
READYReady for the consumer to pick up and write
SENTThe record has been written to the main table
REMOVEMarked for cleanup

The version field enables optimistic concurrency so concurrent consumers do not double-write the same Job.

ActionOutbox

Mirrors the Action record structure and similarly buffers per-node results before they are committed. It includes a tenantId field for tenant-scoped writes, ensuring every node's output is persisted even if a subsequent node fails.

Failure tracking

When a node fails, EzFlow records a FailedItem linked to the Job. Key fields:

FieldWhat it is
trackingIdCorrelation ID propagated through the run
errorType / errorMessageThe failure details
nodeTypeThe moduleType of the node that failed
maxAttemptsMaximum number of retry attempts configured for this node
retryAttemptHow many retries have been attempted so far
nextRetryAtWhen the next retry is scheduled

Each retry attempt is logged in a RetryAttempt record with its scheduled time, execution time, status, delay, and any error message.

On this page