Quote Flow Approval Process
Rebuilt using Salesforce's dedicated Flow Approval Process flow types (Record-Triggered Approval Orchestration) — not a generic orchestration with manually wired flows. This uses the native approval step functionality, built-in screen flow templates, and the Approvals App.
What Changed & Why It Matters
The previous guide described building a generic Flow Orchestration by stitching together three separate flows. That approach works but misses the purpose-built Flow Approval Process feature that Salesforce introduced in Spring '25. Here's the key distinction:
① Screen Flow for approval UI
② Autolaunched Flow for status updates
③ Autolaunched Flow for notifications
Then wire them together in a generic Flow Orchestration — manually configuring every approval interaction, assignee, and notification.
① Record-Triggered Approval Orchestration
Approval Steps are a native step type with built-in assignee config, record locking, email notifications, and the Evaluate Approval Requests template. Only one supporting Autolaunched Flow needed for field updates.
What the Flow Approval Process gives you natively:
Dedicated Flow Type
When creating a new flow, you select "Record-Triggered Approval Orchestration" — a specific flow type designed for approvals, not a generic orchestration.
Built-in Approval Steps
Approval Steps are a native step type within the orchestration. Assignee (User/Queue/Group), record locking, and email customization are configured directly in the step — no external flow needed.
Screen Flow Template
Salesforce provides the "Approvals Workflow: Evaluate Approval Requests" template with pre-built approvalDecision and approvalComments output variables.
Approval Wizard (Summer '25)
An optional wizard that auto-generates the orchestration skeleton — set number of approval levels and recall paths, then customize from there.
Native Data Model
Automatically tracks everything in Approval Submissions, Approval Submission Details, Approval Requests, and Approval Work Items objects — no custom tracking needed.
Approvals Lightning App
A central hub (App Launcher → Approvals) with built-in list views for managing all approval activity across the org.
Free — No Credits
Despite being built on Flow Orchestrator, approval orchestrations are explicitly free. They do not consume orchestration runs or automation credits.
Built-in Email Notifications
Approval Steps automatically send email notifications to assigned approvers. Approvers can reply with "Approve" or "Reject" keywords directly from email.
Correct Architecture
Here's what you're actually building — one Approval Orchestration with one supporting Autolaunched Flow for field updates:
| Component | Type | Purpose | How Many |
|---|---|---|---|
| Quote Approval Orchestration | Record-Triggered Approval Orchestration | The main approval process — contains all Stages, Approval Steps, Background Steps, and Decision elements | 1 |
| Quote Approval - Evaluate Request | Screen Flow (from template) | The UI approvers see in the Work Guide — Approve/Reject buttons + comments. Uses the built-in Approvals Workflow: Evaluate Approval Requests template. Linked automatically by Approval Steps. |
1 |
| Quote Approval - Update Status | Autolaunched Flow (No Trigger) | Updates Quote fields (Approval_Status__c, Status, etc.) after each decision. Called by Background Steps in the orchestration. |
1 |
Visual Flow Map
TRIGGER: Quote created with Status = "Proposal" │ ├─ Record Type = "Teams Deal" │ │ │ ├─ STAGE 1: Teams Biz Ops Approval │ │ └─ Approval Step → Queue: Teams_Biz_Ops_Approval │ │ │ ├─ Decision: Approve → continue │ Reject → BG Step (update rejected) → End │ │ │ ├─ STAGE 2: Teams Executive Approval │ │ └─ Approval Step → Queue: Teams_Executive_Approval │ │ │ ├─ Decision: Approve → continue │ Reject → End │ │ │ ├─ STAGE 3: Finance Approval │ │ └─ Approval Step → Queue: Finance_Dept_Approval │ │ │ ├─ Decision: Approve → BG Step (Status → "Heads of Terms") │ Reject → End │ │ │ ├─ STAGE 4: External Partners Approval │ │ └─ Approval Step → Queue: External_Partners_Approval │ │ │ ├─ Decision: Approve → BG Step (Status → "Contract Negotiation") │ Reject → End │ │ │ └─ STAGE 5: Legal Notification │ └─ Background Step → Notify Legal_Department Queue (no approval) │ └─ Record Type = "LIV League Deal" │ ├─ STAGE 1: League Biz Ops Approval │ └─ Approval Step → Queue: League_Biz_Ops_Approval │ ├─ Decision: Approve → continue │ Reject → End │ ├─ STAGE 2: Finance Approval │ └─ Approval Step → Queue: Finance_Dept_Approval │ ├─ Decision: Approve → BG Step (Status → "Heads of Terms") │ Reject → End │ ├─ STAGE 3: External Partners Approval │ └─ Approval Step → Queue: External_Partners_Approval │ ├─ Decision: Approve → BG Step (Status → "Contract Negotiation") │ Reject → End │ └─ STAGE 4: Legal Notification └─ Background Step → Notify Legal_Department Queue
Custom Fields on Quote
| Field Label | API Name | Type | Picklist Values / Notes |
|---|---|---|---|
| Approval Status | Approval_Status__c | Picklist | Not Submitted, Pending Approval, Approved, Rejected, Recalled |
| Current Approval Stage | Current_Approval_Stage__c | Text (100) | Shows which approval stage is active |
| Approval Decision Date | Approval_Decision_Date__c | Date/Time | Stamped on final approval or rejection |
Confirm Existing Setup
- Quote Record Types exist: "Teams Deal" and "LIV League Deal"
- Quote
Statuspicklist includes: Proposal, Heads of Terms, Contract Negotiation - Quote → Opportunity → Account/Contact relationships configured
Queues Setup
Create 6 Queues in Setup → Queues. Each must include Approval Work Item as a Supported Object.
| Queue Label | API Name | Members | Used For |
|---|---|---|---|
| Teams Biz Ops Approval | Teams_Biz_Ops_Approval | Teams Biz Ops Manager(s) | Teams Proposal — Step 1 |
| Teams Executive Approval | Teams_Executive_Approval | Teams Executive(s) | Teams Proposal — Step 2 |
| League Biz Ops Approval | League_Biz_Ops_Approval | League Biz Ops Manager(s) | League Proposal — Step 1 |
| Finance Dept Approval | Finance_Dept_Approval | Finance team | Proposal final step (both) |
| External Partners Approval | External_Partners_Approval | External partner reviewers | Heads of Terms (both) |
| Legal Department | Legal_Department | Legal team | Contract Neg notification |
- Setup → Queues → New. Enter Queue Label. Set a Queue Email if you want a shared inbox to receive approval emails.
- Supported Objects: Add Approval Work Item. This is required — without it, the Queue won't be selectable as an Approval Step assignee.
- Queue Members: Add Users, Roles, or Public Groups. Using Roles for membership keeps the queue auto-updated when staff changes.
Org Settings & Notifications
Approval Steps in the orchestration send email notifications natively. Configure these settings to ensure they work correctly:
- Setup → Process Automation Settings → check "Enable email approval response". This lets approvers reply "Approve" or "Reject" directly from the notification email.
- Setup → Organization-Wide Email Addresses → Add. Create a branded sender (e.g.,
approvals@livgolf.com). Set "Allow All Profiles." Verify the email. - Setup → Process Automation Settings → set the "Automated Process User Email Address" to the Org-Wide Email you just created.
- Setup → Custom Notifications → New. Create "Quote Approval Notification" (API:
Quote_Approval_Notification). Enable Desktop and Mobile. This powers in-app bell notifications for additional visibility.
Screen Flow — Approval UI (From Template)
This is the Screen Flow that approvers interact with inside the Work Guide. Salesforce provides a ready-made template — you don't need to build this from scratch.
- Setup → Flows → New Flow → Screen Flow.
- When prompted, select "Template" and choose "Approvals Workflow: Evaluate Approval Requests".
- The template comes pre-configured with the required output variables:
approvalDecision(Approve/Reject) andapprovalComments. These variable names and values are required — the orchestration reads them. - Customize (optional): Add a Get Records element to pull Quote details (Quote Number, Account Name, Total Price, Opportunity Name) and display them on the Screen element so approvers have context without navigating away.
- Save as: "Quote Approval - Evaluate Request"
- Activate the flow.
approvalDecision (values: Approve or Reject) and approvalComments. If you build from scratch instead of using the template, you must use these exact variable names and spellings. The orchestration's Approval Steps read these output variables automatically.Autolaunched Flow — Status Updates
This single reusable flow handles all post-decision field updates. It's called as a Background Step after each Decision element in the orchestration.
- Setup → Flows → New Flow → Autolaunched Flow (No Trigger).
-
Create input variables (Available for Input ✓):
•varQuoteId— Text
•varApprovalStatus— Text (e.g., "Pending Approval", "Approved", "Rejected")
•varQuoteStage— Text (e.g., "Heads of Terms" — blank if not advancing)
•varCurrentApprovalStage— Text (e.g., "Pending: Finance Approval") -
Add a Decision element: Check if
varQuoteStageis not blank.
• If not blank: Update Records element sets bothApproval_Status__candStatus
• If blank: Update Records element sets onlyApproval_Status__candCurrent_Approval_Stage__c - Save as: "Quote Approval - Update Status"
- Activate.
Create the Approval Orchestration
This is the core — one single Approval Orchestration that contains all stages, steps, and routing logic for both deal types.
Option A: Start from the Approvals App
- Open the App Launcher → search for "Approvals" → open the Approvals app.
- Click "Create Flow Approval Process".
- You can choose to use the Wizard (auto-generates a skeleton you customize) or "From Scratch" (blank canvas). For this complex use case with branching record types, From Scratch gives more control.
- Select "Record-Triggered Approval Orchestration".
Option B: Start from Flow Setup
- Setup → Flows → New Flow.
- Select "Record-Triggered Approval Orchestration" from the flow type options. (Not "Autolaunched Orchestration" or generic "Orchestration" — the dedicated Approval type.)
- Choose "From Scratch".
Configure the Start Element
- Object: Quote
- Trigger: A record is created
-
Entry Conditions (All Conditions Met):
•StatusequalsProposal
•Approval_Status__cequalsNot Submitted - Optimize for: Actions and Related Records
First Element: Decision — Check Record Type
-
Add a Decision element right after Start:
• Outcome 1: "Teams Deal" →{!$Record.RecordType.DeveloperName}equalsTeams_Deal
• Outcome 2: "LIV League Deal" →{!$Record.RecordType.DeveloperName}equalsLIV_League_Deal
• Default: End
Teams Deal — Proposal Stages
On the "Teams Deal" Decision outcome, build 3 sequential Stages — each containing one Approval Step. Sequential approvals = separate Stages (one active at a time).
Stage 1: Teams Biz Ops Manager
- Add a Stage on the "Teams Deal" path. Label: "Teams - Biz Ops Approval"
-
Inside the Stage, add an Approval Step (not a Background Step — this is the native approval step type):
• Label: "Biz Ops Manager Review"
• Screen Flow: Select "Quote Approval - Evaluate Request" (the template-based flow from Section 07)
• Assignee Type: Queue
• Queue:Teams_Biz_Ops_Approval
• Lock Record: Yes
• Customize Notification Email: Optional — customize the email subject/body, or use the default -
After the Stage, add a Decision element:
• Outcome "Approved":{!Teams_Biz_Ops_Approval.Biz_Ops_Manager_Review.approvalDecision}equalsApprove
• Default Outcome "Rejected": → Add a Background Step calling "Quote Approval - Update Status" withvarApprovalStatus= "Rejected" → End
Stage 2: Teams Executive
- Add a Stage on the "Approved" path. Label: "Teams - Executive Approval"
- Add an Approval Step: Assignee → Queue:
Teams_Executive_Approval. Screen Flow → same "Evaluate Request" flow. - Decision: Approve → continue. Reject → Background Step (status update) → End.
Stage 3: Finance Department
- Add a Stage on "Approved" path. Label: "Teams - Finance Approval"
- Add an Approval Step: Assignee → Queue:
Finance_Dept_Approval -
Decision: Approve → Background Step calling "Quote Approval - Update Status":
•varApprovalStatus= "Approved"
•varQuoteStage= "Heads of Terms"
•varCurrentApprovalStage= "Proposal Approved — Advanced to HoT"
Reject → Background Step (rejected) → End.
LIV League Deal — Proposal Stages
On the "LIV League Deal" Decision outcome, build 2 sequential Stages (no Executive approval for League deals).
Stage 1: League Biz Ops Manager
- Add a Stage: "League - Biz Ops Approval"
- Approval Step: Queue →
League_Biz_Ops_Approval. Screen Flow → "Evaluate Request". Lock Record → Yes. - Decision: Approve → continue. Reject → update status → End.
Stage 2: Finance Department
- Add a Stage: "League - Finance Approval"
- Approval Step: Queue →
Finance_Dept_Approval(same queue — shared across both deal types). - Decision: Approve → Background Step (update Status to "Heads of Terms"). Reject → End.
Heads of Terms & Contract Negotiation
Both deal type paths share the same pattern for these final stages.
Heads of Terms — External Partners Approval
- Add a Stage after the Finance "Approved" Background Step (on both the Teams and League paths). Label: "External Partners Approval"
- Approval Step: Queue →
External_Partners_Approval. Screen Flow → "Evaluate Request". - Decision: Approve → Background Step (update Status to "Contract Negotiation"). Reject → update status → End.
Contract Negotiation — Legal Notification
- Add a Stage after External Partners approval. Label: "Notify Legal"
-
Add a Background Step (NOT an Approval Step — Legal is being notified, not asked to approve):
• Flow: "Quote Approval - Update Status"
•varApprovalStatus= "Approved"
•varQuoteStage= "Contract Negotiation"
•varCurrentApprovalStage= "Complete — Contract Negotiation" -
Add a second Background Step for the Legal notification:
• Use a simple Autolaunched Flow with a Send Custom Notification action targeting the Legal Department Queue members
• Or add an Email Alert action to notify the Legal queue email address - End the orchestration.
Error Handling & Recall Path
Fault Paths
Add a Fault Path to every Stage. Click each Stage → "Add Fault Path." On the Fault Path, add a Background Step that updates Approval_Status__c to "Error" and sends a notification to the admin and Quote owner.
Recall Path (Summer '25+)
Click the Start element → "Add Recall Path." Add a Background Step that updates Approval_Status__c to "Recalled," resets Current_Approval_Stage__c, and unlocks the record. Only Background Steps are allowed on the Recall Path (no Approval Steps).
Rejection Handling
On every "Rejected" Decision outcome, the Background Step should update the status AND optionally send a Custom Notification to the Quote Owner explaining the rejection. The approvalComments from the Screen Flow can be passed through to the notification body.
Record Page & Components
- Edit the Quote Lightning Record Page (Setup → Object Manager → Quote → Lightning Record Pages → Edit):
- Add Orchestration Work Guide component — search "Work Guide" in Components panel. Place prominently (top of right sidebar or a dedicated tab). Enable "Hide When Empty". This is where approvers see the Screen Flow and take action.
- Add Approval Trace component — shows the full approval lifecycle audit trail (status, comments, assignees, timestamps). Place in an "Approval History" tab.
-
Add a Rich Text component with conditional visibility (
Approval_Status__c= "Pending Approval") showing: "This Quote is pending approval. Editing is locked until the process completes." -
Add the custom fields (
Approval_Status__c,Current_Approval_Stage__c,Approval_Decision_Date__c) to the page layout detail section. - Save, Activate, and Assign the page to the appropriate apps/profiles.
Testing Playbook
Debug in Flow Builder (Winter '26+)
- Open the orchestration → click Debug.
- Select Rollback Mode + enable "Manually Set Output Variables" on each Approval Step to simulate approve/reject decisions without real users.
- Walk through each path: both deal types, all approval chains, rejection at each stage, recall.
End-to-End Scenarios
| # | Test | Expected Result |
|---|---|---|
| 1 | Create Teams Deal Quote at Proposal stage | Orchestration fires, Teams Biz Ops Queue gets approval request |
| 2 | Approve all 3 Teams Proposal steps | Quote Status → "Heads of Terms" |
| 3 | Reject at Teams Executive step | Approval Status = "Rejected", orchestration ends |
| 4 | Create League Deal Quote, approve all steps | Full path: Proposal → HoT → Contract Negotiation |
| 5 | Verify email received by Queue members | Email with approval link, reply "Approve" works |
| 6 | Verify Work Guide renders for assigned approver | Screen Flow appears inline on Quote record page |
| 7 | Verify Approval Trace shows audit trail | Status, comments, assignee, reviewer, timestamps visible |
| 8 | Test recall on in-progress approval | Status → "Recalled", record unlocked |
| 9 | Check Approvals App (App Launcher → Approvals) | All submissions and work items visible in list views |
Go-Live Checklist
Pre-Work
- Custom fields created: Approval_Status__c, Current_Approval_Stage__c, Approval_Decision_Date__c
- All 6 Queues created with "Approval Work Item" as Supported Object
- Queue members assigned (at least 1 active member per queue)
- "Enable email approval response" checked in Process Automation Settings
- Org-Wide Email Address created and verified
- Custom Notification Type created (for bell notifications)
Supporting Flows
- Screen Flow built from "Approvals Workflow: Evaluate Approval Requests" template
- Screen Flow outputs: approvalDecision (Approve/Reject) and approvalComments
- Screen Flow customized with Quote context fields (optional but recommended)
- Screen Flow activated
- Autolaunched Flow "Quote Approval - Update Status" built and activated
Approval Orchestration
- Flow type is Record-Triggered Approval Orchestration (NOT generic orchestration)
- Trigger: Quote created, Status = Proposal, Approval_Status__c = Not Submitted
- Decision element branches by Record Type (Teams Deal / LIV League Deal)
- Teams path: 3 Approval Stages (Biz Ops → Executive → Finance) + External Partners + Legal Notification
- League path: 2 Approval Stages (Biz Ops → Finance) + External Partners + Legal Notification
- Each Approval Step uses built-in assignee config (Queue type)
- Each Approval Step references the Screen Flow template
- All Decision elements check approvalDecision = "Approve" (not "Approved")
- All rejection paths: Background Step updates status → End
- Contract Negotiation uses Background Step only (notification, no approval)
- Fault Paths added to every Stage
- Recall Path configured on Start element
- Record locking enabled on first Approval Step of each path
- Orchestration activated
Deployment
- Orchestration Work Guide component added to Quote Record Page
- "Hide When Empty" enabled on Work Guide
- Approval Trace component added to Record Page
- Rich Text status message with conditional visibility added
- Custom fields visible on page layout
- Record Page saved, activated, assigned to correct profiles
Testing
- Debugged in rollback mode with manually set output variables
- Teams Deal: full approval path tested (all stages)
- Teams Deal: rejection tested at each stage
- League Deal: full approval path tested
- League Deal: rejection tested at each stage
- Email notifications received by queue members
- Email "Approve"/"Reject" reply works
- Work Guide renders for assigned approvers
- Approval Trace shows correct audit trail
- Recall path tested
- Approvals App shows submissions and work items
- Record locking verified