Skip to content

Workflows & Approvals

Workflows orchestrate multi-step processes like approval chains, conditional routing, notifications, and automated actions. Each workflow is attached to a table and runs against individual records.

TriggerDescription
manualStarted by a user action
on_createAutomatically when a record is created
on_updateAutomatically when a record is updated
on_field_changeWhen a specific field changes
webhookStarted by an inbound webhook
pollStarted on a polling schedule
TypePurpose
approvalRequire one or more people to approve before proceeding
conditionBranch the workflow based on record data
automationRun a script
parallelRun several steps concurrently
external_actionCall a registered connector (provider action)
transformSet fields on the record
codeRun inline code
notificationSend a notification

Require one or more people to approve before proceeding:

{
"type": "approval",
"name": "Manager approval",
"approver_type": "role",
"approver_role": "manager",
"approval_mode": "any"
}

Approval modes (approval_mode):

ModeDescription
anyFirst approval is sufficient (default)
allEvery approver must approve
majorityMore than half must approve

Approver types (approver_type):

TypeResolves to
userA specific user (approver_id)
roleAnyone with a specific role (approver_role)
fieldThe user referenced in a record field (approver_field)
scriptUsers returned by a script (approver_script_id)
hierarchyThe approver’s manager(s) in the org hierarchy (hierarchy_levels)

When no approvers can be resolved, the step follows on_no_approvers: error (default) puts the workflow into an error state, skip continues via on_approve.

Branch the workflow based on data. Branches are evaluated in order; the first matching branch wins:

{
"type": "condition",
"name": "Route by amount",
"branches": [
{ "condition": "gt(amount, 10000)", "next_step": "vp_approval" },
{ "condition": "gt(amount, 1000)", "next_step": "manager_approval" }
],
"on_false": "auto_approve"
}

Run a script:

{
"type": "automation",
"name": "Generate invoice",
"script_id": "<script-uuid>"
}

Run multiple steps concurrently:

{
"type": "parallel",
"name": "Reviews",
"parallel_steps": [
{ "type": "approval", "name": "Legal review", "approver_role": "legal" },
{ "type": "approval", "name": "Finance review", "approver_role": "finance" }
],
"require_all": true
}

Set require_all to true to wait for every sub-step, or false to proceed as soon as the first completes.

Steps connect to one another by name through transition fields, including on_approve, on_reject, on_timeout, on_success, on_error, on_true, on_false, and on_complete. Use the special targets complete_workflow and reject_workflow to finish a workflow.

Configure automatic escalation when approvals stall. An escalation chain is a series of levels, each with its own approver and timeout:

{
"type": "approval",
"name": "Manager approval",
"approver_role": "manager",
"timeout_hours": 48,
"escalation_chain": [
{ "approver_type": "role", "approver_role": "director", "timeout_hours": 24 }
]
}

Use escalation_notify to list additional users to notify when a step escalates.

A workflow can keep a record’s own status field in sync with the workflow’s progress by declaring a status_mapping (submitted / approved / rejected / canceled / error values), so the record reflects the outcome without a separate rule.

Users can delegate their approval responsibility to another user when they’re unavailable. Delegations can be scoped to all approvals, a single application, or a specific workflow, and can be time-bounded.

  • Cancel a workflow in progress (when the definition allows it)
  • Recall a submitted workflow (initiator only, or admin — withdraws the workflow and cancels pending approvals)
  • Admin override — approve or reject on behalf of another user
  • Transfer pending approvals from one user to another

Every workflow step transition is recorded: started, approved, rejected, delegated, escalated, transferred, canceled, and completed events, including who acted, when, and any comments provided.