[アップデート]Amazon Connectは、大量のアウトバウンドキャンペーンをエージェントレス(自動音声応答)で行うことができるようになりました
はじめに
Amazon Connectは、大量のアウトバウンドキャンペーン(旧称:アウトバウンド通信) をエージェントレス(自動応答)で利用できるようになりました。
アウトバウンドキャンペーンとは、地域の規制への準拠をサポートしながら、音声、SMS、Eメールでのコミュニケーションを通じて顧客に迅速にサービスを提供し、エージェントの生産性を向上させる機能です。
従来、アウトバウンドキャンペーンはエージェントの介入が必須でしたが、アップデートによって「エージェントレス」つまり、自動音声応答(IVR)による運用が可能となりました。
現在、アウトバウントキャンペーンは、東京リージョンには未対応です。
アウトバウントキャンペーンの音声使用の料金は、下記を確認しましょう。
具体的な活用シーン
エージェントレスによって、どのような場面で利用できるかいくつか考えてみました。
- 予約リマインダー: 医療機関や美容院、レストランなどで予約しているユーザーに対し、予約時間の前日などに自動通知を送信します。ユーザーは電話のプッシュ番号により予約の確認やキャンセルが可能です。
- 催告通知: ユーザーに対して未払請求書や予定されたサービス料の支払いタイミングを自動的に通知します。ユーザーは、複数の支払い方法からプッシュ番号を使って特定の支払い方法を選ぶことができます。
- イベントの告知: 会議、ウェビナー、新製品の発売など、特定のイベントの参加者や潜在顧客に対して情報を発信します。興味があれば、プッシュ番号を使って詳細を聞くことが可能。
- 緊急通知: 会社の従業員や特定の地域の住民に向けて、必要な緊急時のアラートや注意喚起情報を聞くことができる
ちなみに、ユーザー側は、プッシュ番号だけでなく、例えばAmazon Lexを利用し、音声での回答も可能です。色々なフローが作り込めそうですね。
今回は、上記の活用シーンのうち、「予約リマインダー」をアウトバウンドキャンペーンのエージェントレスタイプで実装してみたいと思います。
具体的なシーンとしては、予約済みのユーザーに対して、予約前日に予約確認(リマインド)を電話で行い、予定通り来店されるかどうかをユーザーに確認します。
そして、予定通り来店するのか、予約をキャンセルするかをユーザーが電話のプッシュ番号を押すことで確認します。
下記のお問い合わせを構築します。
予定通り来店する場合、下記の流れになります。
予約をキャンセルする場合、下記の流れになります。
AWSの構成としては、以下となります。
アウトバウントキャンペーンで発信するユーザーの電話番号をAmazon Pinpointのセグメントにインポートします。
Pinpointのジャーニー機能を利用し、Amazon Connectのアウトバウントキャンペーンとセグメント(対象のユーザー)を設定することで、ユーザーに発信します。
ジャーニー機能を利用することで、電話に出たユーザーと出なかったユーザー数を把握することができます。
電話が繋がらなかった場合
今回の予約のリマインダーで、ユーザーに電話が繋がらなかった場合、どのような対応をすればよいか疑問に思われるかもしれません。
一つの方法として、電話に出なかった場合、条件分岐を行い、SMSやEメールなどの別の方法でリマインドが可能です。
詳しくは解説しませんが、下記のブラックベルトでソリューション概要が紹介されていますので、ご参考ください。
試してみた
今回はバージニアリージョンのAmazon Connect(アウトバウントキャンペーン)からオレゴンリージョンのAmazon Connect(受信)の電話番号に発信してみます。
下記の記事を参考に進めます。
- [アップデート]Amazon Connectで大量のアウトバウンド通信機能がパブリックプレビューされたので試してみる
- Make predictive and progressive calls using Amazon Connect outbound campaigns
バージニアリージョンのAmazon Connectのアウトバウントキャンペーンはデフォルトで有効になっておりました。有効化されているか確認しましょう。
お問い合わせフロー
オレゴンリージョン側のお問い合わせフローは、「顧客キュー」と「コンタクトフロー」のタイプを作成します。
顧客キューは、下記の通り作成します。
下記のJSONデータをお問い合わせフローにインポートして利用することも可能です
顧客キュー(クリックすると展開します)
{"Version":"2019-10-30","StartAction":"df317949-be67-406d-b9dd-f7d6e993b603","Metadata":{"entryPointPosition":{"x":40,"y":40},"ActionMetadata":{"d0f5ddce-dee5-4063-afa0-858d55acfe15":{"position":{"x":363.2,"y":180}},"df317949-be67-406d-b9dd-f7d6e993b603":{"position":{"x":136.8,"y":112},"parameters":{"Messages":[]},"audio":[]}},"Annotations":[],"name":"cm-hirai-顧客キューフロー","description":"","type":"customerQueue","status":"published","hash":{}},"Actions":[{"Parameters":{},"Identifier":"d0f5ddce-dee5-4063-afa0-858d55acfe15","Type":"EndFlowExecution","Transitions":{}},{"Parameters":{"Messages":[{"Text":"Thank you for calling. Your call is very important to us and will be answered in the order it was received."}]},"Identifier":"df317949-be67-406d-b9dd-f7d6e993b603","Type":"MessageParticipantIteratively","Transitions":{"NextAction":"d0f5ddce-dee5-4063-afa0-858d55acfe15","Errors":[{"NextAction":"d0f5ddce-dee5-4063-afa0-858d55acfe15","ErrorType":"NoMatchingError"}]}}]}
コンタクトフローは、下記の通り作成しました。電話番号もこのフローに紐づけておきます。
下記のJSONデータをお問い合わせフローにインポートして利用することも可能です。(キューは自身のキューに変更が必要)
コンタクトフロー(クリックすると展開します。アカウントIDは、各々変えて下さい。)
{"Version":"2019-10-30","StartAction":"44b55b45-4945-49b8-aae7-13c54a62d899","Metadata":{"entryPointPosition":{"x":40,"y":40},"ActionMetadata":{"44b55b45-4945-49b8-aae7-13c54a62d899":{"position":{"x":174.4,"y":67.2}},"69699841-8374-4cbf-b064-3cdcea417bec":{"position":{"x":180.8,"y":229.6},"parameters":{"EventHooks":{"CustomerQueue":{"displayName":"cm-hirai-顧客キューフロー"}}},"contactFlow":{"text":"cm-hirai-顧客キューフロー","id":"arn:aws:connect:us-west-2:アカウントID:instance/85ee8f12-d807-4d9e-bc65-737dccfa77d5/contact-flow/66290b92-02d3-4caa-9d9e-ecb4eaec74b5"},"customerOrAgent":true},"f63ab334-c501-4d3a-b5ca-f1954d11f391":{"position":{"x":399.2,"y":238.4},"parameters":{"QueueId":{"displayName":"cm-hirai"}},"queue":{"text":"cm-hirai"}},"1b810c21-21b5-4fc8-8319-fb34e592dc9b":{"position":{"x":632.8,"y":249.6}},"c6c2679f-a12f-4294-8272-5c09776e3785":{"position":{"x":628,"y":476.8}}},"Annotations":[],"name":"cm-hirai-telephone","description":"","type":"contactFlow","status":"published","hash":{}},"Actions":[{"Parameters":{"FlowLoggingBehavior":"Enabled"},"Identifier":"44b55b45-4945-49b8-aae7-13c54a62d899","Type":"UpdateFlowLoggingBehavior","Transitions":{"NextAction":"69699841-8374-4cbf-b064-3cdcea417bec"}},{"Parameters":{"EventHooks":{"CustomerQueue":"arn:aws:connect:us-west-2:アカウントID:instance/85ee8f12-d807-4d9e-bc65-737dccfa77d5/contact-flow/66290b92-02d3-4caa-9d9e-ecb4eaec74b5"}},"Identifier":"69699841-8374-4cbf-b064-3cdcea417bec","Type":"UpdateContactEventHooks","Transitions":{"NextAction":"f63ab334-c501-4d3a-b5ca-f1954d11f391","Errors":[{"NextAction":"c6c2679f-a12f-4294-8272-5c09776e3785","ErrorType":"NoMatchingError"}]}},{"Parameters":{"QueueId":"arn:aws:connect:us-west-2:アカウントID:instance/85ee8f12-d807-4d9e-bc65-737dccfa77d5/queue/cbb81f8e-c958-466f-a515-4bdafe94633c"},"Identifier":"f63ab334-c501-4d3a-b5ca-f1954d11f391","Type":"UpdateContactTargetQueue","Transitions":{"NextAction":"1b810c21-21b5-4fc8-8319-fb34e592dc9b","Errors":[{"NextAction":"c6c2679f-a12f-4294-8272-5c09776e3785","ErrorType":"NoMatchingError"}]}},{"Parameters":{},"Identifier":"1b810c21-21b5-4fc8-8319-fb34e592dc9b","Type":"TransferContactToQueue","Transitions":{"NextAction":"c6c2679f-a12f-4294-8272-5c09776e3785","Errors":[{"NextAction":"c6c2679f-a12f-4294-8272-5c09776e3785","ErrorType":"QueueAtCapacity"},{"NextAction":"c6c2679f-a12f-4294-8272-5c09776e3785","ErrorType":"NoMatchingError"}]}},{"Parameters":{},"Identifier":"c6c2679f-a12f-4294-8272-5c09776e3785","Type":"DisconnectParticipant","Transitions":{}}]}
アウトバウントキャンペーンを行うバージニアリージョンのコンタクトフローは、こちらの記事(エージェントを利用したアウトバウントキャンペーン)の「A-Outbound-Campaign-With-Contact-Attributes」をベースにしています。
変更点は、赤枠の箇所です。
この箇所で、エージェントレスにするため、プッシュ番号による分岐処理を行っています。
下記の通り、「予約を通り来店できる場合は、1を、予約をキャンセルする場合は、2」を受信者に押すように伝えます。
1を押した場合は、「ご来店をお待ちしております。」、2を押した場合は、「キャンセルしました。」とプロンプトが再生されます。(実際のシステムでは、キャンセル時に、LambdaなどでDBの書き換えなどの実装が必要です)
下記のJSONデータをお問い合わせフローにインポートして利用することも可能です。
アウトバウントキャンペーン(クリックすると展開します)
{"Version":"2019-10-30","StartAction":"d6276ba6-918e-43ce-a353-d4bfd8607c16","Metadata":{"entryPointPosition":{"x":14.4,"y":14.4},"ActionMetadata":{"f85d02c0-a40b-49ed-93d1-f213bd4dc050":{"position":{"x":902.4,"y":822.4}},"d8a3a333-18b5-4cbd-9038-329a74b8ab7b":{"position":{"x":900.8,"y":1005.6}},"9e46dbc4-586e-4404-85dd-1b7737534c40":{"position":{"x":896.8,"y":450.4}},"0eb2c218-9643-45da-9195-996a8e107e3f":{"position":{"x":543.2,"y":866.4},"dynamicParams":[]},"e657bccf-0c6c-4cf8-b6f9-f47c99fa853b":{"position":{"x":900.8,"y":636.8}},"2fae6691-b4ac-4729-bb1e-e06084b267bc":{"position":{"x":540,"y":1068.8},"dynamicParams":[]},"055f4fb9-71a8-407a-9a79-b07c9999cb61":{"position":{"x":545.6,"y":444.8},"dynamicParams":[]},"ea10076c-d61e-4cdd-878f-99eb31353bd7":{"position":{"x":420,"y":14.4}},"70e3ec2f-dcb1-45b5-b42f-93f5b463f96b":{"position":{"x":544.8,"y":656.8},"dynamicParams":[]},"80c8d044-a529-4d63-ab3a-c09c826f21dd":{"position":{"x":147.2,"y":400}},"d6276ba6-918e-43ce-a353-d4bfd8607c16":{"position":{"x":184.8,"y":19.2}},"1ea7e26e-bca2-4c77-afca-cc5d1ca765b5":{"position":{"x":541.6,"y":232.8},"dynamicParams":[]},"832e59ca-682c-4cf8-9b21-62a0508a2933":{"position":{"x":1226.4,"y":48}},"8153e9d2-c8d7-4230-9180-dd437d3e2f53":{"position":{"x":1457.6,"y":710.4}},"316f4517-92dc-40c3-91cb-3282e05ee687":{"position":{"x":1231.2,"y":241.6}},"f04248f5-7fdc-4de2-bafc-1be3917315d0":{"position":{"x":890.4,"y":53.6},"conditionMetadata":[{"id":"ef8c85e1-40a6-403e-ae58-6135e220f040","value":"1"},{"id":"2740bb04-3328-4c67-baba-2474ca6ff117","value":"2"}]}},"Annotations":[{"type":"default","id":"6e395683-b4e4-426a-ab07-ea967b373744","content":"Lambdaなどを使い、DBの予約情報を削除などのロジックを組む","actionId":"","isFolded":false,"position":{"x":1961,"y":386},"size":{"height":295,"width":300}}],"name":"A-Outbound-Campaign-With-Contact-Attributes","description":"","type":"contactFlow","status":"published","hash":{}},"Actions":[{"Parameters":{"Text":"No detection"},"Identifier":"f85d02c0-a40b-49ed-93d1-f213bd4dc050","Type":"MessageParticipant","Transitions":{"NextAction":"8153e9d2-c8d7-4230-9180-dd437d3e2f53"}},{"Parameters":{"Text":"Error branch"},"Identifier":"d8a3a333-18b5-4cbd-9038-329a74b8ab7b","Type":"MessageParticipant","Transitions":{"NextAction":"8153e9d2-c8d7-4230-9180-dd437d3e2f53"}},{"Parameters":{"Text":"Voicemail with beep"},"Identifier":"9e46dbc4-586e-4404-85dd-1b7737534c40","Type":"MessageParticipant","Transitions":{"NextAction":"8153e9d2-c8d7-4230-9180-dd437d3e2f53"}},{"Parameters":{"Attributes":{"CPA":"NODETECTION"},"TargetContact":"Current"},"Identifier":"0eb2c218-9643-45da-9195-996a8e107e3f","Type":"UpdateContactAttributes","Transitions":{"NextAction":"f85d02c0-a40b-49ed-93d1-f213bd4dc050","Errors":[{"NextAction":"f85d02c0-a40b-49ed-93d1-f213bd4dc050","ErrorType":"NoMatchingError"}]}},{"Parameters":{"Text":"Voicemail with no beep"},"Identifier":"e657bccf-0c6c-4cf8-b6f9-f47c99fa853b","Type":"MessageParticipant","Transitions":{"NextAction":"8153e9d2-c8d7-4230-9180-dd437d3e2f53"}},{"Parameters":{"Attributes":{"CPA":"ERROR"},"TargetContact":"Current"},"Identifier":"2fae6691-b4ac-4729-bb1e-e06084b267bc","Type":"UpdateContactAttributes","Transitions":{"NextAction":"d8a3a333-18b5-4cbd-9038-329a74b8ab7b","Errors":[{"NextAction":"d8a3a333-18b5-4cbd-9038-329a74b8ab7b","ErrorType":"NoMatchingError"}]}},{"Parameters":{"Attributes":{"CPA":"VOICEMAILBEEP"},"TargetContact":"Current"},"Identifier":"055f4fb9-71a8-407a-9a79-b07c9999cb61","Type":"UpdateContactAttributes","Transitions":{"NextAction":"9e46dbc4-586e-4404-85dd-1b7737534c40","Errors":[{"NextAction":"9e46dbc4-586e-4404-85dd-1b7737534c40","ErrorType":"NoMatchingError"}]}},{"Parameters":{"RecordingBehavior":{"RecordedParticipants":["Agent","Customer"]},"AnalyticsBehavior":{"Enabled":"True","AnalyticsLanguage":"en-US","AnalyticsRedactionBehavior":"Disabled","AnalyticsRedactionResults":"None","ChannelConfiguration":{"Chat":{"AnalyticsModes":[]},"Voice":{"AnalyticsModes":["RealTime"]}}}},"Identifier":"ea10076c-d61e-4cdd-878f-99eb31353bd7","Type":"UpdateContactRecordingBehavior","Transitions":{"NextAction":"80c8d044-a529-4d63-ab3a-c09c826f21dd"}},{"Parameters":{"Attributes":{"CPA":"VOICEMAILNOBEEP"},"TargetContact":"Current"},"Identifier":"70e3ec2f-dcb1-45b5-b42f-93f5b463f96b","Type":"UpdateContactAttributes","Transitions":{"NextAction":"e657bccf-0c6c-4cf8-b6f9-f47c99fa853b","Errors":[{"NextAction":"e657bccf-0c6c-4cf8-b6f9-f47c99fa853b","ErrorType":"NoMatchingError"}]}},{"Parameters":{},"Identifier":"80c8d044-a529-4d63-ab3a-c09c826f21dd","Type":"CheckOutboundCallStatus","Transitions":{"NextAction":"2fae6691-b4ac-4729-bb1e-e06084b267bc","Conditions":[{"NextAction":"1ea7e26e-bca2-4c77-afca-cc5d1ca765b5","Condition":{"Operator":"Equals","Operands":["CallAnswered"]}},{"NextAction":"055f4fb9-71a8-407a-9a79-b07c9999cb61","Condition":{"Operator":"Equals","Operands":["VoicemailBeep"]}},{"NextAction":"70e3ec2f-dcb1-45b5-b42f-93f5b463f96b","Condition":{"Operator":"Equals","Operands":["VoicemailNoBeep"]}},{"NextAction":"70e3ec2f-dcb1-45b5-b42f-93f5b463f96b","Condition":{"Operator":"Equals","Operands":["NotDetected"]}}],"Errors":[{"NextAction":"2fae6691-b4ac-4729-bb1e-e06084b267bc","ErrorType":"NoMatchingError"}]}},{"Parameters":{"FlowLoggingBehavior":"Enabled"},"Identifier":"d6276ba6-918e-43ce-a353-d4bfd8607c16","Type":"UpdateFlowLoggingBehavior","Transitions":{"NextAction":"ea10076c-d61e-4cdd-878f-99eb31353bd7"}},{"Parameters":{"Attributes":{"CPA":"AGENTLESS"},"TargetContact":"Current"},"Identifier":"1ea7e26e-bca2-4c77-afca-cc5d1ca765b5","Type":"UpdateContactAttributes","Transitions":{"NextAction":"f04248f5-7fdc-4de2-bafc-1be3917315d0","Errors":[{"NextAction":"f04248f5-7fdc-4de2-bafc-1be3917315d0","ErrorType":"NoMatchingError"}]}},{"Parameters":{"Text":"ご来店をお待ちしております。"},"Identifier":"832e59ca-682c-4cf8-9b21-62a0508a2933","Type":"MessageParticipant","Transitions":{"NextAction":"8153e9d2-c8d7-4230-9180-dd437d3e2f53","Errors":[{"NextAction":"8153e9d2-c8d7-4230-9180-dd437d3e2f53","ErrorType":"NoMatchingError"}]}},{"Parameters":{},"Identifier":"8153e9d2-c8d7-4230-9180-dd437d3e2f53","Type":"DisconnectParticipant","Transitions":{}},{"Parameters":{"Text":"キャンセルしました。"},"Identifier":"316f4517-92dc-40c3-91cb-3282e05ee687","Type":"MessageParticipant","Transitions":{"NextAction":"8153e9d2-c8d7-4230-9180-dd437d3e2f53","Errors":[{"NextAction":"8153e9d2-c8d7-4230-9180-dd437d3e2f53","ErrorType":"NoMatchingError"}]}},{"Parameters":{"StoreInput":"False","InputTimeLimitSeconds":"15","Text":"クラスにゃん様は、明日、午前9時に予約されています。\n予定通り、来店できるできる場合は、1を、\nキャンセルする場合は、2を押して下さい。"},"Identifier":"f04248f5-7fdc-4de2-bafc-1be3917315d0","Type":"GetParticipantInput","Transitions":{"NextAction":"8153e9d2-c8d7-4230-9180-dd437d3e2f53","Conditions":[{"NextAction":"832e59ca-682c-4cf8-9b21-62a0508a2933","Condition":{"Operator":"Equals","Operands":["1"]}},{"NextAction":"316f4517-92dc-40c3-91cb-3282e05ee687","Condition":{"Operator":"Equals","Operands":["2"]}}],"Errors":[{"NextAction":"8153e9d2-c8d7-4230-9180-dd437d3e2f53","ErrorType":"InputTimeLimitExceeded"},{"NextAction":"8153e9d2-c8d7-4230-9180-dd437d3e2f53","ErrorType":"NoMatchingCondition"},{"NextAction":"8153e9d2-c8d7-4230-9180-dd437d3e2f53","ErrorType":"NoMatchingError"}]}}]}
アウトバウントキャンペーン用のコンタクトフロー作成後、電話番号と紐つけておきましょう。
アウトバウントキャンペーン設定
バージニアリージョンで設定します。
アウトバウントキャンペーンで利用するキューは、下記の設定です。
アウトバウントキャンペーンと紐づいている電話番号と同じにします。
続いて、アウトバウントキャンペーンを作成します。
問い合わせフローは、「A-Outbound-Campaign-With-Contact-Attributes」を選択し、上記で作成したキューを選択、ダイヤラー設定は、アップデート内容であるエージェントレスを選択します。
これで、Connect側の設定は完了です。
Pinpoint用のIAMロールの作成
PinpointがConnectのキャンペーン利用を許可するためのIAMロールを作成します。
ポリシーは、下記の通りです。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "*" }, { "Effect": "Allow", "Action": [ "connect-campaigns:PutDialRequestBatch", "connect-campaigns:StartCampaign", "connect-campaigns:GetCampaignState*" ], "Resource": "arn:aws:connect-campaigns:us-east-1:アカウントID:campaign/*" } ] }
IAMロールのエンティティは、下記を設定します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "pinpoint.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
Pinpointのセグメント作成
アウトバウントキャンペーンを送信する電話番号を含めたユーザー情報をセグメントにインポートします。
バージニアリージョンでPinpointのプロジェクトを作成後、[セグメント]から[セグメントをインポート]を行います。
今回は、下記の内容CSVファイルに加えてもよいです。(参考記事でのサンプルをベースにしてます。)
+18011111111
の箇所は、オレゴンリージョンのConnectの電話番号に変えましょう。
ChannelType,Address,EndpointStatus,OptOut,Location.Country,Demographic.Make,Demographic.Platform,EffectiveDate,Attributes.CampaignIdentifier,User.UserId VOICE,+18011111111,ACTIVE,NONE,US,Apple,iOS,2021-06-29T09:31:49.764Z,PlatinumCreditCards,example-user-id-62
これでセグメントが作成できました。
ジャーニーを作成
最後のパートです。ジャーニーを作成し、アウトバウントキャンペーンを通知します。
まず、ジャーニーエントリで、先程作成したセグメントを選択します。
続いて、「コンタクトセンター経由で送信」を追加します。
バージニアリージョンのConnectインスタンスと先程作成したアウトバウントキャンペーンとIAMロールを設定します。
最後に、パブリッシュ
をクリックすると、設定した時間範囲内で、オレゴンリージョンのConnectに電話がかかります。
オレゴンリージョンのConnectの問い合わせコントロールパネル(CCP)を起動しておくと、電話がかかります。
- 「クラスにゃん様は、明日、午前9時に予約されています。予定通り、来店できるできる場合は、1を、キャンセルする場合は、2を押して下さい。」
- 1を押した場合、「ご来店をお待ちしております。」とプロンプトが再生されます
- 2を押した場合、「キャンセルしました。」とプロンプトが再生されます
最後に
今回のアップデートのエージェントレス(自動応答)によって、アウトバウントキャンペーンの活用シーンが増えます。
特に「エージェントレス」タイプは、エージェントの介入が不要な場面で効果的であり、エージェントの手間を大いに減らすことが可能です。加えて、プッシュ番号による分岐処理やAmazon Lexなどを組み込むことで、より柔軟な顧客とのコミュニケーションが可能となります。
現在アウトバウントキャンペーン機能は、東京リージョンでは未対応ですが、先日、フランクフルト(eu-central-1)でも利用できるようになりましたので、東京リージョンでも使える日は遠くないかもしれません