Conditional Routing
Intelligent workflow routing based on form data and business rules
Conditional Routing
Conditional routing enables intelligent, dynamic workflow paths based on form data, business rules, and complex expressions. This powerful feature allows workflows to automatically adapt to different scenarios without manual intervention.
📋 Overview
Conditional split steps (conditional_split) evaluate expressions against form data and route requests to different workflow paths based on the results. This eliminates the need for manual decision-making in predictable scenarios.
💰 Amount-Based Routing
The most common conditional routing pattern: different approval paths based on monetary values.
Basic Amount Routing
amount_check:
name: "amount_check"
type: "conditional_split"
description: "Route based on request amount"
choices:
- conditions: "amount > 10000"
continue_to: "ceo_approval"
- conditions: "amount > 1000"
continue_to: "manager_approval"
default:
continue_to: "auto_approve"Advanced Amount Logic
expense_routing:
name: "expense_routing"
type: "conditional_split"
description: "Expense approval routing"
choices:
# Executive approval for very high amounts
- conditions: "total_amount > 50000"
continue_to: "executive_committee"
# Finance approval for medium-high amounts
- conditions: "total_amount > 5000"
continue_to: "finance_director"
# Manager approval for moderate amounts
- conditions: "total_amount > 500"
continue_to: "manager_approval"
# Auto-approve small amounts
default:
continue_to: "auto_processing"🏢 Department-Based Routing
Route requests based on organizational structure and department-specific requirements.
Department Routing Implementation
department_routing:
name: "department_routing"
type: "conditional_split"
description: "Route by department"
choices:
# Engineering requests go to CTO
- conditions: "department == 'engineering'"
continue_to: "cto_approval"
# Finance requests need CFO approval
- conditions: "department in ['finance', 'accounting']"
continue_to: "cfo_approval"
# Legal matters require legal review
- conditions: "department == 'legal'"
continue_to: "legal_review"
# Sales and marketing requests
- conditions: "department in ['sales', 'marketing']"
continue_to: "revenue_team_approval"
default:
continue_to: "department_head_approval"🚨 Complex Multi-Criteria Logic
Combine multiple conditions for sophisticated business rule implementation.
Multi-Criteria Implementation
advanced_routing:
name: "advanced_routing"
type: "conditional_split"
description: "Advanced Expression Routing"
choices:
# CEO approval for critical high-value requests
- conditions: "amount > 100000 and urgency == 'critical'"
continue_to: "ceo_approval"
# CFO approval for budget-impacting expenses
- conditions: "amount > 50000 and ('budget' in tags or category == 'consulting')"
continue_to: "cfo_approval"
# CTO approval for engineering technology purchases
- conditions: "department == 'engineering' and amount > 30000 and category in ['equipment', 'software']"
continue_to: "cto_approval"
# Legal approval for high-value legal matters
- conditions: "department == 'legal' and amount > 25000"
continue_to: "legal_approval"
# Urgent requests get expedited processing
- conditions: "urgency == 'critical' or (urgency == 'high' and priority >= 3)"
continue_to: "expedited_approval"
# Compliance review for flagged requests
- conditions: "'compliance' in tags and amount > 5000"
continue_to: "compliance_review"
default:
continue_to: "standard_approval"📝 Expression Syntax Guide
Comparison Operators
# Numeric comparisons
conditions: "amount > 1000"
conditions: "total_cost <= 5000"
conditions: "priority >= 3"
conditions: "quantity != 0"
# String equality
conditions: "department == 'engineering'"
conditions: "status != 'draft'"
conditions: "urgency == 'high'"Logical Operators
# AND logic
conditions: "amount > 10000 and urgency == 'critical'"
# OR logic
conditions: "department == 'legal' or department == 'compliance'"
# NOT logic
conditions: "not (status == 'cancelled')"
# Complex combinations
conditions: "(amount > 50000 and urgency == 'high') or (department == 'finance' and amount > 25000)"List Operations
# Membership testing
conditions: "category in ['equipment', 'software', 'hardware']"
conditions: "department in ['sales', 'marketing']"
# Tag checking
conditions: "'urgent' in tags"
conditions: "'budget_approved' in tags"
# Multiple list operations
conditions: "category in ['consulting', 'training'] and 'approved_vendor' in tags"Date and Time Conditions
# Date comparisons (assuming proper date format)
conditions: "expense_date >= '2024-01-01'"
conditions: "due_date <= today"
# Time-based logic
conditions: "created_at > last_month"
conditions: "travel_start_date > today + 7_days"🔄 Real-World Scenarios
IT Equipment Request Routing
it_equipment_routing:
name: "it_equipment_routing"
type: "conditional_split"
description: "IT Equipment Request Routing"
choices:
# High-value equipment needs IT director approval
- conditions: "equipment_cost > 5000"
continue_to: "it_director_approval"
# Security equipment needs additional security review
- conditions: "category == 'security' and equipment_cost > 1000"
continue_to: "security_review"
# Bulk orders need procurement involvement
- conditions: "quantity > 10 or total_cost > 10000"
continue_to: "procurement_review"
# Standard equipment for managers and above
- conditions: "requestor_level in ['manager', 'director', 'vp'] and equipment_cost <= 2000"
continue_to: "auto_approve"
default:
continue_to: "manager_approval"Travel Expense Routing
travel_expense_routing:
name: "travel_expense_routing"
type: "conditional_split"
description: "Travel Expense Approval Routing"
choices:
# International travel needs additional approvals
- conditions: "travel_type == 'international' and total_amount > 3000"
continue_to: "international_travel_approval"
# Conference and training expenses
- conditions: "expense_type == 'conference' and total_amount > 2000"
continue_to: "training_budget_approval"
# Client-related travel
- conditions: "'client_visit' in purpose and total_amount > 1500"
continue_to: "sales_director_approval"
# Regular business travel
- conditions: "travel_type == 'domestic' and total_amount > 1000"
continue_to: "manager_approval"
default:
continue_to: "auto_processing"Purchase Order Complexity
purchase_order_routing:
name: "purchase_order_routing"
type: "conditional_split"
description: "Purchase Order Routing Logic"
choices:
# New vendor requires additional vetting
- conditions: "vendor_status == 'new' and total_amount > 5000"
continue_to: "vendor_approval_process"
# Capital expenditure approval
- conditions: "expense_type == 'capex' and total_amount > 25000"
continue_to: "capex_approval_committee"
# Recurring orders from approved vendors
- conditions: "order_type == 'recurring' and vendor_status == 'approved' and total_amount <= previous_order_amount * 1.1"
continue_to: "auto_approve"
# Urgent procurement
- conditions: "urgency == 'critical' and total_amount <= urgent_approval_limit"
continue_to: "emergency_approval"
# Multi-department impact
- conditions: "affected_departments.length > 2 and total_amount > 15000"
continue_to: "multi_department_approval"
default:
continue_to: "standard_procurement_approval"⚙️ Advanced Patterns
Nested Conditionals
primary_routing:
name: "primary_routing"
type: "conditional_split"
choices:
- conditions: "amount > 50000"
continue_to: "high_value_routing"
- conditions: "department == 'engineering'"
continue_to: "engineering_routing"
default:
continue_to: "standard_approval"
high_value_routing:
name: "high_value_routing"
type: "conditional_split"
choices:
- conditions: "amount > 100000"
continue_to: "board_approval"
- conditions: "urgency == 'critical'"
continue_to: "ceo_approval"
default:
continue_to: "cfo_approval"Dynamic Approval Limits
dynamic_approval_routing:
name: "dynamic_approval_routing"
type: "conditional_split"
choices:
# Use dynamic approval limits based on requestor level
- conditions: "amount > requestor.approval_limit"
continue_to: "escalated_approval"
# Department-specific limits
- conditions: "amount > department_budget.monthly_limit * 0.1"
continue_to: "budget_review"
default:
continue_to: "within_authority_approval"📊 Performance Considerations
Expression Optimization
- Order Conditions by Frequency: Place most common conditions first
- Use Simple Expressions: Complex expressions take longer to evaluate
- Cache Dynamic Values: Pre-calculate frequently used values
- Minimize Database Lookups: Avoid complex joins in conditions
Best Practices
- Clear Condition Logic: Make expressions readable and maintainable
- Document Complex Rules: Add comments explaining business logic
- Test Edge Cases: Verify behavior with boundary values
- Monitor Performance: Track evaluation times for complex expressions
Next Steps:
- Explore Parallel Approval for committee-based decisions
- Learn about Form Integration to capture the right data for routing
- See Complete Examples of conditional routing in action