Skip to contentSkip to navigationSkip to topbar
On this page

Time of day routing with Functions


A very common use case for Functions is implementing time of day routing in your application. For example, varying your application's response to incoming calls based on what time and day a customer is calling, or which path to take in an IVR being written with Twilio Studio.

Before getting deeper into the example, first create a Service and Function so that you have a place to write and test your Function code.


Create and host a Function

create-and-host-a-function page anchor

In order to run any of the following examples, you will first need to create a Function into which you can paste the example code. You can create a Function using the Twilio Console or the Serverless Toolkit as explained below:

ConsoleServerless Toolkit

If you prefer a UI-driven approach, creating and deploying a Function can be done entirely using the Twilio Console and the following steps:

  1. Log in to the Twilio Console and navigate to the Functions tab(link takes you to an external page). If you need an account, you can sign up for a free Twilio account here(link takes you to an external page)!
  2. Functions are contained within Services. Create a Service by clicking the Create Service(link takes you to an external page) button and providing a name such as test-function.
  3. Once you've been redirected to the new Service, click the Add + button and select Add Function from the dropdown.
  4. This will create a new Protected Function for you with the option to rename it. The name of the file will be path it is accessed from.
  5. Copy any one of the example code snippets from this page that you want to experiment with, and paste the code into your newly created Function. You can quickly switch examples by using the dropdown menu of the code rail.
  6. Click Save to save your Function's contents.
  7. Click Deploy All to build and deploy the Function. After a short delay, your Function will be accessible from: https://<service-name>-<random-characters>-<optional-domain-suffix>.twil.io/<function-path>
    For example: test-function-3548.twil.io/hello-world.

Your Function is now ready to be invoked by HTTP requests, set as the webhook of a Twilio phone number, invoked by a Twilio Studio Run Function Widget, and more!


Date and time dependent responses

date-and-time-dependent-responses page anchor

One potential implementation is to simply respond to callers with a different message depending on the day and time that they are calling. Suppose your business is located on the East coast of the US, and has hours 9am-5pm, Monday-Friday. Calls on those days and between those hours should receive a response indicating that the business is open, while calls on the weekend or outside of business hours should receive a closed message.

This can be accomplished purely by leveraging built-in JavaScript methods, courtesy of the Internationalization API's Intl.DateTimeFormat(link takes you to an external page) object. By providing the specific timeZone of your business in the accepted tz format(link takes you to an external page), you can derive the current day and time, and perform any necessary logic to determine your response.

To test this code out, paste the code into the Function that you just created earlier, and set it as the A Call Comes In webhook handler for the Twilio phone number you wish to test. The following instructions will show you how to do so.

(warning)

Warning

Remember that methods such as new Date() return the local time of the machine that your deployed code is being executed on, not your local time. Functions are typically executing in the UTC time zone. This is why all examples are using Intl.DateTimeFormat(link takes you to an external page) instead of just the Date object directly.

(information)

Info

We highly recommend using built-in objects such as Intl.DateTimeFormat(link takes you to an external page) to implement your application logic, or the date-fns(link takes you to an external page) library if you need more robust date utilities.

Moment.js(link takes you to an external page) is end of life and should not be used for handling time zone shifts, formatting, etc.

Responding to a call based on date and time of call

responding-to-a-call-based-on-date-and-time-of-call page anchor
1
exports.handler = (context, event, callback) => {
2
// Create a new voice response object
3
const twiml = new Twilio.twiml.VoiceResponse();
4
// Grab the current date and time. Note that this is the local time where the
5
// Function is being executed, not necessarily the time zone of your business!
6
const now = new Date();
7
// Print the timezone of the instance that's running this code
8
const functionTz = Intl.DateTimeFormat().resolvedOptions().timeZone;
9
console.log(`This Function is being executed in the ${functionTz} time zone`);
10
// You should see: 'This Function is being executed in the UTC time zone'
11
12
// Configure Intl.DateTimeFormat to return a date in the specified
13
// time zone and in this format for parsing, for example: 'Monday, 18'
14
const formatOptions = {
15
hour: 'numeric',
16
hour12: false,
17
weekday: 'long',
18
timeZone: 'America/New_York',
19
};
20
const formatter = new Intl.DateTimeFormat('en-US', formatOptions);
21
22
// Get the current time and day of the week for your specific time zone
23
const formattedDate = formatter.format(now).split(', ');
24
const day = formattedDate[0]; // ex. 'Monday'
25
const hour = Number(formattedDate[1]); // ex. 18
26
// Since we're given days as strings, we can use Array.includes to check
27
// against a list of days we want to consider the business closed
28
const isWeekend = ['Sunday', 'Saturday'].includes(day);
29
30
// Here the business is considered open M-F, 9am-5pm Eastern Time
31
const isOpen = !isWeekend && hour >= 9 && hour < 17;
32
// Modify the stated voice response depending on whether the business is open or not
33
twiml.say(`Business is ${isOpen ? 'Open' : 'Closed'}`);
34
return callback(null, twiml);
35
};

Set a Function as a webhook

set-a-function-as-a-webhook page anchor

In order for your Function to react to incoming SMS and/or voice calls, it must be set as a webhook for your Twilio number. There are a variety of methods to set a Function as a webhook, as detailed below:

Twilio ConsoleTwilio CLITwilio SDKs

You can use the Twilio Console(link takes you to an external page) UI as a straightforward way of connecting your Function as a webhook:

  1. Log in to the Twilio Console's Phone Numbers page(link takes you to an external page).

  2. Click on the phone number you'd like to have connected to your Function.

  3. If you want the Function to respond to incoming SMS, find the A Message Comes In option under Messaging. If you want the Function to respond to Voice, find the A Call Comes In option under Voice & Fax.

  4. Select Function from the A Message Comes In or A Call Comes In dropdown.

  5. Select the Service that you are using, then the Environment (this will default to ui unless you have created custom domains ), and finally Function Path of your Function from the respective dropdown menus.
    Connect a Function as a Messaging webhook using the Function dropdowns.
  • Alternatively, you could select Webhook instead of Function, and directly paste in the full URL of the Function.
    Setting a Function as a Messaging webhook using the webhook dropdown option.
  1. Click the Save button.

Time of day routing in a Studio Flow

time-of-day-routing-in-a-studio-flow page anchor

This logic can also be applied in the context of a Studio Flow, such as in an IVR. For example, a Function can return an isOpen property as a Boolean (or a more advanced data structure if you like), and a subsequent Split Based On... Widget could then perform pattern matching on that value to determine how the Flow should advance. The following code sample would generate a Boolean that can be consumed in a Split Based On... Widget by referencing {{widgets.<widget-name>.parsed.isOpen}}.

Check out this section of the Run Function widget example to better understand consuming parsed values and generally how to execute this sample via the Run Function widget.

Support time of day routing in Twilio Studio

support-time-of-day-routing-in-twilio-studio page anchor
1
exports.handler = (context, event, callback) => {
2
// Grab the current date and time. Note that this is the local time where the
3
// Function is being executed, not necessarily the time zone of your business!
4
const now = new Date();
5
// Configure Intl.DateTimeFormat to return a date in the specified
6
// time zone and in this format for parsing, for example: 'Monday, 18'
7
const formatOptions = {
8
hour: 'numeric',
9
hour12: false,
10
weekday: 'long',
11
timeZone: 'America/New_York',
12
};
13
const formatter = new Intl.DateTimeFormat('en-US', formatOptions);
14
15
// Get the current time and day of the week for your specific time zone
16
const formattedDate = formatter.format(now).split(', ');
17
const day = formattedDate[0]; // ex. 'Monday'
18
const hour = Number(formattedDate[1]); // ex. 18
19
// Since we're given days as strings, we can use Array.includes to check
20
// against a list of days we want to consider the business closed
21
const isWeekend = ['Sunday', 'Saturday'].includes(day);
22
23
// Here the business is considered open M-F, 9am-5pm Eastern Time
24
const isOpen = !isWeekend && hour >= 9 && hour < 17;
25
// Return isOpen in an object that can be parsed and then
26
// used by the Split Based On... Widget for Flow routing
27
return callback(null, { isOpen });
28
};

Need some help?

Terms of service

Copyright © 2024 Twilio Inc.