Skip to contentSkip to navigationSkip to topbar
Rate this page:
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

_35
exports.handler = (context, event, callback) => {
_35
// Create a new voice response object
_35
const twiml = new Twilio.twiml.VoiceResponse();
_35
// Grab the current date and time. Note that this is the local time where the
_35
// Function is being executed, not necessarily the time zone of your business!
_35
const now = new Date();
_35
// Print the timezone of the instance that's running this code
_35
const functionTz = Intl.DateTimeFormat().resolvedOptions().timeZone;
_35
console.log(`This Function is being executed in the ${functionTz} time zone`);
_35
// You should see: 'This Function is being executed in the UTC time zone'
_35
_35
// Configure Intl.DateTimeFormat to return a date in the specified
_35
// time zone and in this format for parsing, for example: 'Monday, 18'
_35
const formatOptions = {
_35
hour: 'numeric',
_35
hour12: false,
_35
weekday: 'long',
_35
timeZone: 'America/New_York',
_35
};
_35
const formatter = new Intl.DateTimeFormat('en-US', formatOptions);
_35
_35
// Get the current time and day of the week for your specific time zone
_35
const formattedDate = formatter.format(now).split(', ');
_35
const day = formattedDate[0]; // ex. 'Monday'
_35
const hour = Number(formattedDate[1]); // ex. 18
_35
// Since we're given days as strings, we can use Array.includes to check
_35
// against a list of days we want to consider the business closed
_35
const isWeekend = ['Sunday', 'Saturday'].includes(day);
_35
_35
// Here the business is considered open M-F, 9am-5pm Eastern Time
_35
const isOpen = !isWeekend && hour >= 9 && hour < 17;
_35
// Modify the stated voice response depending on whether the business is open or not
_35
twiml.say(`Business is ${isOpen ? 'Open' : 'Closed'}`);
_35
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

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


Rate this page: