From salesforce-master
Outlines best practices for Salesforce Flow Orchestrator (2025) to build multi-user, multi-stage workflows with approvals, fault paths, and no-code automation.
npx claudepluginhub josiahsiegel/claude-plugin-marketplace --plugin salesforce-masterThis skill uses the workspace's default tool permissions.
**MANDATORY: Always Use Backslashes on Windows for File Paths**
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
MANDATORY: Always Use Backslashes on Windows for File Paths
When using Edit or Write tools on Windows, you MUST use backslashes (\) in file paths, NOT forward slashes (/).
Examples:
D:/repos/project/file.tsxD:\repos\project\file.tsxThis applies to:
NEVER create new documentation files unless explicitly requested by the user.
Flow Orchestrator enables you to orchestrate multi-user, multi-step, and multi-stage business processes without code. It allows different users to complete sequential tasks within a unified workflow, with built-in approvals, conditional logic, and error handling.
Key Capabilities:
| Use Case | Flow Orchestrator? | Why |
|---|---|---|
| Employee Onboarding (HR โ IT โ Manager) | โ Yes | Multi-user, sequential stages |
| Quote-to-Cash (Sales โ Finance โ Operations) | โ Yes | Cross-functional approval process |
| Case Escalation (L1 โ L2 โ L3 Support) | โ Yes | Tiered assignment with SLAs |
| Simple record automation (create/update) | โ No | Use Record-Triggered Flow |
| Single-user process | โ No | Use Screen Flow |
| Batch data processing | โ No | Use Scheduled Flow or Apex Batch |
Orchestration = Stages โ Steps โ Background Automations
Stage 1: "HR Review"
โโ Step 1.1: Interactive Step (HR Manager reviews)
โโ Step 1.2: Background Automation (create records)
โโ Decision: Approved? โ Next Stage : End
Stage 2: "IT Provisioning"
โโ Step 2.1: Interactive Step (IT assigns equipment)
โโ Step 2.2: Background Automation (provision accounts)
โโ Step 2.3: Interactive Step (IT confirms completion)
Stage 3: "Manager Onboarding"
โโ Step 3.1: Interactive Step (Manager schedules 1:1)
โโ Step 3.2: Background Automation (send welcome email)
Requirements:
Setup โ Flows โ New Flow โ Orchestration
Name: Employee_Onboarding
Object: Employee__c (custom object)
Trigger: Record Created, Status = 'Pending Onboarding'
Stage 1: HR Document Review
Stage Name: HR_Document_Review
Stage Description: HR verifies employee documentation
Run Mode: One at a Time (sequential)
Step 1.1 (Interactive):
- Name: Review_Documents
- Assigned To: Queue "HR_Onboarding_Queue"
- Due Date: 2 days from start
- Screen Flow: HR_Document_Review_Screen
- Inputs: Employee__c.Id
Step 1.2 (Background - Decision):
- If HR_Approved = true โ Next Stage
- If HR_Approved = false โ End + Send Rejection Email
Stage 2: IT Provisioning
Stage Name: IT_Provisioning
Condition: Runs only if Stage 1 approved
Step 2.1 (Interactive):
- Name: Assign_Equipment
- Assigned To: Queue "IT_Provisioning_Queue"
- Due Date: 3 days from stage start
- Screen Flow: IT_Equipment_Assignment
- Inputs: Employee__c.Id
Step 2.2 (Background):
- Name: Create_AD_Account
- Autolaunched Flow: Create_Active_Directory_Account
- Inputs: Employee__c.Email, Employee__c.FirstName
Step 2.3 (Background):
- Name: Send_IT_Confirmation
- Action: Send Email Template
- Recipient: Employee__c.Email
- Template: Welcome_Email
Stage 3: Manager Setup
Stage Name: Manager_Setup
Depends On: Stage 2 complete
Step 3.1 (Interactive):
- Name: Schedule_First_Day
- Assigned To: Employee__c.Manager__c
- Due Date: 1 day from stage start
- Screen Flow: Manager_Onboarding_Tasks
Step 3.2 (Background):
- Name: Update_Status
- Record Update: Employee__c.Status = 'Onboarding Complete'
Fault Path on IT Provisioning Failure:
If Step 2.2 (Create_AD_Account) fails:
โโ Retry Step (1 attempt after 10 minutes)
โโ If still fails:
โ โโ Send email to IT Manager with error details
โ โโ Create Task for manual provisioning
โ โโ Assign Interactive Step to IT Manager for resolution
โโ Continue to Stage 3 (don't block entire process)
Configuration:
Step 2.2: Create_AD_Account
โโ Fault Path Enabled: true
โโ Retry Attempts: 1
โโ Retry Delay: 10 minutes
โโ On Final Failure:
โโ Create Task
โ โโ Subject: "Manual AD Account Creation Needed"
โ โโ Assigned To: IT_Manager_Queue
โ โโ Priority: High
โโ Send Email Notification
โโ Template: IT_Provisioning_Failure
โโ Recipients: IT Managers
Use for: Actions requiring human judgment or input
Interactive Step Configuration:
โโ Screen Flow: Define UI for user input
โโ Assigned To: User, Queue, or Role
โโ Due Date: Formula (TODAY() + 2 for 2 days)
โโ Instructions: What user should do
โโ Input Variables: Data passed to screen flow
โโ Output Variables: Data returned from user
Example Screen Flow (HR Review):
Screen: Review Documents
โโ Display: Employee Name, Position, Documents Uploaded
โโ Input: Radio Button (Approve / Reject)
โโ Input: Text Area (Comments - required if reject)
โโ Action: Save & Submit
Output Variables:
- HR_Approved (Boolean)
- HR_Comments (Text)
Use for: Automated actions without user interaction
Background Step Types:
โโ Autolaunched Flow: Call another flow
โโ Apex Action: Invoke Apex method
โโ Send Email: Email template or custom
โโ Post to Chatter: Notify users
โโ Create Records: DML operations
โโ Update Records: Field updates
โโ External Service: REST callout
โโ Wait: Pause for duration or until condition
Use Case: Skip stages based on criteria
Stage 2: Manager Approval
Condition: Order_Total__c > 10000
Entry Criteria Formula:
{!$Record.Order_Total__c} > 10000
Result:
- If order <= $10,000 โ Skip Stage 2, go to Stage 3
- If order > $10,000 โ Execute Stage 2 (manager approval required)
Use Case: Multiple teams work simultaneously
Stage 3: Parallel Provisioning
Run Mode: All at Once (parallel)
Step 3.1 (Interactive): IT assigns laptop [Assigned to IT Queue]
Step 3.2 (Interactive): Facilities assigns desk [Assigned to Facilities Queue]
Step 3.3 (Interactive): HR orders business cards [Assigned to HR Queue]
Stage completes when: All steps complete
Use Case: Assign to different users based on record data
Step Assignment Formula:
IF(
{!$Record.Region__c} = 'West',
{!$User.WestCoastManager},
IF(
{!$Record.Region__c} = 'East',
{!$User.EastCoastManager},
{!$User.DefaultManager}
)
)
Use Case: Escalate if step not completed on time
Step Due Date: {!$Flow.CurrentDate} + 2 (2 days)
Scheduled Flow: Check_Overdue_Steps
- Schedule: Daily at 8 AM
- Query: OrchestrationWorkItem where DueDate < TODAY AND Status = 'In Progress'
- Action: Send escalation email to manager
Monitor with SOQL:
// Query overdue orchestration steps
List<FlowOrchestrationWorkItem> overdueItems = [
SELECT Id, Label, StepDefinitionName, AssignedToId,
RelatedRecordId, DueDate, Status
FROM FlowOrchestrationWorkItem
WHERE DueDate < TODAY
AND Status = 'InProgress'
ORDER BY DueDate ASC
];
// Send escalation notifications
for (FlowOrchestrationWorkItem item : overdueItems) {
sendEscalationEmail(item);
}
Query work items for reporting:
// Active orchestrations
List<FlowOrchestrationWorkItem> activeItems = [
SELECT Id, Label, StepDefinitionName, AssignedToId,
CreatedDate, LastModifiedDate, DueDate,
Status, RelatedRecordId
FROM FlowOrchestrationWorkItem
WHERE Status = 'InProgress'
ORDER BY DueDate ASC
];
// Calculate time spent in each step
for (FlowOrchestrationWorkItem item : activeItems) {
Long milliseconds = item.LastModifiedDate.getTime() - item.CreatedDate.getTime();
Decimal hours = milliseconds / (1000.0 * 60 * 60);
System.debug('Step: ' + item.Label + ', Time: ' + hours + ' hours');
}
Key Metrics to Track:
1. Average Time per Stage
SELECT StepDefinitionName,
AVG(LastModifiedDate - CreatedDate) as AvgDuration
FROM FlowOrchestrationWorkItem
WHERE Status = 'Completed'
GROUP BY StepDefinitionName
2. Completion Rate by Assignee
SELECT AssignedToId,
COUNT(CASE WHEN Status = 'Completed' THEN 1 END) as Completed,
COUNT(CASE WHEN DueDate < TODAY AND Status = 'InProgress' THEN 1 END) as Overdue
FROM FlowOrchestrationWorkItem
GROUP BY AssignedToId
3. Bottleneck Identification
- Which steps take longest?
- Which steps have highest rejection/failure rate?
- Which assignees have most overdue items?
public class OrchestrationMetrics {
@AuraEnabled(cacheable=true)
public static Map<String, Object> getMetrics() {
Map<String, Object> metrics = new Map<String, Object>();
// Total active orchestrations
Integer active = [SELECT COUNT() FROM FlowOrchestrationWorkItem WHERE Status = 'InProgress'];
metrics.put('active', active);
// Overdue count
Integer overdue = [SELECT COUNT() FROM FlowOrchestrationWorkItem
WHERE Status = 'InProgress' AND DueDate < TODAY];
metrics.put('overdue', overdue);
// Average completion time (last 30 days)
AggregateResult[] avgTime = [
SELECT AVG(LastModifiedDate - CreatedDate) avgDuration
FROM FlowOrchestrationWorkItem
WHERE Status = 'Completed'
AND CreatedDate = LAST_N_DAYS:30
];
metrics.put('avgCompletionHours', (Decimal)avgTime[0].get('avgDuration') / (1000.0 * 60 * 60));
return metrics;
}
}
Stage 2: Manager Approval
โโ Step 2.1 (Interactive): Manager reviews
โ โโ Screen Flow with Approve/Reject buttons
โโ Background Automation: Update approval status
โโ If Approved: Proceed to Stage 3
If Rejected: Send rejection email, End orchestration
Publish events at stage transitions:
trigger OrchestrationStageTrigger on FlowOrchestrationStageInstance (after insert, after update) {
List<OrchestrationStageEvent__e> events = new List<OrchestrationStageEvent__e>();
for (FlowOrchestrationStageInstance stage : Trigger.new) {
if (stage.Status == 'Completed') {
events.add(new OrchestrationStageEvent__e(
OrchestrationId__c = stage.OrchestrationInstanceId,
StageName__c = stage.StepDefinitionName,
CompletedDate__c = System.now()
));
}
}
if (!events.isEmpty()) {
EventBus.publish(events);
}
}
Subscribe externally:
// External system tracks orchestration progress
client.subscribe('/event/OrchestrationStageEvent__e', (message) => {
const { OrchestrationId__c, StageName__c } = message.data.payload;
console.log(`Stage ${StageName__c} completed for ${OrchestrationId__c}`);
// Update external dashboard
updateOrchestrationStatus(OrchestrationId__c, StageName__c);
});
AI agent handles certain steps:
Stage 2: Document Verification
โโ Step 2.1 (Background): AI agent verifies documents
โ โโ Agentforce Action: Verify_Document_Compliance
โ - Uses Einstein OCR to extract text
โ - Uses LLM to validate against compliance rules
โ - Returns: Compliant (true/false) + Confidence score
โโ Decision: If confidence < 90% โ Human review
โโ Step 2.2 (Interactive - Conditional): Human verifies (if AI uncertain)
Issue 1: Work items not appearing for users
Causes:
- User not in assigned queue
- User lacks permission to object
- Filter criteria on view excludes item
Solution:
1. Check queue membership: Setup โ Queues
2. Verify object permissions: User profile/permission set
3. Review work item list view filters
Issue 2: Background step failing silently
Causes:
- Apex error in called flow/action
- Required field missing
- Governor limit exceeded
Solution:
1. Enable debug logs: Setup โ Debug Logs
2. Check Flow error emails: Setup โ Process Automation Settings
3. Implement fault path to catch and handle errors
Issue 3: Orchestration not triggering
Causes:
- Trigger criteria not met
- Record not updated properly
- Orchestration inactive
Solution:
1. Verify record meets entry criteria
2. Check orchestration activation status
3. Review audit trail for record updates
// Query orchestration details for debugging
public class OrchestrationDebugger {
public static void debugOrchestration(Id recordId) {
// Find orchestration instances for record
List<FlowOrchestrationInstance> instances = [
SELECT Id, Label, Status, CreatedDate
FROM FlowOrchestrationInstance
WHERE RelatedRecordId = :recordId
ORDER BY CreatedDate DESC
];
for (FlowOrchestrationInstance instance : instances) {
System.debug('Orchestration: ' + instance.Label);
System.debug('Status: ' + instance.Status);
// Get work items
List<FlowOrchestrationWorkItem> items = [
SELECT Id, Label, Status, AssignedToId, DueDate
FROM FlowOrchestrationWorkItem
WHERE OrchestrationInstanceId = :instance.Id
ORDER BY CreatedDate
];
for (FlowOrchestrationWorkItem item : items) {
System.debug(' Step: ' + item.Label + ', Status: ' + item.Status);
}
}
}
}
Process Builder โ Flow Orchestrator:
Process Builder supports only simple automation
Flow Orchestrator adds:
- Multi-user coordination
- Interactive steps
- Stage-based organization
- Visual progress tracking
- Fault handling
When to migrate:
- Process involves multiple users
- Need stage-based workflow
- Want user interface for steps
- Require better error handling
Flow Orchestrator transforms complex, cross-functional business processes into visual, manageable workflows that scale across your organization.