AWS Messaging & Targeting Blog
Send voice appointment reminders using Amazon Pinpoint custom channels and Amazon Connect
Introduction
In this post, we will walk through setting up an always-on appointment reminder campaign in Amazon Pinpoint. No-show rates are a constant challenge for service providers. Industries such as hospitality estimate 20% of diners miss reservations in big cities,1 while salons average five missed appointments per week.2 Professional services such as financial institutions and sales teams have similar challenges to ensure clients do not miss meetings. To these businesses, an appointment missed represents lost revenue. As a result, the no-show rate is a key metric to improve. An outbound voice message provides another way to reach customers versus emails or SMS, and voice reminders give customers the choice of channels based on personal preferences.
Overview
Amazon Pinpoint is a multichannel communications service enabling customers to send both promotional and transactional messages across email, SMS, push notifications, voice, and custom channels. Amazon Connect is an easy to use omnichannel cloud contact center that helps companies provide superior customer service at a lower cost.
There are benefits of using these services together. Amazon Pinpoint allows you to build a segment of users which can be used within a campaign. Amazon Connect can enable customers to send outbound voice messages at scale should your user audience be large and require a high number of transactions per second (TPS).
To use these services together, you setup custom channels in Amazon Pinpoint, which can be created via an AWS Lambda function. These functions enable you to call APIs to trigger message sends as part of Amazon Pinpoint campaigns. Amazon Pinpoint has developed a new AWS Lambda function which can be used to send outbound voice messages via Amazon Connect. This configuration allows you to define the voice message to be sent, define the segment of users you would like to target, and send voice messages at scale through Amazon Connect via the Amazon Pinpoint custom channel.
The audience for this solution are technical customers who are used to working with multiple AWS services and are familiar with AWS Lambda functions. The solution built relies on the Amazon Pinpoint custom channel feature and targeting, along with the Amazon Connect outbound voice API called via a prepared AWS Lambda function. Once completed, you will be able to create an evergreen campaign which will send outbound voice messages to your patients who have an appointment the following day.
The costs associated with this solution will be:
- Amazon Connect outbound voice calls per minute
- Amazon Connect claimed phone number(s)
- Amazon Pinpoint Monthly Targeted Audience (MTA) costs.
The costs for a outbound voice reminder system that sends 10k messages per day, with an average length of 20 seconds per call, to an total monthly audience of 300k, in the US are as follows. Note that prices with vary for other countries. Complete Amazon Connect outbound call pricing can be found here.
Solution
Prerequisites:
For this walkthrough the article assumes:
- An AWS account
- Basic understanding of IAM and privileges required to create the following; IAM identity provider, roles, policies, and users
- Basic understanding of Amazon Pinpoint and how to create a project
- Basic understanding of Amazon Connect and experience in creating contact flows. More information on setup of Amazon Connect can be found here.
Step 1: Create an Appointment Reminder custom event
The first step in setting up this solution is to create and report a custom event to Amazon Pinpoint. There are multiple ways to report events in your application. Ffor demonstration purposes, below are two example event calls using the AWS SDK for Python (Boto3) from inside an AWS Lambda Function.
It is important to note that the Amazon Pinpoint events API can also be used to update endpoints when the event gets registered. In the below example, the first API call will update the endpoint attributes AppointmentDate
and AppointmentTime
with the details of the upcoming appointment. These attributes will be used in the outgoing message to the end-user
Sample Event: Appointment Coming Up
import boto3
client = boto3.client('pinpoint')
app_id = '[PINPOINT_PROJECT_ID]'
endpoint_id = '[ENDPOINT_ID]'
address = '[PHONE_NUMBER]'
def lambda_handler(event, context):
client.put_events(
ApplicationId = applicationId,
EventsRequest={
'BatchItem': {
endpoint_id: {
'Endpoint': {
'ChannelType': 'CUSTOM',
'Address': address,
'Attributes': {
'AppointmentDate': ['December 15th, 2020'],
'AppointmentTime': ['2:15pm']
}
},
'Events':{
'appointment-event': {
'Attributes':{},
'EventType': 'AppointmentReminder',
'Timestamp': datetime.datetime.fromtimestamp(time.time()).isoformat()
}
}
}
}
}
)
NOTE: The following steps assume that the AppointmentReminder
event is being reported to Amazon Pinpoint. If you are unable to integrate the above API call into your application, you can manually create an AWS Lambda function using a Python runtime with the above code to trigger sample events.
Step 2: Create an Amazon Connect contact flow for outbound calls
This article assumes that you have an Amazon Connect contact center already setup and working. In this step, we will set up our Amazon Connect contact flow to dial our recipients and play read the message before hanging up.
- Log in to your Amazon Connect instance using your access URL (https://<alias>.awsapps.com/connect/login).
Note: Replace alias with your instance’s alias. - In the left navigation bar, pause on Routing, and then choose Contact flows.
- Under Contact flows, choose a template, or choose Create contact flow to design a contact flow from scratch. For more information, see Create a New Contact Flow.
- Download the sample JSON contact flow configuration file Outbound_calling.json.
- Choose the dropdown menu under Save and choose Import flow (beta).
- Select the Outbound_calling.json file in the Import flow (beta) dialog and choose Save.
- Choose Save to open the Save flow dialog. Then choose Save to close the dialog.
- Choose Publish to open the Publish dialog. Then choose Publish to close the dialog.
- In the contact flow designer, expand Show additional flow information.
- Under ARN, copy the Amazon Resource Name (ARN) contact flow. It looks like the following:
arn:aws:connect:region:123456789012:instance/[ConnectInstanceId]/contact-flow/[ConnectContactFlowId]
Note the ConnectInstanceId and ConnectContactFlowId from the ARN, they will be used in the next step. - In the left navigation bar, pause on Routing and then choose Queues.
- Choose the queue you wish to use for the outbound calls.
- In the Edit queue screen, expand Show additional queue information.
- Under ARN, copy the Amazon Resource Name (ARN) for the queue. It looks like the following:
arn:aws:connect:region:123456789012:instance/[ConnectInstanceId]/contact-flow/[ConnectQueueId]
Note the ConnectQueueId from the ARN. It will be used in the next step.
Step 3: Deploy and modify the Amazon Pinpoint to the Amazon Connect custom channel with AWS Lambda function
Next, we will need to deploy an Amazon Pinpoint custom channel. Custom channels in Amazon Pinpoint allow you to send messages through any service with an API, including Amazon Connect. The AWS Serverless Application Repository contains an open-sourced AWS Lambda function that we will use for our custom channel. After deploying the AWS Lambda function, we will customize it to match our requirements.
- Navigate to the AWS Lambda Console, then choose Create function.
- Under Create function, Choose Browser serverless app repository.
- Under Public applications, choose the checkbox next to Show apps that create custom IAM roles or resource policies and enter amazon-pinpoint-connect-channel in the search box.
- Choose the amazon-pinpoint-connect-channel card from the list and review the Application details.
- Under Application settings enter the details for ConnectContactFlowId, ConnectInstanceId, and ConnectQueueId from the previous step.
- After reviewing all the details, choose the checkbox next to I acknowledge that this app creates custom IAM roles and resource policies and choose Deploy.
- Wait a couple minutes for the application to deploy two AWS Lambda functions and an AWS Simple Queue Service queue.
- Under Resources, choose the PinpointConnectQueuerFunction resource to open the AWS Lambda function configuration. This is the AWS Lambda function that Amazon Pinpoint will call when the message is crafted.
- Under Function code, scroll down to line 31 and replace
message = "Hello World! -Pinpoint Connect Channel"
with
message = "This is a reminder of your upcoming appointment on {0} at {1}".format(endpoint_profile["Attributes"]["AppointmentDate"][0], endpoint_profile["Attributes"]["AppointmentTime"][0])
- Choose Deploy.
Step 4: (Optional) Modify the custom channel AWS Lambda function to meet change the rate of outgoing calls
By default, the custom channel we deployed in the previous step will place outbound calls through Amazon Connect at a rate of 1 call every 3 seconds. This allows you to configure how many active outbound calls to avoid running into service limits. Review your current service limits in Amazon Connect for more details.
- Navigate to the AWS Lambda Console, then choose AmazonPinpointConnectChannel-backgroundprocessor function.
- Under Function code, scroll down to line 73 and replace the sleep timer, currently set with 3 seconds, with your requirements.
- Choose Deploy.
Step 5: Create a Pinpoint custom campaign with your lambda function and segment
- Create a CSV file to import endpoints with the attributes of AppointmentDate and AppointmentTime.
Example:
Id,Address,ChannelType,Attributes.AppointmentDate,Attributes.AppointmentTime
1,+1[PHONE_NUMBER],SMS,November 30 2020,9:00am
2,+1[PHONE_NUMBER2],SMS,November 30 2020,10:00am
Navigate to the Amazon Pinpoint console.
- In the All Projects list, select your project.
- In the navigation pane, choose Segments.
- Choose Create a Segment.
- Choose Import a segment and upload your CSV file and choose Create segment.
- In the navigation pane, choose Campaigns.
- Choose Create campaign.
- In the Create a campaign wizard, enter a name for campaign name.
- Under Channel choose Custom.
- Choose Next.
- On the Choose a segment screen, choose the segment created above, and choose Next.
- On the Create your message screen, do the following:
a) For Lambda function choose AmazonPinpointConnectChannel that we deployed in Step 3 above.
b) For endpoint Options choose SMS.
c) Choose Next. - On the Choose when to send the campaign screen, do the following:
a) Choose When an event occurs.
b) Under Events, choose the AppointmentReminder event.
c) Under campaign dates, choose a Start date and time and an End date and time to be used as the campaign’s duration. - Choose Next.
- Review the campaign details and choose Launch campaign.
Cleanup:
To remove the two AWS Lambda functions and the Amazon Simple Queue Service queue provisioned in the steps above in order not to incur further charges, please follow these steps below.
- Navigate to the Amazon CloudFormation Console.
- Choose severlessrepo-amazon-pinpoint-connect-channel and choose Delete.
- Choose Delete stack in the delete confirmation window.
Next Steps:
You can continue to iterate on this experience using Amazon Pinpoint and Amazon Connect to create a custom user experience.
- Update the Amazon Connect contact flow to get customer input with a message that allows them to select an option to be routed to an agent for appointment rescheduling.
- Become familiar with Pinpoint Journeys and how to use voice alongside other channels. More information can be found here.
- Consume the Amazon Pinpoint Event Stream by configuring it manually or deploying the AWS Solution Digital User Engagement Events Database Solution to view the success and failure metrics of the Amazon Connect outbound call API.
To learn more about these services, please visit the Amazon Pinpoint or Amazon Connect web pages.
(1) https://www.scisolutions.com/uploads/news/Missed-Appts-Cost-HMT-Article-042617.pdf
(2) https://blog.carbonfreedining.org/the-ultimate-guide-to-restaurant-no-shows