Human Approvals

Human-in-the-loop approvals

Voodflow 0.2 can pause a running workflow until a person decides. Use this for content review, spend limits, account changes, or any step that must not continue automatically.

Request Approval node

Type request_approval
Category Human
Effect Execution enters a waiting state until Approve / Reject (or timeout)

Typical flow:

  1. Upstream nodes prepare the payload (order, draft post, ticket, …).
  2. Request Approval notifies the approver (email and/or Filament Approvals inbox).
  3. The engine records a wait and stops progressing that branch.
  4. When someone decides, the workflow resumes from the approval node with the decision in context.

Channels

Configure which channels to use on the node (defaults include both):

  • Email — signed Approve / Reject links (uses app mailer / SMTP credential).
  • Database — row in the Filament Approvals resource for in-panel handling.

Key fields

Field Purpose
Approver email Supports {{tags}}. Used for mail and optional recipient match.
Approval title / reference Shown in the Approvals list (e.g. Order #{{id}}).
Approval key Stable dedupe key (e.g. order:{{id}}). Blocks duplicate pending/approved runs.
Subject / body Email content; HTML body supported.
Approve / Reject labels Button labels on the decision page.
Result titles / messages Shown after decide / timeout / already resolved.
Timeout (minutes) How long the wait stays open (default 1440 = 24h).
Page layout Optional Approval page layout for branded decide/result pages.

Filament Approvals inbox

Under the Voodflow navigation group:

  • Approvals — pending and resolved requests; notes; filters/search/sort.
  • Non–super_admin users typically see only approvals addressed to them.
  • Admins can bulk-delete and manage the full list.

Behaviour is controlled by config/voodflow.php → approvals:

Key Default Meaning
mail_enabled true Send approval emails
signed_url_minutes 10080 (7 days) Lifetime when wait has no expires_at
signed_url_grace_days 7 Extra days after wait expiry so result pages still open
require_authentication true Decide links need a logged-in user
require_recipient_match true Logged-in user must match the intended recipient when set
login_route Filament admin login Where guests are redirected
note_max_length 2000 Max length for decision notes

After the decision

On resume, downstream nodes can read approval metadata from the execution context (approved / rejected, notes, actor). Combine with If / Switch to branch on the outcome.