This guide is intended for advanced Natterbox admins. Further customisations of this solution might not be supported.
Requirement: Contact Centre Licences
Overview
The Call Control Object allows you to manage inbound call routing entirely from Salesforce records — no routing policy changes needed. Admins can:
Set weekly opening and closing hours (in local time)
One Record to handle Holiday/Open hour rules on multiple policies
Handle multiple time zones with automatic daylight saving adjustment
Pre-set holiday routing and TTS messages using reusable slots
Force lines closed for emergencies
Dynamically route calls based on all of the above
Once created, you'll use a Query Object App in your routing policy to pull the record data, and a Rule App (Evaluate) to route calls based on the result.
How It Works
A call arrives at the routing policy
The Query Object App runs a query against your Call Control record
Salesforce evaluates all formula fields at query time (timezone conversion, holiday checks, open/closed status)
The Rule App (Evaluate) checks the returned values and routes the call:
Force Closed? → Play emergency message → Hang up/Voicemail
Holiday Active? → Play holiday message → Hang up/Voicemail
Out of Hours? → Play closed message → Hang up/Voicemail
None of the above? → Route to your normal call flow
Step 1: Create the Custom Object
Navigate to Setup → Object Manager → Create → Custom Object
Configure the following settings:
Setting | Value |
|---|---|
Label | Call Control |
Plural Label | Call Controls |
API Name | Call_Control__c |
Record Name | Routing Policy Name |
Data Type | Text |
Allow Reports | ☑ |
Allow Activities | ☐ |
Track Field History | ☑ |
Allow Search | ☑ |
Allow Bulk API Access | ☑ |
Allow Streaming API Access | ☑ |
Click Save.
Step 2: Set Permissions
The Natterbox integration user (the user your Natterbox AVS connector authenticates as) needs Read access to this object and all its fields.
Go to Setup → Permission Sets (or Profiles)
Find the permission set/profile assigned to your Natterbox integration user
Under Object Settings, find Call Control
Enable Read access on the object
Enable Read access on all fields
Step 3: Create a Tab
Go to Setup → Tabs → Custom Object Tabs → New
Select Call Control as the object
Choose a Tab Style (the clock icon works well)
Add it to the relevant App (e.g., your Natterbox app or admin app)
Click Save
Step 4: Create the Fields
Navigate to Setup → Object Manager → Call Control → Fields & Relationships → New for each field below.
4.1 — UTC Offset
Setting | Value |
|---|---|
Field Type | Number |
Field Label | UTC Offset |
API Name | UTC_Offset |
Length | 2 |
Decimal Places | 1 |
Required | ☑ |
Description | Standard (winter) UTC offset for this policy's timezone. E.g. -5 for US Eastern, 0 for UK, +1 for CET, +5.5 for India. |
Help Text | Enter the standard UTC offset (not DST). See timezone reference table. |
4.2 — DST Rule
Setting | Value |
|---|---|
Field Type | Picklist |
Field Label | DST Rule |
API Name | DST_Rule |
Values | US / EU / None (one per line) |
Default Value | None |
Required | ☑ |
Description | Which daylight saving rule applies. US = Second Sunday March to First Sunday November. EU = Last Sunday March to Last Sunday October. None = No DST observed. |
Help Text | Select the DST rule for this timezone. Choose None if the region does not observe daylight saving. |
4.3 — Monday Open
Setting | Value |
|---|---|
Field Type | Time |
Field Label | Monday Open |
API Name | Monday_Open |
Required | ☐ |
Description | Opening time on Monday in local time |
Help Text | Enter the time this line opens on Monday in local time (e.g. 09:00). Leave blank if closed on this day. |
4.4 — Monday Closed
Setting | Value |
|---|---|
Field Type | Time |
Field Label | Monday Closed |
API Name | Monday_Closed |
Required | ☐ |
Description | Closing time on Monday in local time |
Help Text | Enter the time this line closes on Monday in local time (e.g. 17:30). Leave blank if closed on this day. |
4.5–4.16 — Tuesday through Sunday - Repeat the same steps as 4.3 and 4.4 for each remaining day. All are Time fields, with the required field UNCHECKED
Label | API Name |
|---|---|
Tuesday Open | Tuesday_Open |
Tuesday Closed | Tuesday_Closed |
Wednesday Open | Wednesday_Open |
Wednesday Closed | Wednesday_Closed |
Thursday Open | Thursday_Open |
Thursday Closed | Thursday_Closed |
Friday Open | Friday_Open |
Friday Closed | Friday_Closed |
Saturday Open | Saturday_Open |
Saturday Closed | Saturday_Closed |
Sunday Open | Sunday_Open |
Sunday Closed | Sunday_Closed |
4.17 — DST Active
Setting | Value |
|---|---|
Field Type | Formula |
Return Type | Checkbox |
Field Label | DST Active |
API Name | DST_Active |
Description | Returns true if daylight saving time is currently active based on the DST Rule for this record. |
Formula:
IF(TEXT(DST_Rule__c) = "US",
AND(
TODAY() >= DATE(YEAR(TODAY()), 3, 8) + MOD(1 - WEEKDAY(DATE(YEAR(TODAY()), 3, 8)) + 7, 7),
TODAY() < DATE(YEAR(TODAY()), 11, 1) + MOD(1 - WEEKDAY(DATE(YEAR(TODAY()), 11, 1)) + 7, 7)
),
IF(TEXT(DST_Rule__c) = "EU",
AND(
TODAY() >= DATE(YEAR(TODAY()), 3, 31) - MOD(WEEKDAY(DATE(YEAR(TODAY()), 3, 31)) - 1, 7),
TODAY() < DATE(YEAR(TODAY()), 10, 31) - MOD(WEEKDAY(DATE(YEAR(TODAY()), 10, 31)) - 1, 7)
),
false
)
)Click Check Syntax to validate before saving.
4.18 — Current Time
Setting | Value |
|---|---|
Field Type | Formula |
Return Type | Time |
Field Label | Current Time |
API Name | Current_Time |
Description | The current time converted to the local timezone for this record. Uses UTC Offset + DST Active to calculate. |
Formula:
TIMEVALUE(NOW() + ((UTC_Offset__c + IF(DST_Active__c, 1, 0)) / 24))4.19 — Open Today
Setting | Value |
|---|---|
Field Type | Formula |
Return Type | Time |
Field Label | Open Today |
API Name | Open_Today |
Description | Returns the opening time for the current day of the week. |
Formula:
CASE(
WEEKDAY(TODAY()),
2, Monday_Open__c,
3, Tuesday_Open__c,
4, Wednesday_Open__c,
5, Thursday_Open__c,
6, Friday_Open__c,
7, Saturday_Open__c,
Sunday_Open__c
)4.20 — Closed Today
Setting | Value |
|---|---|
Field Type | Formula |
Return Type | Time |
Field Label | Closed Today |
API Name | Closed_Today |
Description | Returns the closing time for the current day of the week. |
Formula:
CASE(
WEEKDAY(TODAY()),
2, Monday_Closed__c,
3, Tuesday_Closed__c,
4, Wednesday_Closed__c,
5, Thursday_Closed__c,
6, Friday_Closed__c,
7, Saturday_Closed__c,
Sunday_Closed__c
)4.21 — Currently Open
Setting | Value |
|---|---|
Field Type | Formula |
Return Type | Checkbox |
Field Label | Currently Open |
API Name | Currently_Open |
Description | Returns true if the current local time is between today's opening and closing hours. This is the primary field used by the routing policy. |
Formula:
AND(
NOT(ISBLANK(Open_Today__c)),
Current_Time__c >= Open_Today__c,
Current_Time__c <= Closed_Today__c
)4.22–4.41 — Holiday Slots
Rather than creating named holiday fields (Christmas, Easter, etc.), create generic numbered slots. Admins can use any slot for any holiday without needing new fields. For the purpose of this example we have created 5 Holiday slots (20 Fields). You may need to create more depending on how many holidays you observe.
Full list of API names to create:
Slot | Name | Start | End | Message |
|---|---|---|---|---|
1 | Holiday_1_Name | Holiday_1_Start | Holiday_1_End | Holiday_1_Message |
2 | Holiday_2_Name | Holiday_2_Start | Holiday_2_End | Holiday_2_Message |
3 | Holiday_3_Name | Holiday_3_Start | Holiday_3_End | Holiday_3_Message |
4 | Holiday_4_Name | Holiday_4_Start | Holiday_4_End | Holiday_4_Message |
5 | Holiday_5_Name | Holiday_5_Start | Holiday_5_End | Holiday_5_Message |
For each slot (1–5), create these 4 fields:
Holiday X Name
(Replace X with the Slot Number)
Setting | Value |
|---|---|
Field Type | Text |
Field Label | Holiday X Name |
API Name | Holiday_X_Name |
Length | 80 |
Required | ☐ |
Description | Name/label for this holiday slot. For admin reference only — not used in routing. |
Help Text | Enter a name so you know what this holiday is. E.g. "Christmas 2026" |
Holiday X Start
Setting | Value |
|---|---|
Field Type | Date/Time |
Field Label | Holiday X Start |
API Name | Holiday_X_Start |
Required | ☐ |
Description | The date and time that this holiday closure begins. |
Help Text | Enter when this line should close for this holiday. E.g. 24/12/2025 17:30 |
Holiday X End
Setting | Value |
|---|---|
Field Type | Date/Time |
Field Label | Holiday X End |
API Name | Holiday_X_End |
Required | ☐ |
Description | The date and time that this holiday closure ends. |
Help Text | Enter when this line should reopen after this holiday. E.g. 02/01/2026 09:00 |
Holiday X Message
Setting | Value |
|---|---|
Field Type | Text |
Field Label | Holiday X Message |
API Name | Holiday_X_Message |
Length | 255 |
Required | ☐ |
Description | The TTS message callers hear when calling during this holiday closure. |
Help Text | Enter the message callers will hear during this holiday. |
4.42 — Holiday Active
Setting | Value |
|---|---|
Field Type | Formula |
Return Type | Checkbox |
Field Label | Holiday Active |
API Name | Holiday_Active |
Description | Returns true if the current date/time falls within ANY of the holiday closure windows. |
Formula:
OR(
AND(NOT(ISBLANK(Holiday_1_Start__c)), NOW() >= Holiday_1_Start__c, NOW() <= Holiday_1_End__c),
AND(NOT(ISBLANK(Holiday_2_Start__c)), NOW() >= Holiday_2_Start__c, NOW() <= Holiday_2_End__c),
AND(NOT(ISBLANK(Holiday_3_Start__c)), NOW() >= Holiday_3_Start__c, NOW() <= Holiday_3_End__c),
AND(NOT(ISBLANK(Holiday_4_Start__c)), NOW() >= Holiday_4_Start__c, NOW() <= Holiday_4_End__c),
AND(NOT(ISBLANK(Holiday_5_Start__c)), NOW() >= Holiday_5_Start__c, NOW() <= Holiday_5_End__c)
)4.43 — Holiday Message
Setting | Value |
|---|---|
Field Type | Formula |
Return Type | Text |
Field Label | Holiday Message |
API Name | Holiday_Message |
Description | Returns the TTS message for whichever holiday is currently active. Checks slots in order (1 first). Returns blank if no holiday is active. |
Formula:
IF(AND(NOT(ISBLANK(Holiday_1_Start__c)), NOW() >= Holiday_1_Start__c, NOW() <= Holiday_1_End__c), Holiday_1_Message__c,
IF(AND(NOT(ISBLANK(Holiday_2_Start__c)), NOW() >= Holiday_2_Start__c, NOW() <= Holiday_2_End__c), Holiday_2_Message__c,
IF(AND(NOT(ISBLANK(Holiday_3_Start__c)), NOW() >= Holiday_3_Start__c, NOW() <= Holiday_3_End__c), Holiday_3_Message__c,
IF(AND(NOT(ISBLANK(Holiday_4_Start__c)), NOW() >= Holiday_4_Start__c, NOW() <= Holiday_4_End__c), Holiday_4_Message__c,
IF(AND(NOT(ISBLANK(Holiday_5_Start__c)), NOW() >= Holiday_5_Start__c, NOW() <= Holiday_5_End__c), Holiday_5_Message__c,
"")))))4.44 — Force Closed
Setting | Value |
|---|---|
Field Type | Checkbox |
Field Label | Force Closed |
API Name | Force_Closed |
Default Value | Unchecked |
Description | When checked, forces this line closed regardless of business hours. Use for emergencies or unplanned closures. |
Help Text | Tick this box to immediately close this line. Callers will hear the Force Closed Message. |
4.45 — Force Closed Message
Setting | Value |
|---|---|
Field Type | Text |
Field Label | Force Closed Message |
API Name | Force_Closed_Message |
Length | 255 |
Required | ☐ |
Description | The TTS message callers hear when the line has been manually force-closed. |
Help Text | E.g. "We are currently experiencing unexpected issues. Please try again later." |
Step 5: Configure the Page Layout
Navigate to Setup → Object Manager → Call Control → Page Layouts
Click on the default layout
Organise fields into sections:
Section 1 — Settings (single column)
Routing Policy Name
UTC Offset
DST Rule
Section 2 — Opening Hours (2-column)
Left Column | Right Column |
|---|---|
Monday Open | Monday Closed |
Tuesday Open | Tuesday Closed |
Wednesday Open | Wednesday Closed |
Thursday Open | Thursday Closed |
Friday Open | Friday Closed |
Saturday Open | Saturday Closed |
Sunday Open | Sunday Closed |
Section 3 — Status (single column, all read-only)
DST Active
Current Time
Open Today
Closed Today
Currently Open
Section 4 — Holidays (2-column)
Left Column | Right Column |
|---|---|
Holiday 1 Name | Holiday 1 Message |
Holiday 1 Start | Holiday 1 End |
Holiday 2 Name | Holiday 2 Message |
Holiday 2 Start | Holiday 2 End |
Holiday 3 Name | Holiday 3 Message |
Holiday 3 Start | Holiday 3 End |
Holiday 4 Name | Holiday 4 Message |
Holiday 4 Start | Holiday 4 End |
Holiday 5 Name | Holiday 5 Message |
Holiday 5 Start | Holiday 5 End |
Holiday Active (read-only) | Holiday Message (read-only) |
Section 5 — Overrides (single column)
Force Closed
Force Closed Message
Click Save
Step 6: Create Your Records
Create a record for each unique schedule you need. If multiple routing policies share the same opening hours, timezone, and holidays, they can all point to the same record — no need to duplicate.
Example: If your UK Sales, UK Support, and UK Billing policies all follow the same hours and holidays, create one record called UK Standard Hours and point all three routing policies at the record using the same query. Update hours or holidays once, and it applies everywhere.
For policies with different schedules (different timezone, different hours, different holidays), create a separate record.
Filling in Opening Hours
Enter all times in local time — the formulas handle timezone conversion automatically
If the line is closed on a particular day (e.g., weekends), leave both the Open and Closed fields blank for that day. A blank day will always evaluate as closed.
If the line has different hours on different days (e.g., closes early on Fridays), just enter the different times for that day
Times use 24-hour format: 09:00, 17:30, 22:00, etc.
Filling in Holiday Slots
Use any available slot for any holiday — the slot number doesn't matter, they're checked in order
Once a holiday has passed, you can clear the slot and reuse it for the next one, or leave old holidays in place (they won't trigger once the end date has passed)
Leave all 4 fields blank for unused slots — they'll be ignored by the formula
Writing Messages (TTS)
The text you enter in Holiday Message and Force Closed Message fields is read aloud to callers by the Text-to-Speech (TTS) engine. Keep the following in mind:
Language: The message must be written in the language that matches the TTS voice configured in your routing policy. If your policy uses an English voice, write in English. If it uses a French voice, write in French.
Example record:
.png?sv=2022-11-02&spr=https&st=2026-05-11T12%3A09%3A58Z&se=2026-05-11T12%3A29%3A58Z&sr=c&sp=r&sig=nUxlZ%2BUJY4evdI8TlGk9B5Z6550KbOqmln7jmzoVc5c%3D)
Part 2: Building the Routing Policy
.png?sv=2022-11-02&spr=https&st=2026-05-11T12%3A09%3A58Z&se=2026-05-11T12%3A29%3A58Z&sr=c&sp=r&sig=nUxlZ%2BUJY4evdI8TlGk9B5Z6550KbOqmln7jmzoVc5c%3D)
Step 7: Add the Query Object App
In your routing policy, inside an Action Container (placed after Inbound Numbers):
Add a Query Object app
Configure:
- Record Type = Call Control
- Filter Results (Routing Policy Name) = (Testing Policy)
(Replace “Testing Policy” with the name of your Call Control record you created)- Return Fields (Currently Open), (Holiday Active), (Holiday Message), (Force Closed), (Force Closed Message)
.png?sv=2022-11-02&spr=https&st=2026-05-11T12%3A09%3A58Z&se=2026-05-11T12%3A29%3A58Z&sr=c&sp=r&sig=nUxlZ%2BUJY4evdI8TlGk9B5Z6550KbOqmln7jmzoVc5c%3D)
Macro Reference
When the Query Object App retrieves a record, all returned fields are stored as macros using this format:
$(SForce_ResultSetName.FieldAPIName)
With the Result Set (Query Component Name) named CallControl:
Macro | Returns |
|---|---|
$(SForce_CallControl.Currently_Open__c) | true or false |
$(SForce_CallControl.Holiday_Active__c) | true or false |
$(SForce_CallControl.Holiday_Message__c) | The active holiday's TTS message text |
$(SForce_CallControl.Force_Closed__c) | true or false |
$(SForce_CallControl.Force_Closed_Message__c) | The force-closed TTS message text |
Step 8: Add Rules
Add a new Action Container, after the Query Object and connect all nodes:
Add 3 Rule apps
Order matters — Force Closed → Holiday → Out of Hours → Open. Most restrictive first.
Configure:
Rule | Force Closed |
Rule Type | Evaluate |
Property | $(SForce_CallControl.Force_Closed__c) |
Operator | Equals |
Value | true |
Rule | Holiday Closure |
Rule Type | Evaluate |
Property | $(SForce_CallControl.Holiday_Active__c) |
Operator | Equals |
Value | true |
Rule | Out of Hours |
Rule Type | Evaluate |
Property | $(SForce_CallControl.Currently_Open__c) |
Operator | Equals |
Value | false |
.png?sv=2022-11-02&spr=https&st=2026-05-11T12%3A09%3A58Z&se=2026-05-11T12%3A29%3A58Z&sr=c&sp=r&sig=nUxlZ%2BUJY4evdI8TlGk9B5Z6550KbOqmln7jmzoVc5c%3D)
Step 9: Setting up closure messages in the TTS Speak App
After each rule rule:
Add a speak app
Configure:
Each speak component can have its respective Macro added and voice set.
Force Close Message - $(SForce_CallControl.Force_Closed_Message__c)
Holiday Message - $(SForce_CallControl.Holiday_Message__c)
Out of Hours - This will be a static TTS message as it does not need to change frequently. Optionally you could add another field under the call control object to capture this input if desired.
.png?sv=2022-11-02&spr=https&st=2026-05-11T12%3A09%3A58Z&se=2026-05-11T12%3A29%3A58Z&sr=c&sp=r&sig=nUxlZ%2BUJY4evdI8TlGk9B5Z6550KbOqmln7jmzoVc5c%3D)
.png?sv=2022-11-02&spr=https&st=2026-05-11T12%3A09%3A58Z&se=2026-05-11T12%3A29%3A58Z&sr=c&sp=r&sig=nUxlZ%2BUJY4evdI8TlGk9B5Z6550KbOqmln7jmzoVc5c%3D)
Step 10: Open Hours Flow
If none of the above rules trigger, the call falls through to the next app below — this is your open/in-hours flow. Connect to your normal routing (Hunt Group, Call Queue, Connect a Call, etc.).
.png?sv=2022-11-02&spr=https&st=2026-05-11T12%3A09%3A58Z&se=2026-05-11T12%3A29%3A58Z&sr=c&sp=r&sig=nUxlZ%2BUJY4evdI8TlGk9B5Z6550KbOqmln7jmzoVc5c%3D)
Key Points
Rules trigger on match — if the condition is met, the call routes via the middle connector. If not, it passes to the next app below.
Order matters — Force Closed → Holiday → Out of Hours → Open. Most restrictive first.
One record per schedule — each has its own timezone, hours, and holidays.
Admins enter local times — formulas handle UTC conversion automatically.
One rule for all holidays — generic slots mean you never touch the policy to add a new holiday.
No policy changes needed — admins manage everything from the Salesforce record.
Testing
Set a test record's hours to a window you can test within
Call the number assigned to that policy
Verify the call routes correctly for open/closed
Toggle Force Closed and call again — confirm the override message plays
Set a holiday slot window that includes now — confirm the holiday message plays
Check the formula fields on the record to verify Currently Open, Current Time, DST Active, and Holiday Active are calculating correctly
Timezone Reference
Timezone | UTC Offset | DST Rule |
|---|---|---|
US Eastern | -5 | US |
US Central | -6 | US |
US Mountain | -7 | US |
US Pacific | -8 | US |
UK | 0 | EU |
Central Europe | +1 | EU |
Eastern Europe | +2 | EU |
India | +5.5 | None |
Singapore / HK | +8 | None |
Japan | +9 | None |
Australia (Sydney) | +10 | AU* |
New Zealand | +12 | NZ* |
*For AU/NZ timezones, add additional IF branches to the DST_Active__c formula with the appropriate transition dates for those regions.