Dynamic Approval Routing in Salesforce

Advertisements

Last Updated on March 20, 2022 by Rakesh Gupta

Big Idea or Enduring Question:

How do you set up dynamic approval routing?

In Salesforce, a user can use an Approval process to get approval from managers or higher authority. Approval processes route a record to one or more approvers, specifying the steps necessary for a record to be approved, and who must approve it at each step.

In a normal approval process, i.e., Static approval process, the approvers at each step are explicitly specified in each step approval process, or you can have the submitter choose the approver manually, as shown in the following screenshot: Whereas dynamic approval routing allows us to specify the approvers for each record using User lookup fields on the record requiring approval. These fields can be populated using Process Builder or Apex, using data from a special custom object/setting that contains all the information needed to route the record. Dynamic approval routing provides the flexibility to route the approval request to different people based on Account Type or some other criteria related to the record. Let’s start with a business use case.

Objectives:

After reading this blog post, the reader will be able to:

  • Use Before-save Record-Triggered Flow to route approval requests to designated approvers
  • Use a Decision element to find – record variable or record collection variable contains a record or not
  • Use an Assignment element to assign default approver to opportunity 

Business Use case

Steven Greene is working as a System administrator in Universal Container. He has received a requirement from the management to route opportunity approval requests to designated approvers based on the opportunity’s Lead Source and the opportunity’s account Type.

Automation Champion Approach (I-do):

While this can be solved using various automation tools like Apex or Flow, we will use Before-save Record-Triggered Flow. This is not something that can be accomplished with Workflow Rules or Process Builder. 
 
Before discussing it, let me show you a diagram of a Process Flow at a high level. Please spend a few minutes to go through the following Flow diagram and understand it.
 

Let’s begin building this automation process.

Guided Practice (We-do):

There are 5 steps to solve Steven’s business requirement using Salesforce Flow. We must: 

  1. Create a custom lookup (with User object) field on the object being approved
  2. Create a custom object that will be used as an approval matrix
  3. Populate the approval matrix, i.e., create a few records in a custom object 
  4. Create an approval process 
  5. Salesforce Flow Steps:
    1. Define flow properties for record-triggered flow
    2. Add a get records element to find opportunity owner
    3. Add a decision element to check the record collection variable (from step 5.2)
    4. Add an assignment element  – assign dynamic approver
    5. Add an assignment element  – assign default approver

Step 1: Creating a Custom lookup (user) 

On the Opportunity object, create a lookup field called Opportunity Approver as mentioned in the steps below. 

  1. Click Setup.
  2. In the Object Manager, type Opportunity.
  3. Select Fields & Relationships, then click New.
  4. Select Lookup Relationship as Data Type, then click Next.
  5. Select the User object for the Related To option, then click Next.
  6. Enter Field Label and click the Next button. The API Name will populate. 
  7. As a best practice, always input a description
  8. Set the Field-level Security for the profiles, make sure to set this field as read-only. 
  9. Add this field to Page Layout.
  10. Click Save.

Step 2: Create a Custom Object 

The next step is to create a custom object Approver Matrix and a few custom fields to store related information which will use in approval routing. 

  1. Click Setup.
  2. In the Object Manager, click Create | Custom Object.
  3. Now create a custom object Approver Matrix and fields as shown in the screenshot below: 
  4. Click Save.

Field Name Values
Lead Source Web
Phone Inquiry
Partner Referral
Type Existing Customer – Downgrade
Existing Customer – Replacement
Existing Customer – Upgrade
New Customer

Step 3: Create Approval Matrix Records 

The next step is to create approval matrix records that associate the Lead Source and Type to the appropriate Opportunity Approver. For example, if Lead Source = Web and Type = Existing Customer – Upgrade, then one might route the records to Adam Smith as Opportunity Approver. It will look like the following screenshot:

Step 4: Create an Approval Process 

  1. Click Setup.
  2. In the Quick Find box, type Approval Processes.
  3. Clicks on the Create New Approval Process | Use Standard Setup Wizard button
  4. Select the Opportunity object for Manage Approval Processes For drop-down. 
  5. Now create an approval process, as shown in the following screenshot:

Make sure to modify the approver step (Step 3), and select related user Opportunity approver, as shown in the preceding screenshot. 

Step 5.1: Salesforce Flow – Define Flow Properties 

  1. Click Setup.
  2. In the Quick Find box, type Flows.
  3. Select Flows then click on the New Flow.
  4. Select the Record-Triggered Flow option and click on Next and configure the flow as follows: 
    1. How do you want to start building: Freeform
    2. Trigger the Flow When: A record is created or Updated
    3. Run Flow: Before the record is saved
    4. Object: Opportunity
  5. Select Any Condition Is Met (OR)
  6. Set Conditions
    1. Row 1
      1. Field: Opportunity | Type
      2. Operator: Does Not Equal 
      3. Value: {!$GlobalConstant.EmptyString}
  7. Click Add Condition
    1. Row 2
      1. Field: Opportunity | Lead Source
      2. Operator: Does Not Equal 
      3. Value: {!$GlobalConstant.EmptyString}
  8. Choose the Option to Every time a record is updated and meets the condition requirements.
  9. Click Done.

Step 5.2: Salesforce Flow – Adding a Get Record Element

The next step is to get the Opportunity Approver. We will use the Get Records element. To do this drag-and-drop Get Records element onto the canvas and map the fields according to the details below:

  1. Under Toolbox, select Element
  2. Drag-and-drop Get Records element onto the Flow designer. 
  3. Enter a name in the Label field; the API Name will auto-populate.
  4. Select the Approver Matrix object from the dropdown list.
  5. Select All Conditions Are Met (AND)
  6. Set Filter Conditions
    1. Row 1:
      1. Field: Type
      2. Operator: Equals
      3. Value: {!$Record.Type}
    2. Row 2:
      1. Field: Lead Source 
      2. Operator: Equals
      3. Value: {!$Record.LeadSource}
  7. How Many Records to Store:
    1. select Only the first record
  8. How to Store Record Data:
    1. Choose the option to Automatically store all fields
  9. Click Done.

Step 5.3: Salesforce Flow – Using Decision Element to Check Record Variable Size

Now we will use the Decision element to check the Record Variable from step 5.2 size. If the Text Variable is not equal to null, then we will go ahead and update Approver on the opportunity record. Otherwise, we will update it with a default approver.

  1. Under Toolbox, select Element
  2. Drag-and-drop Decision element onto the Flow designer. 
  3. Enter a name in the Label field; the API Name will auto-populate.
  4. Under Outcome Details, enter the Label the API Name will auto-populate.
  5. Condition Requirements to Execute OutcomeAll Conditions Are Met (AND)
    1. Row 1:
      1. Resource: {!Opportunity_Approver}
      2. Operator: Is Null 
      3. Value: {!$GlobalConstant.False}
  6. When to Execute OutcomeIf the condition requirements are met
  7. Click Done.

Step 5.4: Salesforce Flow – Using Assignment Element to Update Opportunity Approver 

The next step is to update an Opportunity record. We will use the Assignment element, as we are using before-save flow. 

  1. Under Toolbox, select Element
  2. Drag-and-drop Assignment element onto the Flow designer. 
  3. Enter a name in the Label field; the API Name will auto-populate.
  4. Set Variable Values
    1. Row 1:
      1. Field: {!$Record.Opportunity_Approver__c}
      2. Operator: Equals
      3. Value: {!Opportunity_Approver.Opportunity_Approver__c} (Record variable from step 5.2) 
  5. Click Done.

Step 5.5: Salesforce Flow – Using Assignment Element to Update Default Approver 

In case there aren’t any approvers that exist in the Approver Matrix for the current opportunity, then we will update Opportunity Approver to Logged-In user’s manager. We will use the Assignment element, as we are using before-save flow. 

  1. Under Toolbox, select Element
  2. Drag-and-drop Assignment element onto the Flow designer. 
  3. Enter a name in the Label field; the API Name will auto-populate.
  4. Set Variable Values
    1. Row 1:
      1. Field: {!$Record.Opportunity_Approver__c}
      2. Operator: Equals
      3. Value: {!$User.ManagerId}
  5. Click Done.

In the end, Steven’s Flow will look like the following screenshot:

 Once everything looks good, perform the steps below: 

  1. Click Save.
  2. Enter Flow Label the API Name will auto-populate.
  3. Click Show Advanced.
  4. Type: Record-Triggered Flow
  5. API Version for Running the Flow: 50
  6. Interview Label: Dynamic Approval Routing {!$Flow.CurrentDateTime}
  7. Click Save

Almost there! Once everything looks good, click the Activate button.

Proof of Concept

Now onwards, if a business user updates the Lead Source and Type, Process Builder will automatically populate the Opportunity Approver field.

  1. Currently, Opportunity Approver on opportunity West Mountain Sign is Patrick Trevenen (which is correct based on our matrix which we set up in step 3)as shown in the following screenshot:
  2. Now we update the Type to Existing Customer – Upgrade and Lead Source to Web.
  3. Finally, submit an Opportunity record for approval.

Formative Assessment:

I want to hear from you!  

What is one thing you learned from this post? How do you envision applying this new knowledge in the real world? 

Let me know by Tweeting me at @automationchamp, or find me on LinkedIn.

Have feedback, suggestions for posts, or need more information about Salesforce online training offered by me? Say hello, and leave a message!
Preferred Timing(required)

10 thoughts on “Dynamic Approval Routing in Salesforce

  1. Thank you, yes that’s how its setup, each range of Opportunity Amount goes to Level 1, Level 2 etc Approvers. How can I specify these ranges in the custom matrix object? If its picklist value, I can easily match them In ‘Get records’ element and fetch the matrix record but in this case Amount field can be anything in those ranges, Any help is much appreciated.

  2. I agree, my requirement is similar to it, Opportunity Amount 0 to 10,000 will go to level 1 & 10,000 to 100,000 will go to Level 2 & 100,000 to 250,000 to Level 3 approval etc. While creating records on custom matrix object, how can I specify ranges of Opportunity Amount? Any help would be much appreciated.

  3. I like your approach but what if we have an Amount field in the matrix object, and Amount can be anywhere from 1000 to 1 Million, we cannot create a matrix record for each amount value, how can I write approval matrix in this scenario?

    1. Rakesh Gupta – Mumbai – 9x Salesforce MVP | Senior Solution Architect | 8x Author | 5x Dreamforce Speaker | Salesforce Coach | Co-host of AutomationHour.com and AppXchangeHour.Com

      Usually Sales team has assign specific approval ranges based on the deal amount amount. For instance, deal ranging from 0 to 10,000 will be handled by Andy, 10,000 to 100,000 will be managed by Jim, and transactions between 100,000 and 250,000 will be overseen by Jordan, and so on.

  4. @Rakesh Gupta Thank you for a very informative article. I have created a similar matrix in the past but like the upgrades using flow. I do have a question. I want to use a similar process for Quote approval however, my approvers are identified both by minimum and maximum deal size and minimum and maximum discount %. On the Quote, I have a field that provides the Discount % – say 15%. I tried to have on the Matrix Minimum discount % and Maximum discount % but this will not work for me.

    Example: CEO approval required if the Deal Size (Net Amount) is greater than $1,000,000 and less than $3,000,000 and the Discount % is between 3% – 7%. How can I write an approval matrix for that?

    Thank you for your comments.

    1. What do you think a Matrix which contains Minimum discount % and Maximum discount % and deal range won’t work? Feel free to send a screenshot of your current matrix at rakesh@automationchampion.com

  5. Expanding on this: Is there a way to dynamically assign multiple approvers for a record? I have a header Record with 1 to many child records, and each child record can be assigned to a different department. I want my header record to be approved by the manager of every department who has any child records assigned to them. The department is a lookup field, and the manager is specified on the department record. I am proficient with both process builder and flow, but I haven’t quite figured out how to solve this.

Leave a ReplyCancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Discover more from Automation Champion

Subscribe now to keep reading and get access to the full archive.

Continue reading

Exit mobile version
%%footer%%