Edited at
TwilioDay 4

TwiMLアプリでユーザートラッキングするなら気をつけろ


TwiMLアプリケーションのユーザートラッキング

少々細かい話ですが、IVRのサービス改善には必ず必要なトラッキングについてちょっと困ったことがあったのでメモしておきます。

IVRなどの自動応答サービスを構築する際に、顧客がどこまで通話を進めたのかをチェックするのは重要です。通常のウェブサービスならGoogle Analyticsのようなサービスを使ってサイト内のユーザーの動向を簡単に把握することができますが、TwiMLアプリケーションの場合、毎回のアクセスはステートレスなので、CallSIDを使ってユーザーのサービス内での回遊状況を追いかける方法を自前で用意しなければいけません。

一般的には、アクセス毎にデータベースなどにログを記録するような方法でこれを実現するわけですが、TwiMLアプリケーションの場合、実際にユーザーがどのタイミングで電話を切ったのか正確に把握する方法がありません。

<?xml version="1.0" encoding="UTF-8"?>

<Response>
<Gather action="/auth" numDigits="4" timeout="10">
<Play>https://example.com/files/greeting.mp3</Play>
<Pause length="1"/>
<Play>https://example.com/files/auth.mp3</Play>
</Gather>
<Redirect>https://example.com/auth</Redirect>
</Response>

例えば、ユーザーに認証用コードを入力してもらうようなケースを考えてみます。上のTwiMLは greeting.mp3 というファイルで音声を再生し、1秒置いてから auth.mp3 というファイルを再生しています。例えば「こちらは◯◯サービスです。ご利用ありがとうございます」という音声の後に「お客様の認証用コードを、4桁の数字で入力してください」みたいな音声が流れる感じでしょうか。 Gather の後にちゃんと同じ actionRedirect を置いているので、もしユーザーが何も入力しなくてもエラーにならない、大変いいサンプルコードですね。


Twilioの謎挙動と対処方法

しかし、このTwiMLをサーバから送出した場合、実はユーザーがこのメッセージをどこまで聞いたのか知る方法はありません。 /authDigits パラメータを持ってアクセスしてきたなら端末のボタンを押して番号を送信してくれたことはわかりますが、メッセージをどこまで再生したのかはわかりません。しかも、それだけではありません。もっと厄介なことに、実はこの内容だと、ユーザーがこのメッセージを再生している最中に電話を切ったのか、それとも何も操作せず次のアクションに移ってから切ったのかを判定することができないのです(!)。

というのも、TwiMLの最後に Redirect があると、TwilioはこのTwiMLを処理した時点で電話を切ったとしても、 Redirect で指定されたURLに必ずアクセスしてくるという謎挙動をするため、このアクセスがユーザの行動によるものなのかTwilioが勝手にやって来ただけなのか、知る手段がないのです。

Redirect がなければ、もしユーザーが10秒間何もしなければアプリケーションエラーになってしまうので、なくすわけにもいきませんから、大変悩ましいところです。そこで、筆者は次の /auth の1つ前にリダイレクトをするだけの処理を入れておくことで、ユーザーが何も操作しなかったのかどうかを判定するといういじましい対応をしました。

<?xml version="1.0" encoding="UTF-8"?>

<Response>
<Gather action="/auth" numDigits="4" timeout="10">
<Play>https://example.com/files/greeting.mp3</Play>
<Pause length="1"/>
<Play>https://example.com/files/auth.mp3</Play>
</Gather>
<Redirect>https://example.com/go_to_auth</Redirect><!-- ココ! -->
</Response>

そして、この /go_to_auth では下の単純なレスポンスを返します。

<?xml version="1.0" encoding="UTF-8"?>

<Response>
<Redirect>https://example.com/auth</Redirect>
</Response>

もしユーザーが電話を切らずに操作せずリダイレクトして来た場合は、この /go_to_authRedirect は実行されてユーザーは次の案内に移動します。そうではなくTwilioがユーザーが電話を切ったにも関わらずアクセスして来ただけの場合は、この Redirect は実行されないので、ここでログを記録すればユーザーのアクションが判定できます。


最後に・お願い

こんなのロジックでもなんでもないとお怒りの方もいらっしゃるでしょうが、どうぞこのTwilioの挙動を直そうとTwilio社に連絡するようなことは決してなさらないでください。このマニュアルにない挙動に依拠したアプリケーションもあるのですから…