LogoLogo
Changelog
18.0
18.0
  • Welcome
    • Welcome to Airkit πŸ‘‹
    • Quickstart
    • Terminology
    • Flight School & Certification
  • Tutorials
    • Your First App (A Simple Form)
      • Building the Web UI
      • Building the Database
      • Finalizing the App
      • Connecting to Salesforce (Advanced)
      • Appendix
      • FAQ
    • Styles, Themes, and Templates
      • Changing the header
      • Changing the Theme
      • Using a custom font
      • FAQ
      • Appendix
    • Multi-Page Form
      • Creating the App Object in AirData
      • Building the Form’s UI
      • Creating the Data Flow to insert data
      • Connecting the Data Flow to the UI
      • Previewing and Publishing the app
    • Scheduling and Follow-Up App
      • Collecting Contact Information
      • Creating Appointment Times
      • Saving Appointment Information
      • Scheduling Appointment Reminder
      • Automating Proactive Follow-Up
      • Finalizing all Journey Steps
      • Appendix
      • FAQ
    • Custom Integrations (Petfinder App)
      • Querying the Petfinder API
      • Displaying Petfinder Data
      • Appendix
  • Concepts
    • Journeys
      • Linking to Journeys
    • Actors
      • Conversations with Actors
  • Console
    • Console
  • Studio
    • Studio
    • Builder Bar
      • Journey Builder
      • Triggers Builder
      • Web Flows Builder
      • Chat Bots Builder
      • Voice Bots Builder
      • Connections Builder
      • Notifications Builder
      • AirData Builder
      • Media Library
      • Theme Builder
      • Schedules Builder
      • Settings
    • App Preview
    • Action Builder
    • Web Flows
    • Data Flows
    • Variable Tree
    • Events
      • Session Started Events
      • Trigger Events
      • Control Events
      • Session Events
      • Activity Group Events
  • Data and Integrations
    • Variable Namespaces
    • Storing and Accessing Data
    • AirData
      • AirData App Objects
      • Identity Objects
      • Place Objects
      • Schedule Objects
      • Datastores
      • AirData Querying Capabilities
    • Standard Journey Data
    • Integrations and APIs
      • Setting up Integrations
      • Adding and Modifying Resources
      • Querying and Manipulating Data
      • Subscriptions (Web Hooks)
      • App APIs
  • SMS
    • Overview
    • SMS Notification Basics
    • Chat Bot Basics
    • Texting Journey Links
    • Information Captured
    • Connecting Twilio Numbers
  • Emails
    • Overview
    • Email Notification Basics
    • Sending Emails by Data Operation
    • Connecting Email Addresses
  • Building Apps
    • Forms
      • Displaying Sections Dynamically
      • Repeating Elements
      • Form Personalization
      • Validation of User Data
      • Capture Secure User Data
      • Progress Bars
      • Dropdown Menus
      • Electronic Signatures
    • Voice and Chat
      • Voice Bot Basics
    • KitCloud
      • Web Flow Templates
      • Data Flow Templates
    • Integration Guides
      • Building an App API
      • Creating SFTP Credentials
      • Swagger Schema Validation
      • Create A Salesforce Lead
      • Create a Zendesk Ticket
    • Calendars
      • Customizing Schedule Availability
      • Using Availability Schedules
      • Rescheduling Deflected Calls
      • Integrating to External Calendars
    • Maps and Addresses
      • Maps
      • Addresses
      • User's Current Location
      • Address Search Map Binding
    • Payments
      • Creating a Stripe Integration
    • Timers and Reminders
      • Setting Timers
      • Setting up Periodic Tasks
    • PDFs
      • Creating a PDF
      • Working with Existing PDFs
    • Assets and Media
      • Using the File Upload Web Control
      • Working with Files and Media
      • Assets and Data Operations
      • Sending Assets to Remote Servers
    • Embeds
      • Embedding Apps on Websites
      • AirClient Configurable Properties
    • Publishing
      • Publishing Your Application
      • Editing an Application
      • Importing/Exporting Apps
      • Profiles and Deployment Settings
      • Tying Variables to Deployments
    • Advanced
      • Custom Controls
      • Creating Custom Functions
  • Authentication
    • SAML Authentication
    • OAuth 2.0 - Google
    • OAuth 2.0 - Okta
    • OAuth 2.0 - Auth0
    • Azure AD B2C
    • Authentication Apps and Secure Apps
  • Airscript
    • Airscript Quickstart
    • Testing Airscript Expressions
    • Airscript Examples
    • Working with Text
    • Working with Numbers and Currency
    • Working with Dates and Times
      • Date and Time Formatting Options
      • Time Unit Values
      • Supported Time Zones
    • Working with Email and Phone
    • Working with Missing Values
    • Working with URLs and Base64
    • Querying Lists and Objects
    • Filtering Data using Query Expression
  • Configuring User Connections
    • Connecting Your Domain
  • Styling
    • Themes and Control Variants
    • Importing and Exporting Themes
    • Working with Custom Fonts
    • Creating an App Header
    • Page Layouts
  • Analytics
    • Analytics Overview
    • Organization Logged Events
      • Snowflake Analytics Schema
      • App Events to Splunk
      • App Events to AWS S3 Buckets
      • Audit Logs to AWS S3 Buckets
      • View Data in Activity Explorer
    • Heap and GTM Integrations
      • Setting up Analytics with GTM
      • Setting up Analytics with Heap
  • Administration
    • SAML SSO for an Organization
    • Managing User Roles
    • Adding Users to Airkit
    • Airkit Organizations
    • Environments
      • Environmental Governance
    • Managing the Application Lifecycle
    • Getting Application Metadata
  • Error Management
    • Logging Custom Event Errors
    • Integrating Error Notifications to Slack
  • Security and Compliance
    • IP Ranges
    • Encrypting Data
    • SSL Auth
    • App Security FAQ
    • TCPA
    • Cookie Policies
  • Airscript Expressions
    • Text Functions
      • CAPITALIZE
      • CONCAT
      • ISSTRING
      • LOWERCASE
      • PADSTRING
      • REPLACE
      • REPT
      • SPLIT
      • STRING_COMPARE
      • STRING_FIND
      • STRIP
      • SUBSTITUTE
      • SUBSTRING
      • TITLECASE
      • TRIM
      • UPPERCASE
    • DateTime Functions
      • ADD_TO_DATE
      • ADD_TO_DATETIME
      • DATE
      • DATETIME
      • DATETIME_DELTA
      • DATETIME_FROM_FORMAT
      • DATETIME_FROM_TIMESTAMP
      • DATE_DELTA
      • DATE_FROM_DATETIME
      • DATE_FROM_FORMAT
      • DAY
      • DAYS
      • FORMAT_DATE
      • FORMAT_DATETIME
      • FORMAT_TIME
      • HOUR
      • ISO_WEEK
      • MINUTE
      • MONTH
      • NOW
      • SECOND
      • SUBTRACT_FROM_DATE
      • SUBTRACT_FROM_DATETIME
      • TIME
      • TIMESTAMP_FROM_DATETIME
      • TIME_DELTA
      • TIME_FROM_DATETIME
      • TIME_FROM_FORMAT
      • TODAY
      • UPDATE_DATE
      • UPDATE_DATETIME
      • UPDATE_DAY
      • UPDATE_HOUR
      • UPDATE_MILLISECOND
      • UPDATE_MINUTE
      • UPDATE_MONTH
      • UPDATE_SECOND
      • UPDATE_TIME
      • UPDATE_TIMEZONE
      • UPDATE_YEAR
      • WEEK
      • WEEKDAY
      • YEAR
    • List Functions
      • CONTAINS
      • FIRST
      • FLAT
      • JOIN
      • LAST
      • LENGTH
      • REMOVE_EMPTY
      • SHUFFLE
    • Object Functions
      • KEYS
      • VALUES
      • MERGE_OBJECTS
    • Math Functions
      • ABS
      • ACOS
      • ACOSH
      • ACOT
      • ACOTH
      • ASIN
      • ASINH
      • ATAN
      • ATAN2
      • ATANH
      • CEILING
      • COMBIN
      • COMBINA
      • COS
      • COSH
      • COT
      • COTH
      • CSC
      • CSCH
      • DEGREES
      • EVEN
      • EXP
      • FACT
      • FACTDOUBLE
      • FLOOR
      • GCD
      • ISEVEN
      • ISNUMBER
      • ISODD
      • LATLNGDISTANCE
      • LCM
      • LN
      • LOG
      • MAX
      • MIN
      • MROUND
      • MULTINOMIAL
      • ODD
      • PI
      • POWER
      • PRODUCT
      • RADIANS
      • RANDOM
      • RANGE
      • ROUND
      • ROUNDDOWN
      • ROUNDUP
      • SEC
      • SECH
      • SIGN
      • SIN
      • SINH
      • SQRT
      • SQRTPI
      • SUM
      • SUMSQ
      • TAN
      • TANH
      • TRUNC
    • Conditional Functions
      • EQUAL
      • IF
      • ISEMPTY
      • ISNOTEMPTY
      • NOT
    • Currency Functions
      • CURRENCY
      • FORMAT_CURRENCY
      • PARSE_CURRENCY
    • Phone Functions
      • FORMAT_PHONE
      • ISPHONE
      • PARSE_PHONE
    • Email Functions
      • ISEMAIL
    • Number Formatting Functions
      • ARABIC
      • FORMAT_NUMBER
      • PARSE_NUMBER
      • ROMAN
    • Data Type Functions
      • FROM_JSON
      • TO_JSON
      • TYPEOF
    • Asset Functions
      • ASSET_SIZE
      • ASSET_STATE
      • ASSET_THUMBNAIL_URL
      • ASSET_TO_URI
      • ASSET_TYPE
      • URI_TO_ASSET
    • Encoding Functions
      • BASE
      • BASE64_DECODE
      • BASE64_ENCODE
      • HMAC_MD5
      • HMAC_SHA1
      • HMAC_SHA256
      • MD5
      • SHA1
      • SHA256
      • URL_DECODE
      • URL_ENCODE
      • UUID
      • VALUE_OF
    • Error Handling Functions
      • THROW
      • TRY
    • Arithmetic Operators
      • Addition (+)
      • Subtraction (-)
      • Multiplication (*)
      • Division (/)
      • Remainder (%)
    • Comparison Operators
      • Equality (=)
      • Inequality (<>, !=)
      • Ordering (<, <=, > , >=)
    • Advanced Expressions
      • User Defined Functions
      • LET...IN
  • web-controls
    • Web Controls Overview
      • Common Style Properties of Web Controls
    • Button
    • Checkbox
    • Checkbox List
    • Container
    • Container List
    • Credit Card
    • Currency Input
    • Date Picker
    • Dropdown List
    • Email Input
    • Embedded External Content (Container)
    • File Upload
    • Hyperlink
    • Image
    • Label
    • Map
    • Number Input
    • Payment Request Button
    • Phone Input
    • Place Search Input
    • Progress Bar
    • Radio Button
    • Radio Button List
    • Scheduler
    • Secure String Input
    • Selectable Container
    • Signature
    • Text Area
    • Text Input
    • Web Flow
    • Web Page
    • QR Code
  • Voice and Chat Controls
    • Dialogue Controls Overview
    • Decision Menu
    • Forward Call
    • Secure Touchtone Capture
    • Text Response Capture
    • Touchtone Capture
  • Data Operations
    • Data Operation Overview
    • AirData Request
      • DELETE
      • PUT
      • INSERT
      • PATCH
      • QUERY
      • DEPRECATED_QUERY
    • Calendar Search
    • Create File
    • Delete Assets
    • Download Encoded Asset
    • Early Return
    • Fetch Asset Details
    • Fill PDF Form
    • Google
    • HTML to PDF
    • HTTP Request
      • Using an API With Paging
    • JWT Generation
    • Merge PDF
    • Run Data Flow
    • Run Event in Journey
    • Salesforce
    • Secure Value Retrieval
    • Send Email
    • SFTP
    • Start Journey
    • Swagger Schema Validation
    • Transform
    • Wait
    • XML to JSON
    • Zendesk
    • ZIP File
  • Actions
    • Analytics Identify
    • Analytics Send Event
    • Close Modal
    • Condition
    • End Session
    • Extend Session Expiration Time
    • Go to Next Journey Step
    • Initialize Actor
    • Log Custom Event
    • Metric: Count
    • Metric: Field
    • Metric: Start Timer
    • Metric: Statistic
    • Metric: Stop Timer
    • Navigate To Web Flow
    • Navigate to Web Page
    • Open Modal
    • Run Data Flow
    • Run Data Flow Repeatedly
    • Run Event
    • Send Email
    • Send SMS
    • Set Authentication
    • Set Identifier
    • Set Variable
    • Start Chat Bot
    • Start Voice Bot
    • Start Timer
    • Stop Timer
  • Variable Data Types
    • Data Types Overview
    • Any (JSON)
    • Asset
      • Detailed Asset
    • Boolean
    • Currency
    • Date
    • DateTime
    • Email
    • List
    • Null
    • Number
    • Phone
    • Text
    • Time
    • Custom Data Types
  • Integrations
    • Custom Integrations
    • Genesys Widget Integration
    • Zendesk Integration
    • Salesforce Integration
    • Plaid Integration
    • Twilio Integration
    • Stripe Integration
    • Shopify Integration
    • Airtable Integration
    • Google Integration
    • SFTP Integration
  • Product Versions
    • CXR Overview
    • Release Cadence and LTS
    • CXR Upgrades and Migrations
Powered by GitBook
On this page
  • When to be concerned about TCPA
  • Additional Resources on TCPA Compliance
  • How to enable TCPA timing restrictions
  • Voice Bots, Chat Bots, and Notifications sent as Actions
  • Notifications sent from a Journey Step
  • Enforcing TCPA opt-out requirements
  • SMS
  • Voice

Was this helpful?

  1. Security and Compliance

TCPA

PreviousApp Security FAQNextCookie Policies

Last updated 1 year ago

Was this helpful?

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 to look this information up based on zip code, or by asking the user for their region directly.

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}}"

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.

"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 cancel, Schedule in next available time, or Run in previous available window.

Notifications sent from a Journey Step

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.

Enforcing TCPA opt-out requirements

SMS

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

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.

🚧 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 , and timezones must be described by their . 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 that encompasses all windows of time in which messages are allowed to be sent.

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 .

All 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:

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

πŸ“˜ 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 .

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

It’s important that an automated phone call establishes the intent of the call in the first 15 seconds. When configuring the first of your , 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.

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 , use the Action to check the value of session.optout, and only proceed to start the Voice Bot if it is not equal to TRUE.

Wikipedia
What is the Telephone Consumer Protection Act (TCPA)? - Twilio
FCC Actions on Robocalls, Telemarketing | Federal Communications Commission
3rd Party API
State/Province Abbreviation Key
TZ database names
Availability Schedule
Schedules Builder
timers
Notifications
Journey Step
Actors
Twilio's documentation
Decision Menu
Voice Bot
starting any Voice Bot
Condition