TCPA (Telephone Consumer Protection Act) is a series of US legislation that dictates how automated systems can reach out to customers over phone and SMS. These limitations typically involve:

  • Restrictions on the time of day messages can be sent
  • Restrictions on sending messages during holidays
  • Allowing users to opt out of receiving messages

📘

TCPA limitations vary from state-to-state.

Here, we discuss the tools Airkit provides to streamline the enforcement of TCPA compliance when applicable as part of an application flow.

When to be concerned about TCPA

TCPA is important for all external communication with a consumer that occurs over phone or SMS. This includes communication beyond SMS messages and phone calls. For example, TCPA regulations can still apply if you are sending internet-to-phone messages such as WhatsApp or Google Hangouts.

You can provide additional assurances by getting an opt-in from the consumer. Typically, this is accomplished by sending messages to a phone number that the user themselves provided (either through Airkit or your own system). This opt-in can demonstrate that the consumer has initially consented to messages and provides you permission to do so with less restrictions.

Additional Resources on TCPA Compliance

How to enable TCPA timing restrictions

The first thing you need to do in order to enable TCPA timing restrictions is establish the user's current region and timezone.

Airkit automatically collects the user's timezone as soon as a Journey begins, which can be accessed under session.timeZone. Information regarding the user's region must be established by other means: for instance, by utilizing a 3rd Party API to look this information up based on zip code, or by asking the user for their region directly.

🚧

In order to most easily utilize a user's established region and timezone, both region and timezone must be formatted correctly. Regions must be described by their State/Province Abbreviation Key, and timezones must be described by their TZ database names. The timezone stored under session.timeZone is automatically saved in this format.

Once the user's region and timezone have been established, they can be used to designate an Availability Schedule that encompasses all windows of time in which messages are allowed to be sent.

Airkit comes out-of-the-box with the relevant Availability Schedules already configured. You can designate the appropriate out-of-box Availability Schedule dynamically, using the following Airscript expression, assuming the variable actor.region corresponds to the user's region, and the variable actor.time_zone refers to the user's timezone:

"TCPA-{{actor.region}}-{{actor.time_zone}}"

This returns the Availability Schedule Key that refers to the out-of-the-box Availability Schedule that encompasses times messages are allowed to be sent and remain TCPA-compliant. For more on Availability Schedule Keys, see Schedules Builder.

Voice Bots, Chat Bots, and Notifications sent as Actions

To enable TCPA timing restrictions on messages sent as Actions, you need to add calendar restrictions to the timers triggering the relevant Actions.

All timers provide the option to control whether the triggered Actions should be adjusted for TCPA compliance. Under Adjust by Calendar, you have the option to enter in a Custom Expression designating an Availability Schedule Key that references all windows of time in which the Actions triggered by the timer will be run. To designate the appropriate out-of-box Availability Schedule dynamically, use the following Airscript in a Custom Expression, assuming the variable actor.region corresponds to the user's region, and the variable actor.time_zone refers to the user's timezone:

"TCPA-{{actor.region}}-{{actor.time_zone}}"

When Inspecting the timer, defining an Availability Schedule based on a Custom Expression appears as follows:

After entering that expression, define how the timer will behave if the designated execution time is not available. To stay TCPA compliant, you must select either Do not schedule and cancelSchedule in next available time, or Run in previous available window.

Notifications sent from a Journey Step

Enabling TCPA timing restrictions on Notifications sent from a Journey Step requires initializing the Actor with an appropriate value for actor.calendar_restriction.

actor.calendar_restriction expects an Availability Schedule Key, and Notifications sent from Journey Steps will only be sent within the windows of time described by the Availability Schedule. To simplify the process of defining actor.calendar_restriction, Airkit does it automatically whenever an Actor is initialized with values for actor.region and actor.time_zone, so that:

actor.calendar_restriction = "TCPA-{{actor.region}}-{{actor.time_zone}}"

This actor.calendar_restriction value references an out-of-the-box Availability Schedule that encompasses blocks of time the TCPA allows messages to be sent within the Actor's region and timezone. Outgoing Notifications sent from Journey Steps will only be sent within the allowed blocks of time.

📘

It is also possible to initialize the Actor with a designated value for actor.calendar_restriction, as long as the given value takes the form of a valid Availability Schedule key.

For more on Actor Initialization, see Actors.

Enforcing TCPA opt-out requirements

SMS

Airkit sends outgoing SMS messages through Twilio numbers, which automatically support opt-out keywords. For more on how this works, see Twilio's documentation.

Voice

Enabling the option to opt-out of incoming phone calls requires building out a Voice Bot that provides a clear opportunity for users to opt-out.

How to build a TCPA-compliant Voice Bot

It’s important that an automated phone call establishes the intent of the call in the first 15 seconds. When configuring the first Decision Menu of your Voice Bot, make sure to be clear who the phone call is representing and the purpose of the call, and then make it clear that it is possible to opt out of calls.

Add a Keyword Matcher to this Decision Menu and all other Decisions Menus within the Voice Bot. Associate it with the following keywords:

  • STOP
  • STOPALL
  • UNSUBSCRIBE
  • CANCEL
  • END
  • QUIT

Build an additional Decision Menu that asks for confirmation to opt-out of receiving phone calls. Should the user confirm (either by DTMF or Keyword matching), you will need to end the call.

If your application flow entails sending multiple outgoing phone calls, you will need to keep track of the fact that the Actor opted-out of all phone calls, perhaps by defining a global variable, and setting its value such that, when an Actor opts out of phone calls, session.optout = TRUE. Then, before starting any Voice Bot, use the Condition Action to check the value of session.optout, and only proceed to start the Voice Bot if it is not equal to TRUE.


Did this page help you?