Skip to content

Executions & Logs

Every time a workflow runs, Voodflow creates a detailed Execution record that captures the full state of the run — inputs, outputs, timing, variables, and errors at both the workflow and per-node level.

Execution Lifecycle

pending → running → success
                 → failed
                 → cancelled
StatusDescription
pendingJob dispatched to queue, not yet started
runningActively executing nodes
successAll nodes completed without error
failedOne or more nodes failed and no error recovery path handled it
cancelledManually cancelled by a user

Execution Record Fields

FieldTypeDescription
idintegerUnique execution ID
workflow_idintegerParent workflow
statusenumCurrent status
trigger_typestringschedule, event, webhook, manual
workflow_versionstringSnapshot of the workflow at execution time
environmentstringproduction, staging, local
retry_attemptinteger0 = first attempt, 1+ = retry
started_atdatetimeExecution start time
finished_atdatetimeExecution end time
input_contextjsonThe trigger payload that started the execution
contextjsonFinal context state (vars, node results, errors)

Per-Node Execution Records

Each node execution is recorded in voodflow_execution_nodes:

FieldDescription
node_idReference to the node definition
node_typee.g. http_request, send_mail_node
statussuccess, failed, skipped
inputData this node received
outputData this node produced
started_atNode execution start
finished_atNode execution end
duration_msComputed duration in milliseconds
error_messageError text if status = failed
retry_countHow many times this node was retried

Browsing Executions

Navigate to Voodflow → Executions to see a paginated table of all executions with:

  • Workflow name
  • Status badge
  • Trigger type
  • Start time and duration
  • Quick link to per-node details

Click any execution row to drill into the Execution Detail view, which shows a timeline of every node with expandable input/output panels.

Log Entries

ExecutionLogEntry records are structured log lines emitted during execution:

execution_id | node_id | level | message | context | created_at

Levels: debug, info, warning, error

These logs are visible in the Execution Detail view and queryable via the Eloquent model:

php
$execution->logs()->where('level', 'error')->get();

Log Retention

Execution records and log entries can be automatically pruned to control database growth. This is done via the voodflow:cleanup-logs command:

bash
php artisan voodflow:cleanup-logs

Default retention is taken from VoodflowSettings->log_retention_days. In addition, each workflow can override the retention window via workflow.metadata['log_retention_days'] (so you can keep logs longer for important workflows, and shorter for low-value ones).

You can also run targeted cleanup:

bash
# Use a specific retention window (override the default)
php artisan voodflow:cleanup-logs --days=30

# Cleanup only one workflow by ID
php artisan voodflow:cleanup-logs --workflow=123

See Log Retention for a full retention policy guide, including GDPR considerations.

Retry Logic

Failed executions can be retried:

  1. Automatic retry (per workflow) — Voodflow reads the retry configuration from workflow.metadata.retry_policy and uses the queue worker retries to re-attempt the same Execution when a retryable error occurs (network / timeout / rate limit). Automatic retry is driven by the job being retried by the queue worker; it does not depend on the presence of a Catch node. After retries are exhausted (or for non-retryable errors), the execution is marked as failed and (if a Catch node is connected after the failing step) the workflow can route to an error/recovery branch.
  2. Manual retry / Resume — in the Execution detail view, click Resume Execution to re-run from where it failed (this increments retry_attempt).

Catch behavior (success vs error)

Catch is designed to sit immediately after a node that may fail (e.g. send_webhook) and route to one of two outputs:

  • success: upstream node succeeded (normal pass-through)
  • error: upstream node failed (Catch enriches output with _caught_error when enabled)

Important: Voodflow treats Catch as a gate based on the incoming payload. It will not re-catch historical errors from earlier attempts once the upstream node succeeds (e.g. after a manual resume).

Manual vs Auto counters

  • retry_attempt counts manual resume attempts (0 = never resumed, 1+ = resumed by a user).
  • Automatic queue retries are tracked in context.meta:
    • queue_attempt: 0-based attempt index (0 on first run, 1 on first automatic retry, ...)
    • queue_attempt_number: 1-based attempt number (Laravel queue)
    • queue_laravel_attempt_number: raw Laravel attempts() value (diagnostics)
    • queue_max_attempts: configured max attempts for this job
    • queue_next_attempt_number and queue_next_delay_ms: when an auto-retry is scheduled

Manual resume does not create a new Execution record — it resumes the same execution and increments retry_attempt.

Context Object Structure

The context JSON column contains the full execution state:

json
{
  "meta": {
    "workflow_id": 42,
    "started_at": "2025-03-16T08:00:00Z"
  },
  "vars": {
    "my_variable": "some_value"
  },
  "nodes": {
    "node_uuid_1": { "output": { ... }, "status": "success" },
    "node_uuid_2": { "output": { ... }, "status": "success" }
  },
  "errors": []
}

Proprietary software — source-available. All rights reserved.