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:
- Upstream nodes prepare the payload (order, draft post, ticket, …).
- Request Approval notifies the approver (email and/or Filament Approvals inbox).
- The engine records a wait and stops progressing that branch.
- 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_adminusers typically see only approvals addressed to them. - Admins can bulk-delete and manage the full list.
Signed links & auth
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.
Related
- Approval page layouts
- Waits & signals
- Secrets
- Queue worker — required so waits can resume reliably