Workflow Approvals
Two-layer approval routing with risk-based lanes and dynamic step conditions for flexible approval chains
Overview#
Artifi uses a two-layer approval system to route write operations to the right people at the right level of scrutiny. This combination gives you powerful, fine-grained control over who approves what -- without building complex custom logic.
| Layer | Purpose | Controls |
|---|---|---|
| Lanes (green/yellow/red) | Risk level — how much scrutiny | Which approval steps execute |
| Step Conditions | Routing — who approves | Whether a step runs and who the approver is |
Why two layers? Lanes answer "does this need CFO approval?" while step conditions answer "which of our 10 regional managers should approve this specific vendor?"
Layer 1: Lane-Based Risk Assessment#
Lanes determine the risk level of a workflow submission and control which steps execute.
Payload → Lane Rules → Green | Yellow | Red → Step Execution Matrix
- Green lane: Low risk — skip most approval steps, auto-complete. Ideal for simple creates and trusted users.
- Yellow lane: Medium risk — single approval required. Used for updates to critical records and moderate amounts.
- Red lane: High risk — multi-level approval chain. Triggered by deletions, large transactions, or high-value changes.
Lane rules are configured in the Admin Dashboard under Workflows > Definitions > Steps > Lane Routing.
Layer 2: Step Conditions (Dynamic Approval Routing)#
Step conditions evaluate per step against the workflow payload to decide:
- Should this step run or be skipped?
- Who should approve this step?
Available Actions#
| Action | Effect |
|---|---|
skip_step | Step does not execute |
include_step | Step is explicitly included |
assign_to | Dynamically assign a specific approver |
auto_approve | Auto-approve this step without human review |
auto_reject | Auto-reject this step |
change_lane | Override the risk lane |
require_additional_approval | Add an extra approval step |
Condition Operators#
| Operator | Description | Example Value |
|---|---|---|
eq | Equals | "US" or 42 |
ne | Not equals | "draft" |
gt / gte | Greater than / Greater or equal | 50000 |
lt / lte | Less than / Less or equal | 100 |
in | In array | [1, 2, 3, 30] |
not_in | Not in array | ["draft", "cancelled"] |
contains | String contains | "amazon" |
matches | Regex match | ".*@competitor\\.com" |
exists | Field exists or not | true or false |
Field Paths#
Conditions reference fields in the workflow payload using dot notation for nested values:
vendor_id— top-level fieldtotal_amount— numeric field for threshold comparisonsdimensions.department— nested dimension valuelines.0.account_number— array element access
Condition Groups#
Conditions can be grouped with logical operators. Within a group, you control whether all conditions must match (AND) or any condition must match (OR). Groups are evaluated in order, and the first matching group determines the action.
Evaluation Priority#
When creating workflow steps:
- Lane-based skip (
skip_if_lane) — skips the step entirely based on lane - Step condition evaluation — skip, include, assign, or auto-complete
- Default (no conditions) — include the step with the default assignee
When assigning an approver to a task:
- Condition override (from step conditions)
- Submitter (if assignment strategy is "submitter")
- Approver rules (from step definition)
- Assigned user (specific user on step)
- Assigned role (role-based fallback)
Approver Rules#
Each workflow step can define static approver rules as the default assignee. Step conditions can override these dynamically.
| Rule Type | Description | Example |
|---|---|---|
role | Any user with this role | Route to any "manager" |
employee | Specific employee | Route to employee #6 |
dimension | Look up from transaction dimension metadata | Department "Engineering" has approver_employee_id: 6 in metadata |
submitter | Route back to the person who submitted | Self-approval for low-risk items |
Dimension-Based Routing#
The dimension approver type looks up the approver from the dimension value metadata. When a transaction comes in with dimensions.department = "ENGINEERING", the engine:
- Looks up the dimension value for "ENGINEERING"
- Reads the
approver_employee_idfrom its metadata - Finds the user linked to that employee
- Assigns the task to that user
This is configured in the Admin Dashboard under Workflows > Definitions > Steps > Edit Step > Approver Rules.
Practical Examples#
Example 1: 300 Vendors, 10 Approvers#
Problem: 300 vendors, each group of 30 needs a different approver.
Solution: One approval step with 10 assign_to conditions, each using the in operator to match a range of vendor IDs to a specific approver.
Result: When an AP invoice for vendor #35 is submitted, the step automatically routes to the correct approver.
Example 2: Department + Amount Threshold#
Problem: Department heads approve all expenses. CFO only approves expenses of $50,000 or more.
Solution: Two approval steps:
- Step 1 — Department Head Approval: Uses
assign_toconditions to route by department (Engineering, Marketing, Sales each go to their department head). - Step 2 — CFO Approval: Uses a
skip_stepcondition whentotal_amount < 50000.
Result:
- A $5k Engineering expense goes to the department head only.
- A $75k Marketing expense goes to the Marketing director, then to the CFO.
Example 3: Country-Based Compliance#
Problem: International vendors require a compliance review step; domestic vendors do not.
Solution: Add a skip_step condition on the "Compliance Review" step when country = "US". All non-US vendors automatically trigger the compliance review.
Example 4: Auto-Approve Small Recurring Items#
Problem: Small purchases from known recurring vendors should not require manual approval.
Solution: An AND condition group requiring both total_amount < 100 and vendor_id in [known vendor list] to trigger auto_approve. Both conditions must match for auto-approval.
How Lanes and Step Conditions Work Together#
Workflow Submitted
│
├── 1. LANE EVALUATION (risk level)
│ payload → lane rules → Green | Yellow | Red
│
├── 2. STEP CREATION (per step)
│ For each step in the workflow definition:
│ a. Lane skip? → SKIP if current lane is excluded
│ b. Step conditions? → skip / include / assign / auto-complete
│ c. No conditions? → INCLUDE with default assignee
│
├── 3. TASK ASSIGNMENT
│ Assignee = override > submitter > approver rules > role
│
└── 4. STEP ADVANCEMENT
Step completed → next pending step → assign task
All steps completed → execute workflow
Notifications#
Auto-Completed vs Human-Approved#
When a workflow completes, the notification email clearly distinguishes how it was processed:
| Scenario | Email Subject | Description |
|---|---|---|
| Human approved (yellow/red lane) | "Approved: Create Vendor" | Shows who approved and when |
| Auto-completed (green lane) | "Processed: Create Expense Report" | Indicates automatic processing with payload details |
| Rejected | "Rejected: Create Vendor" | Shows who rejected and their reason |
Auto-completed notifications include the payload details so the user can see exactly what was created (e.g., expense report title, amount, employee) without implying a human reviewed it.
Notification Template Types#
| Type | Purpose |
|---|---|
approval_request | Task assigned to an approver |
decision | Human approval or rejection result |
auto_completed | Automatically processed workflow result |
reminder | Overdue task reminder |
escalation | Escalated task notification |
Fallback Behavior#
| Scenario | Behavior |
|---|---|
| No conditions on step | Step always included, uses default assignee |
| Conditions exist but none match | Step included, uses default assignee |
| Assign-to condition matches but user not found | Task created without assignee (falls back to role) |
| All steps skipped by conditions | Workflow auto-completes |
Configuration Options#
Admin Dashboard (Available Now)#
- Lane rules (green/yellow/red conditions)
- Step creation, ordering, and deletion
- Step lane skip configuration
- Approver rules (role, employee, dimension, submitter)
- Escalation settings
Step Conditions#
Step conditions are currently configured through the API. An Admin UI for step condition management is planned for a future release.
Troubleshooting#
Step condition not matching#
- Verify the
field_pathmatches the actual payload key (case-sensitive) - Check that string values are properly formatted
- Verify the operator is correct (
eqnot==,gtenot>=) - For AND groups, all conditions must match
Approver not assigned#
- Check if the approver override is populated on the step
- Verify the employee-to-user link exists for employee-based assignment
- Verify a user with the required role exists in the organization
Subscribe to new posts
Get notified when we publish new insights on AI-native finance.