More Dynamic Way to Schedule a Salesforce Flow with Invocable Schedule Flow
Hi Folks!
As a flow developer, you may already familiar with Schedule-Triggered Flow that Salesforce already provided and if you’re familiar with Apex, you may find it has some limitations compared to Apex Scheduler. The current version of Schedule-Triggered Flow only allows you to run the flow with frequency Once, Daily, and Weekly. You cannot define the seconds of when you want to run your flow. And what if, you want to run a flow 3 times a day? that means you have to create 3 Schedule-Triggered Flows with different run time, and if you want to change the logic, you may have to change all those 3 flows. Well… you may already have found workaround that can solve your business use case with Pause and Decision elements, but as business requirements scaling, you may want other solution that make your flow simpler and more straight-forward just like if you’re doing it with Apex Scheduler.
Invocable Schedule Flow come to the rescue!
Image 00 shows you how this solution basically works, the features you can expect from this Invocable method are
- Run a flow / subflow with Invocable Method (or Apex Action in Flow), which means you can create a job to run your flow from other flows
- You can pass a String / Text variable to the flow you want to run. You have more than 1 variable? you can use a json and do the parsing inside the flow you want to trigger, here’s more info for that.
- With cron expression, you can define exactly WHEN (even exact second) and your own frequency to run the flow
- You can set whether you want to run your flow in future method or not, if you set it in future method, that means you’ll be able to do callouts before you commit DML transaction in your flow (bye bye Pause Element). As a setback, the flow you want to run may delay a little from the time you specified
- Not wanting to trigger the flow from other Flow? don’t worry you create a job to execute your flow from Anonymous Apex Window
Attributes
Input
- Label : Cron Expression
API Name : cronExpression
Type : String (Mandatory)
Description : An expression used to represent the time and date the job (or Flow) is scheduled to run. More info and samples about how to formulate cron expression: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_scheduler.htm
Example : 0 0 10 ? * MON-FRI (Runs Monday through Friday at 10 AM) - Label : Flow API Name
API Name : flowApiName
Type : String (Mandatory)
Description : Flow API Name that you want to run with the scheduler
Example : TestDummy_ScheduledFlow - Label : Schedule Job Name
API Name : scheduleJobName
Type : String (Mandatory)
Description : Unique name of the job you want to run, this will be important for you to monitor the status of your flow job
Example : TestDummy_ScheduledFlow_10AM_MONtoFRI - Label : Flow Namespace
API Name : flowNamespace
Type : String (Optional)
Description : The namespace of your flow, if any
Example : cool_package - Label : Flow Parameter / Variable Name
API Name : flowParameterName
Type : String (Optional)
Description : The variable name that available for input in the flow you want to run, if any
Example : recordId / Input_JSON - Label : Flow Parameter / Variable Value
API Name : flowParameterValue
Type : String (Optional)
Description : If flowParameterName does not null, this will be the value of variable that available for input you set on flowParameterName
Example : 0015g00000CKozcAAD / {“recordId” : “0015g00000CKozcAAD”, “isScheduled” : True} - Label : Run Flow in Future Method, default to False if null
API Name : runInFuture
Type : Boolean (Optional)
Description : if null will be automatically set to false. This attribute decides whether you want to run the flow in future method or not. If true, you will be able to do callout before DML transaction in the flow. As a setback, your schedule will be delayed a little, depends on the workload of your org. More info about future method : https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_invoking_future_methods.htm
Example : False
Output
- Label : Job ID
API Name : jobId
Type : String
Description : The job ID that generated for your flow to run
Example : 08e5g00000MYuQE
How to create a scheduled flow Job
Step 1 : Plan and Create a flow you want to run
Check whether you need to use this extension or not. And if decided you need this, you can start to plan, design, and create the flow. And keep in mind of what you want to achieve from this flow, when you want to run this flow, how many times you want to run this flow in specific frequency, what parameters you should pass, you need to run a future method or not, and how you want the flow job to be triggered. Then, you can go to the next step
Step 2 : Install InvocableScheduleFlow Package
Production : https://login.salesforce.com/packaging/installPackage.apexp?p0=04t5g000000Uh3K
Sandbox : https://test.salesforce.com/packaging/installPackage.apexp?p0=04t5g000000Uh3K
Source Code : https://github.com/munawirrahman/InvocableScheduleFlow
Package includes:
- Apex Classes : InvocableScheduleFlow, ScheduledFlow
- Apex Test Class : InvocableScheduleFlowTest (Covered 100% of classes above)
- Autolaunched Flow : Dummy_ScheduledFlow (necessary for test class)
Step 3 : Instruct the flow to run at specific time and specific frequency
There are 2 ways of instructing how to create a flow job to run, Create the flow Job from other Flow or Create the flow Job from Apex Anonymous Window
How to create a flow job from other flow (or parent flow)
You can create a Screen Flow or an Autolaunched flow that you want to run this flow from. That will be depends on your business specification, remember that this is Invocable Method (or Apex Action) from flow, so you can call this function from Screen Flow or other Autolaunched Flow. For my example, I will use a Screen Flow to formulate a flow Job, and a flow that I want to run is just sending an email to myself with parameter as an input variable.
How to create a flow job from Anonymous Apex Window
Sometimes you may not want to create another flow to create a flow Job, just like when you do it with Schedule Triggered Flow. For that, what you can do is just create a flow job from Anonymous Apex Window, which will create your flow job. Here’s how to do that
List<InvocableScheduleFlow.Request> requests = new List<InvocableScheduleFlow.Request>();
InvocableScheduleFlow.Request req = new InvocableScheduleFlow.Request();
req.flowApiName = 'Dummy_ScheduledFlow'; //mandatory
req.cronExpression = '0 45 22 ? * FRI-MON'; //mandatory
req.scheduleJobName = 'TestDummy_ScheduledFlow'; //mandatory
req.flowNamespace = null; //optional
req.flowParameterName = 'parameter'; //optional
req.flowParameterValue = 'This is a value'; //optional
req.runInFuture = false; //will set to false if null or not set
requests.add(req);
List<InvocableScheduleFlow.Result> results = InvocableScheduleFlow.invoke(requests);
System.debug(results[0].jobId); //the job id result
How to Monitor your Flow Job
since you already created a new Flow Job that will be executed at the time you set, you can monitor when your Scheduled Job will be executed, and the history of the execution.
For the list of possible Status, you can go to this source, and if there’s an error with your execution, you’ll see the detail in Status Detail field and also you should see a Flow Interview error email in your Inbox.
How to Abort a Flow Job
As you already able to create a scheduled Flow Job, and that already running just like what you wanted at the frequency you wanted, you may want to cancel that due to various reasons. What you can do to abort that scheduler is by just delete the Job on Scheduled Job menu
There you go, now you other dynamic way to schedule your flow
Thank you for spending the time to see my writing that trying to solve salesforce limitations, please clap if you think this is useful and let me know if you have any questions, will try to help you the best as I possibly can :)
P.S : I would definitely recommend you to take a look at best practice and limitations of Salesforce Scheduler that we implement in this solution.
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_scheduler.htm