https://a.storyblok.com/f/270183/724196/1896f135b3/call-tracking-1.png

Mixpanelによるインバウンドボイスコールキャンペーンのトラッキング

最終更新日 May 18, 2021

所要時間:1 分

キャンペーントラッキングは、あらゆるマーケティングや広告キャンペーンにとって「マストアイテム」です。各広告にエンゲージしたユーザー数を正確にトラッキングできなければ、獲得単価(CPA)を算出することができないため、最終的にどのキャンペーンが成功し、どのキャンペーンがビジネスに損失を与えているかを判断することができません。

Could he be any more asleep?

(ビジネス・インテリジェンスでは、技術系よりももっとひどい略語や専門用語が使われる!)。

広告がサポートされているウェブの量が非常に多いため、オンライン・キャンペーンを管理するためのツールがすでにかなり成熟していることは驚くにはあたらない。しかし、印刷物やその他のオフライン広告からの「クリック」を追跡したい場合、ユニークなプロモーションURLやクーポンコードに頼らざるを得ない。

しかし、ユーザーが当社のプロモーションURLやクーポンコードを入力した後は、他のオンライン・キャンペーンと同じように、試行錯誤を重ねたビジネス・インテリジェンスや分析ツールで追跡することができます。

しかし インバウンドの電話?間違いなく、リンクをクリックしただけのユーザーよりも、当社に電話をかけてくるユーザーの方が、当社のブランドにより深く関与しているはずだが、こうしたインタラクションをトラッキングするための既存のツールは、エラーが起こりやすいか、企業向け通話処理機器の場合は法外に高価である。

インバウンドコールトラッキングには、印刷物のURLと同じ難しさがあり、アナログからデジタルへのジャンプが必要です。各キャンペーンにユニークなエントリーポイントが必要で、ユニークなURLのように安価で簡単に設定でき、既存のCRMやBIプラットフォームでインバウンドの音声キャンペーンをトラッキングできるものが必要です。

ネクスモのバーチャルナンバーはこのような状況に最適です。安くて、設定が簡単で、キャンペーンごとにユニークなバーチャルナンバーを作ることができるので、ユーザーがどこでそれぞれのナンバーを見たかを追跡することができ、最終的にどのキャンペーンが最高のROI(投資収益率)をもたらしているかを把握することができます。また、66カ国のローカルナンバーを購入することができるため、地域に特化したキャンペーンを行うことができ、この数は常に増え続けている。

必要条件

ローカルでサンプルを実行したい場合は、以下のものが必要です:

  1. a アカウントこの例では無料版で問題ありません。

  2. ローカルのFlaskアプリケーションをインターネットに公開する方法です。開発中は を使うことが多い。

いくつかの Python/Flaskの知識の知識があると便利ですが、必須ではありません。RubyやPHP、JavaScriptなどを好む方でも、それほど苦労せずについていけるはずです。

何を追跡したいのか?

Mindmap showing what elements we want to track

インバウンドキャンペーン

ユーザーがどのキャンペーンを呼び出したかを知る必要があります。異なるチャネルで複数の異なるキャンペーンが実行されている可能性があるため、キャンペーンを特定し、ユーザーのアクションを正しくアタッチする必要があります。

呼び出し側

理想を言えば、彼らの名前を知りたいところだが、それは特定の地域でのみ可能だ。 特定の地域でのみ可能です.しかし Number Insight APIを使えばを使用すれば、発信元の番号の種類、国、発信頻度を常に特定できるはずです。

電話番号を一意の識別子として使用することにより、この通話以外の行動を追跡することもできます。当社ウェブサイトへの登録時にユーザーの電話番号を取得する場合、次のことが可能です。 VerifyAPIで確認できる。で確認することができれば、今後ユーザーが行うあらゆるアクションを、当社のバーチャル番号にかけた通話と照合することができます。

コール

この例では、完了したコールだけを追跡する。 タイムアウト、失敗、拒否、ビジーなど、さまざまなコールステータスを追跡できる。.その他に追跡する必要がある情報は、通話時間と通話コストです。これで、このキャンペーンによる新規顧客の獲得単価を算出することができます。

インバウンド音声キャンペーンのトラッキング、全プロセス

process diagram showing the complete call tracking flow

上のシーケンス図は非常に難しく見えるかもしれないが、1つずつ見ていこう。

インバウンドコールへの対応

ユーザがNexmoの仮想番号にダイヤルすると、Nexmo APIはNexmoコール制御オブジェクト(NCCO)を要求します。 Nexmoコールコントロールオブジェクト(NCCO)をリクエストします。このNCCO JSONファイルには、着信時にNexmoが実行すべきアクションのリストが含まれます。

最初のアクションは 最初のアクションは、発信者にmp3をストリーミングすることである。このサウンドファイルは、通話を録音してよいことを通知する。

[
  {
    "action": "stream", 
    "streamUrl": [
      "https://example.com/audio/calls-recorded.mp3"
    ]
  }
]

通話を録音し、担当者につなぐ

シーケンス図の2番目の部分では、通話録音を開始し、次に次のように接続する。 発信者をに接続します。

[
  {
    "action": "stream", 
    "streamUrl": [
      "https://example.com/audio/calls-recorded.mp3"
    ]
  }, 
  {
    "action": "record", 
    "eventUrl": [
      "https://example.com/record/"
    ]
  }
]

その 記録動作は簡単である。通話録音が可能になったときに通知を受け取るURLを指定するだけでよい。通話が完了すると、録音は自動的に停止する。

通話の接続

接続アクションを使用する場合、発信元番号はNexmoのバーチャル番号である必要があります。この例では、ユーザーが電話をかけてくるインバウンドボイスキャンペーンの番号を使用します。

[
  {
    "action": "stream", 
    "streamUrl": [
      "https://example.com/audio/calls-recorded.mp3"
    ]
  }, 
  {
    "action": "record", 
    "eventUrl": [
      "https://example.com/record/"
    ]
  }, 
  {
    "action": "connect", 
    "endpoint": [
      {
        "number": "441632960616", 
        "type": "phone"
      }
    ], 
    "from": "441632960277"
  }
]

接続するエンドポイントには、次のようなさまざまなタイプを指定できます。 WebSocketなど、さまざまなタイプのエンドポイントを指定することができるが、ここではプロキシで接続したいので、"phone "というタイプを指定し、次に接続したい番号を指定する。

最初のFlaskビューを作成する

上記のNCCOの例では、すべての値はハードコードされている。しかし、実際の状況では、ユーザーがどのバーチャル番号にダイヤルしたかによって、多くの値が変化します。まず、ユーザーが電話してきたキャンペーンを特定し、次にmp3ファイルの場所とインバウンドエージェントの電話番号を更新する必要があります。

また、ある番号のアクティブなキャンペーンがない場合も考慮する必要がある。おそらく古い広告の番号で、マーケティングキャンペーンはもう実施されていない。このキャンペーンに関するコールに対応できるエージェントがいないかもしれませんが、バーチャル番号をリリースしたくありません。サンプルコードでは 音声合成アクションを使用して、ユーザーに番号がアクティブでなくなったことを通知します。しかし、ライブアプリケーションでは、ユーザーをメインのスイッチボードにリダイレクトするか、より良いユーザーエクスペリエンスを提供する別のアクションを実行することができます。

まず、関連するキャンペーンを見つける方法を見てみよう。

def get_campaign(number_to):
    Campaign = Query()
    campaigns = db.search(
        (Campaign.inbound_number == number_to) | (Campaign.redirect_number == number_to)
    )
    return campaigns[0] if campaigns else None

@app.route('/')
def answer():
    number_to = request.args.get('to')
    campaign = get_campaign(number_to)

我々は tinydb組み込みシステム用に設計されたPython用のシンプルなデータベースエンジンです。これは組み込みシステム用に設計されたPython用のシンプルなデータベースエンジンです。データベースとして単一のフラット(JSON)ファイルに依存しているので、この例には最適ですが、これをSQLAlchemyや他のお好みのORMに置き換えることも簡単です。

Nexmoが私たちのNCCOを要求するとき、それはE164国際フォーマットで呼び出された番号を含みます。 E.164国際フォーマットをクエリー文字列の一部として含みます。Nexmoは関連するキャンペーンをデータベースに照会する際にこの番号を使用しますので、キャンペーン情報をデータベースに保存する際にもE.164形式を使用するようにしてください。

私たちの get_campaign関数は、最初にマッチしたキャンペーンを返します。 None.

Nexmoコール・コントロール・オブジェクトで返信する

上記のステップで一致するキャンペーンを見つけることができれば、NCCOに正しい streamUrl, from番号と endpoint.一致するキャンペーンが見つからない場合は、音声合成APIと合成音声を使ってユーザーに通知します; ダイヤルされた番号は認識されませんでした。

if campaign:
    ncco = [
        {
            'action': 'stream',
            'streamUrl': ['https://example.com/{message}'.format(
                message=campaign['welcome_message']
            )]
        },
        {
            'action': 'record',
            'eventUrl': ['https://example.com/record/']
        },
        {
            'action': 'connect',
            'from': campaign['inbound_number'],
            'endpoint': [{
                'type': 'phone',
                'number': campaign['redirect_number']
            }]
        }
    ]
    return jsonify(ncco)
else:
    return jsonify([{
        'action': 'talk',
        'text': 'The number dialled has not been recognised. Please check and try again'
    }])

インバウンドコール情報のトラッキング

通話が終了すると、通話録音が終了するだけでなく、Nexmoが関連情報をWebhookにトリガーします。

しかし、この完了したイベントには、コールを実行したユーザーに関する情報は含まれない。そのためには NexmoナンバーインサイトAPI.

どのキャンペーンについて電話をかけてきたのか、電話をかけてきたのは誰なのか、そして電話そのものに関する情報など、必要な情報がすべて揃ったら、この情報をMixpanelに保存します。

この例ではMixpanelを使っていますが、Mixpanelしか使えないわけではありません。お好きなツールにデータを送信したり、Segmentのようなツールを使って複数のアプリケーションに同時に送信することができます。Mixpanel、KISSmetrics、Periscope、Chartio、Salesforce、あるいは特注のBIやCRMシステムを使用していても問題ありません。データを受信できるのであれば、インバウンドコールを追跡するためにこれと同じアプローチを使用することができます。

@app.route('/event', methods=['POST'])
def callevent():
    event = json.loads(request.data)

    if event['status'] == 'completed':
        campaign = get_campaign(event['to'])

まず最初に、このエンドポイントは POSTリクエストのみを受け付けるように指定しています。この POSTリクエストのボディは JSON 文字列なので、これを Python オブジェクトに変換する必要があります。

この例では、ステータスがcompletedであるコールにのみ注目している。他にも 他の多くのステータス例えば、インバウンドのサポートコールをトラッキングするソフトウェアを作成する場合、これらのステータスをトラッキングすることは非常に重要です。しかし、今は、完了したコールだけに焦点を当てることにする。

また、既存のキャンペーンに対するリクエストのみを追跡します。そのため、何かをする前に get_campaign関数を使用し、ユーザーがアクティブなキャンペーンについてコールしたことをチェックします。

MixpanelとNexmoクライアントの作成

呼び出し元の情報を調べるには Nexmo APIクライアントのインスタンスが必要になる。次の 12ファクターアプリの方法論NexmoのAPIキーとシークレット、そしてMixpanelプロジェクトのトークンを含む環境変数を作成しました。

mix = Mixpanel(os.environ['MIXPANEL_TOKEN'])
client = nexmo.Client(
    key=os.environ['NEXMO_API_KEY'],
    secret=os.environ['NEXMO_API_SECRET']
)

発信者に関する情報の取得と追跡

高度なNumber Insight APIを使用して、発信者に関する利用可能なすべての情報を取得する。この情報には、発信元の国、ネットワークの種類、利用可能な場合は発信者の名前などのデータが含まれます。

この情報は電話番号とともに、そのユーザー固有の識別子として保存されます。こうすることで、このイベントと、それ以降のすべてのイベントを、Mixpanelの同じユーザーアカウントにリンクさせることができます。その電話番号を持つユーザーがすでに存在する場合、Mixpanelは新しいユーザープロファイルを作成する代わりに、弊社の番号インサイトリクエストから受け取ったデータでそのユーザーのプロファイルを更新し、常に最新の状態に保ちます。

# Fetch people data
insight = client.get_advanced_number_insight(number=event['from'])
uid = event['from']

# Create/Update user in Mixpanel
mix.people_set(
    uid,
    {
        '$phone': '+' + event['from'],
        '$first_name': insight.get('first_name'),
        '$last_name': insight.get('last_name'),
        'Country': insight.get('country_name'),
        'Country Code': insight.get('country_code_iso3'),
        'Valid Number': insight.get('valid_number'),
        'Reachable': insight.get('reachable'),
        'Ported': insight.get('ported'),
        'Roaming': insight.get('roaming').get('status'),
        'Carrier Name': insight.get('current_carrier').get('name'),
        'Network Type': insight.get('current_carrier').get('network_type'),
        'Network Country': insight.get('current_carrier').get('country'),
    }
)

他にもいくつかのMixpanel APIメソッドを使用します。 people_track_chargeそして people_increment.これらのメソッドを使用して、そのユーザーからの電話に応答するために費やした金額と、そのユーザーからの電話の回数を追跡します。

# Useful for Mixpanel revenue tracking
mix.people_track_charge(uid, float(data.get('price')) * -1)

# Track number of times user calls
mix.people_increment(uid, {'Number of Calls': 1})

インバウンドコールイベントをMixpanelに送信する

最後に、実際の通話自体を追跡する。発信者の電話番号を識別子として使用し、正しいユーザーに対してイベントを保存します。また、どのキャンペーンについて電話がかかってきたかを追跡し、各キャンペーンのパフォーマンスを確認するためにデータを簡単にセグメント化できるようにします。

# Track call data in Mixpanel
mix.track(
    uid,
    'Inbound Call',
    {
        'Campaign Name': campaign['name'],
        'Duration': int(data.get('duration')),
        'Start Time': data.get('start_time'),
        'End Time': data.get('end_time'),
        'Cost': float(data.get('price'))
    }
)

自分で試してみる

この記事のすべての この記事のコードはすべてGithubで公開されている。.Python、Flask、tinydbを使用している。そのため requirements.txtをインストールしてください。

例もあります。 campaigns.jsonこれはtinydbが使用するファイルです。正しい値で更新する必要があります。詳しくは tinydbドキュメントを参照してください。複数のキャンペーンを追加したい場合は、データベースに行を追加してください。

Nexmo application creation screen

また Nexmoバーチャルナンバーと設定されたVoiceアプリケーションが必要です。最近 ボイスアプリケーションダッシュボードを立ち上げました。 このダッシュボードの詳細と新しいVoiceアプリケーションの作成方法についてはをご覧ください。

すべてのセットアップが完了したら、以下のコマンドでFlaskアプリを実行できる:

export FLASK_APP=app.py
flask run

エラーに遭遇した場合は、Flaskのデバッグモードをオンにしてから再試行してください。それと、Mixpanel と Nexmo クライアントが必要とする環境変数の作成もお忘れなく!

export FLASK_DEBUG=1
export MIXPANEL_TOKEN="<YOUR MIXPANEL PROJECT TOKEN>"
export NEXMO_API_KEY="<YOUR NEXMO API KEY>"
export NEXMO_API_SECRET="<YOUR NEXMO API SECRET>"

次はどうする?

以下を追加してみてください。 通話完了時にSMS通知を追加するまたは、MixpanelのトラッキングをSegmentに置き換えてみてください。上記の例で使用されている Voice API と Number Insight API については、当社の開発者向けサイト 開発者サイト.また NCCO で利用可能なその他のアクション.

シェア:

https://a.storyblok.com/f/270183/150x150/a3d03a85fd/placeholder.svg
Aaron Bassettヴォネージの卒業生

アーロンはNexmoの開発者支持者だった。ベテランのソフトウェア・エンジニアであり、デジタル・アーティスト志望でもあるアーロンは、コードや電子機器、時にはその両方を使って何かを作っているところをよく見かける。彼が何か新しいことに取り組んでいるときは、空気中の部品が燃える匂いでわかるのが通例だ。