Approvals
CFFBRW supports human-in-the-loop workflows. When a workflow hits an approval gate, it pauses and waits for a human to approve or reject before continuing.
How Approval Gates Work
Add an approval step to your workflow markdown:
### 5. Manager approval
Review the invoice summary and approve or reject before creating the invoice.
This is a high-value transaction that requires human oversight.
The AI compiler recognizes approval language ("approve or reject", "requires human oversight", "review before proceeding") and creates a human_approval step.
When a Run Hits an Approval Gate
- The run pauses and its status changes to
pending_approval - The step node in the DAG turns purple with a pause icon
- An entry appears in the Approvals inbox (sidebar)
- Any workspace member can act on it
The Approvals Inbox
Go to Approvals in the sidebar to see all pending approval requests across your workspace.
Each approval shows:
- The workflow name
- The step that needs approval
- Context from previous steps (what data led to this point)
- How long it's been waiting
- Approve and Reject buttons
Approving or Rejecting
- Approve — The workflow resumes from the approval step and continues executing downstream steps
- Reject — The step outputs
{approved: false, comment: "..."}as data, and the workflow continues. Use a conditional step after the approval gate to branch on the result (e.g.,data.step_N.approved === true).
You can optionally add a comment with your decision. Comments are included in the step output and available to downstream steps.
Approval Types
Human Approval
Regular approval gates you design into your workflow. These wait up to 24 hours before timing out.
Use cases:
- Invoice approval over a threshold
- Content review before publishing
- Deployment sign-off
Recovery Approval
When Tier 2 AI recovery can't fix a step automatically, it may escalate to a human. These have a shorter 5-minute timeout and appear with a blue badge.
When you see a recovery approval, you can:
- Retry with hint — Type guidance (e.g., "the API expects snake_case keys") and the AI will re-attempt recovery with your hint
- Improve Plan — Navigate to the workflow editor to recompile the entire plan with feedback
Email Notifications
You can configure email notifications so approvers get notified without watching the dashboard.
In your workflow's Settings tab, add notification channels:
- Email — Send approval emails to specific addresses. Each email includes 3 links: view details (rich review page), one-click approve, and one-click reject. No login required.
- Webhook — Send a JSON payload to an external URL (Slack incoming webhook, custom integration, etc.)
BYOS (Bring Your Own Sender)
By default, approval emails are sent from approvals@cffbrw.com via the platform. If you prefer to send from your own domain:
- Install a Resend or SendGrid connector in Integrations
- Add the connector's ID to your email notification channel
Emails will be sent through your connector using your domain and sender identity.
Supported connectors: Only
resend-emailandsendgrid-emailconnectors work for BYOS approval email. These use an API key configured at setup time. The Gmail connector is not supported here — Gmail uses OAuth token injection and does not have a static API key available at approval dispatch time. Gmail BYOS support is planned for a future release. In the meantime, use Resend or SendGrid for custom sender identity.
Public Approval Page
When an approver clicks the "View details" link in the email, they see a public review page showing:
- Workflow name and step title
- The reason the step needs approval
- Gate type (human approval, recovery, or needs human input)
- Approve and Reject buttons with optional comment
This page works without any login. The link is signed with HMAC-SHA256 and expires after the gate's TTL (24 hours for human approval, 5 minutes for recovery).
Approval via API
You can also approve or reject via the API:
POST /v1/runs/:runId/approve/:stepIndex
{
"action": "approve",
"comment": "Looks good, proceed"
}
Actions: approve, reject, or retry_with_hint (for recovery gates, include guidance in comment).
This is useful for building custom approval UIs or integrating with external systems like Slack.
Best Practices
- Place approval gates before irreversible actions (sending emails, creating records, charging money)
- Use conditional branches to only require approval above a threshold (e.g., "if amount > $5,000")
- Keep approval step descriptions clear — the approver sees this context when deciding