What if your business offers appointment booking for multiple services with a single appointment. For example, you offer auto services and allow customers to select from a menu of options, such as oil change, tire rotation, brake service and others. The customer may select 1 service or multiple services, and depending on the services selected, the duration of the appointment should be long enough enough to accommodate the selected services.
Above: Example of a flow screen prompting a user to select 1 or more auto services
What if you also had many store locations, and each store might offer a different menu of options. For example, the Wakefield store offers all services but the Reading store does not offer brake services.
With Salesforce Scheduler, you can accommodate this out of the box by creating many Work Type Groups to represent the combinations of services.
Consider the following table of Work Type Groups with its limitless number of combinations
|Oil Change and Brakes||90|
|Brakes and Tire Rotation||90|
|Tire Rotation and Wiper Service||45|
|Oil Change and Wiper Service||45|
|Brakes and Wiper Blades||75|
|…and many more combinations|
But, this is probably not the most practical way to offer a menu of services. This document describes an alternative approach which includes 2 custom fields and a small bit of Apex code. Check out the details below.
This solution allows you to run the Scheduler flows with a few minor configurations and an Apex @invocableMethod, allowing the user to select the desired services and perform precision scheduling without all of the permutations of work type groups.
The solution consists of custom fields on the Work Type object and Service Appointment object, an Apex Class, Work Type Group and Work Type data organized in a specific way and a configured flow. The flow makes use of the FilterByResourceIds parameter to ensure only those resources who have the skills needed are returned.
Work Type Groups
Create Work Type Groups only to reflect the duration of the services required. For example, Work Type Groups called 30 Minutes, 45 Minutes, 60 Minutes, 90 Minutes, etc. These are tied to Work Types with the respective durations.
Create Skills for each service required. For example, create an Oil Change Skill, a Brake Service Skill, a Tire Rotation Skill and so on.
Service Resources and Service Territories
Create Service Territories to represent the store locations and create 1 resource for each service lane or bay present in the store. Assign skills to service resources to define the services offered. For example, if the store offers oil changes and brake service, but no other services, then assign only those 2 skills to the service resources associated with the store.
Add a custom text (255) field called Selected Services. This will store the id’s of the work types that were selected by the user. This can be used by a rescheduling flow (not described in this document).
Add a custom picklist field called Service Type, with values of Service and Scheduling.
Create 2 types of Work Types:
Service Work Types
These are work types that represent each service, the skill required and the expected duration. For example,
WT Name = Oil Change, Skill Required = Oil Change, Duration = 30 Minutes, Service Type = Service
WT Name = Brakes, Skill Required = Brake Service, Duration = 60 Minutes, Service Type = Service
These work types are not assigned to any work types groups or service territory work types.
Scheduling Work Types
These are work types that represent a total duration, have no skills required and the expected duration. For example,
WT Name = 30 Minute Service, Duration = 30 Minutes, Service Type = Scheduling
WT Name = 60 Minute Service, Duration = 60 Minutes, Service Type = Scheduling
These work types are assigned to Work Type Groups (see screenshot below) and they are assigned to service territory work types.
Pic above: Work types for Service (with Skills required) and work types for Scheduling (no Skills required)
Pic Above: Work Type Groups just for Scheduling
An Apex class is used to determine the scheduling Work Type Group which is just large enough to cover the list of input Services. It accepts a list of Work Type ids and returns a Work Type Group id and a text field containing a comma separated list of Service Resource ids who have the skills required for the input Services.
The code for the apex class and a test class is contained in the package file at the end of this document.
Modify the Inbound New Guest Appointment flow to prompt for the services required (service work types), call the apex class and then present the list of time slots available.
Pic Above: Flow with new steps added to prompt for services and call the apex class.
Pic Above: New Screen which prompts for services. Select services is a picklist tied to a record choice set which selects only Work Types where Service Type = Service.
Call to Apex which returns the applicable work type group id with the duration large enough to accommodate the selected services. Also set the FilterByResourceIds field, which will be used in the select location and select time slots screens.
Video of it in action
Check out the short video below.
Try it yourself in your own sandbox. The custom fields, Apex Class, Test Classes and an example of a configured Inbound New Guest Appointment flow are included in this repo.
Since FilterbyResourceIds is limited to 50 service resource ids, you should ensure that you pass in a service territory id to the Apex Method so as not to exceed this limit.
Modify line 24 of the Apex code to select the specific service territory selected by the user.
listST = [select id from serviceterritory where isactive = true];
Lines 50-56 contain code to limit the total number of service resource ids to a maximum of 50. If the limit of 50 changes in a future release, you should change this code to reflect the new limit.
A rescheduling flow is not included here. If rescheduling is part of your use case, use the Service Appointment custom field created in this package to retrieve the services selected by the user when the appointment was scheduled. Add the custom screen and call to the Apex method to retrieve the corresponding scheduling Work Type Group, similar to how the flow in the package has been configured.