カスタマーサクセス必需品のintercomのLeadをUserに自前で切り替えた話

こんにちわ。@amemoleeです。[カスタマーサクセス Advent Calendar 2018](https://adventar.org/calendars/3097)の12日目のエントリーとなります。今回は、担当しているサービスでのカスタマーサクセスのために活用しているintercomについて、intercomの中の人にサポートしていただきながら、試行錯誤した話をご紹介します。

# カスタマーサクセスについて
さっそくですが、現在、私は[@enegaeru](https://www.enegaeru.com/)(エネがえる)というサービスをDevOpsしています。月額課金のサブスクリプションモデルを適用しており、お客さまのチャーン(解約)を最小に抑えるべくサービス運営をしています([カスタマーサクセス――サブスクリプション時代に求められる「顧客の成功」10の原則](https://www.amazon.co.jp/dp/B07D7V5R8H/))。またお客さまの満足度を最良にする活動に注力すべくNoOpsへの取り組みも積極的に行っております([「DevOpsとそのちょっと外側とNoOps（仮）」というタイトルでLTしてきた話](https://qiita.com/amemolee/items/9acd482fe2d3070f95c2))。当然、積極的にカスタマーサクセスを導入しようとしていますが、カスタマーサクセスをゼロからつくるのではなくて、既存の組織を「改良する」（たとえば、営業担当者がお客さまからの直接のご要望を承ったり、技術担当者がユーザからの問い合わせを先手先手でサポートする）という方法で進めています。いくつかの記事([カスタマーサクセスチーム立ち上げ期によくある3つの失敗談](https://www.customer-success-cafe.com/2017/06/3-common-team-building-mistakes.html))を拝見すると、抜本的な組織改革が必要とは思いますが、とはいえ、サービスの運営は待ったなしです。そのような状況で、できるだけ、お客さまの成功体験を最良にするための手段として「チャットによる支援」を推し進めています。そこで大活躍しているのがintercom　というサービスです。しかもユニコーンなのでサービスの機能拡充にも期待が大きいです([Meet the unicorn class of 2018](https://pitchbook.com/news/articles/unicorn-class-of-2018))。

# intercomの紹介
このintercomでは、Inboxという機能にて訪問者とサービス運営者が、いつどこにいても、どんな問い合わせでも、継続しながらやり取りできて、そのやり取りは、Articlesという機能にて蓄積できて、情報は整理することでFAQ化してさらに訪問者の役立つ情報として蓄積でき、FAQの適切なページに誘導もできます。またMessagesという機能にてユーザへの一斉アナウンスもできたりするとても便利なサービスです。※詳細は割愛。

# intercomで扱う訪問者の種類
ただし、訪問者へのプロアクティブな活動を行う上で取扱を注意しなければならなかったのが訪問者の種類でした。intercomには、Visitor, Lead, Userという3つの訪問者の種類があり、この訪問者の種類によってできることできないことがありました。

* Visitor：intercomが認識しただけの訪問者。Leadとは区別しています。
* Lead：Visitorがintercomで何らかのMessanger利用した(会話を開始した、オートメッセージを開封した)訪問者。Visitorとは区別しています。
* User：intercomにemailをつかって登録された訪問者。emailには訪問者のメールアドレスを設定します。

詳しい話は、こちらをご覧ください。
（参考）[How do visitors, leads and users work in Intercom?](https://www.intercom.com/help/faqs-and-troubleshooting/your-users-and-leads-data-in-intercom/how-do-visitors-leads-and-users-work-in-intercom)

# intercomの訪問者に対して行えることと行えないこと
* Userに対しては、Messagesを使ったメッセージの一斉送信やピンポイント送信ができます。また、Userになった場合は、いつどこでも同じIn-appと呼ばれる訪問者の画面右下に表示されるメッセンジャーで過去の会話や今進行中の会話を確認することができます(これがやりたい)。
* Leadに対しては、Messagesを使ったメッセージの一斉送信やピンポイント送信ができません。不特定多数向けの配信のみができます。

# 弊サービスのアカウント情報とintercomでの扱い
* 弊サービスを使ったことがない方：弊サービスのアカウントがない訪問者。まだ弊サービスに弊サービスのアカウントのIDを使ってログインしていない訪問者。この場合Leadとなり不特定な方とのやり取りとして対応を行います。
* 弊社サービスを使ったことがある方(つまり弊サービスのアカウントを持っている訪問者)で、さらに、メールアドレスでアカウントのIDを作った方：この方は簡単なHTMLへのタグ設定にてUserにできます。
* 弊社サービスを使ったことがある方(つまり弊サービスのアカウントを持っている訪問者)で、さらに、メールアドレス以外でアカウントのIDを作った方：この方はあとからメールアドレスを教えてもらってユーザにしたい(これがやりたい)。

メールアドレスがゲットできない場合は、こちらをご覧ください。
（参考）[Install Intercom on your website (for logged-out visitors)](https://www.intercom.com/help/install-on-your-product-or-site/quick-install/install-intercom-on-your-website-for-logged-out-visitors)
メールアドレスがある場合は、こちらをご覧ください。
（参考）[Install Intercom on your web app (for logged-in users)](https://www.intercom.com/help/install-on-your-product-or-site/quick-install/install-intercom-on-your-web-app-for-logged-in-users)

# intercomで簡単にできたこと
メールアドレスがある人をそのままintercomのUserにすることは、HTMLへの簡単なタグ設定で可能でした。※上章を参照。

# intercomで簡単にできなかったこと
「メールアドレスがない人からメールアドレスをもらってintercomのUserにする方法」が、intercomの管理画面にはなさそうです。中の人からお聞きした回答内容を抜粋します。切り替え画面を自作するか、APIを手動で叩く方法しかないとのことです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/45746/9582aa5c-acba-9144-f954-c2fa575b73b1.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/45746/90f5330b-ed25-706a-52fc-74d09c663d98.png)

リンクが付いていましたので、本文を書き出させていただきます。

>If you want a visitor or lead to convert to a user, they must either sign up to your website (create a login) or you can manually create them by :
>
>+ Using our [CSV Import](https://docs.intercom.io/configure-intercom-for-your-product-or-site/customize-intercom-to-be-about-your-users/import-your-user-data-into-intercom) where you'd have a CSV with the user's name, email address and other details you'd like to see in Intercom 
>
>+ Or via the [Intercom REST API](https://developers.intercom.com/intercom-api-reference/reference) if you'd like to create users programmatically.
Hope this helps!

APIリファレンスは充実していますので、こちらをご覧ください。
（参考）[API & Webhooks Reference](https://developers.intercom.com/intercom-api-reference/reference)

# ということで運用でカバーしたいと思います
弊サービス運営の中で、手動運用する方法(「メールアドレスがない人からメールアドレスをもらってintercomのUserにする方法」)を、以下のような手順を考えてみました。

# LeadをUserにする
* ①メールドレスがアカウントのIDの場合、弊サービスへログインするとそのままUserとして会話を続けられます
* ②メールアドレスがアカウントのIDでない場合、弊サービスへログイン後に、LeadとしてIn-app(メッセンジャー)で新しい会話が開始します
* ③Lead状態の訪問者については、連絡先を問い合わせます(勝手に問い合わせてくれます)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/45746/fc01ea80-1143-b3d9-f7db-c17b133cbc7a.png)

* ④ここでメールアドレスが取得できたら⑤に続きます
* ⑤APIを叩いてLeadからUserに訪問者の種類が切り替わります

# APIを叩く手順
自作のintercomの訪問者種類の切り替え画面（仮）があり、画面からAPIをキックするイメージでAPIを叩いていきます。必要な値はemailとuser_idです。ここでは mから始まるメールアドレス("mXXXXXXXX@XXXX.XX")と8から始まるuser_id("8xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")を利用します。ちなみに、nameには弊サービスのアカウントのIDを設定しますが、今回はメールアドレスではなく"mXXXXXXXX"がnameとなります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/45746/63a79a90-1522-ca69-ab3f-905e6b7ac0e4.png)

* まず対象となる訪問者の情報を取得します。/contactsというリソースを呼び出します。user_idをキーにします。

```bash
$ curl -X GET https://api.intercom.io/contacts?user_id=8xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -H 'accept: application/json' -H 'authorization: Bearer {your_token}' | jq '. | {id, user_id, name, email, type}'

{
  "id": "{your_id}",
  "user_id": "8xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "name": "mXXXXXXXX",
  "email": "mXXXXXXXX@XXXX.XX",
  "type": "contact"
}
```

* 続いて、さっそくLeadをUserにする方法が以下になります。以下のようなリソース呼び出しを行います。user_idをキーにemailを差し込むイメージになるでしょうか。

```bash
$ curl \
https://api.intercom.io/contacts/convert \
-X POST \
-H 'Authorization:Bearer {your_token}' \
-H 'Accept:application/json' \
-H 'Content-Type: application/json' -d '
{
  "contact": {
    "user_id": "8xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  },
  "user": {
    "email": "mXXXXXXXX@XXXX.XX"
  }
}' | jq '. | {id, user_id, name, email, type}'

{
  "id": "{your_id}",
  "user_id": null,
  "name": "mXXXXXXXX",
  "email": "mXXXXXXXX@XXXX.XX",
  "type": "user"
}
```

* Userになっているかどうかを確認します。まずはLeadかどうかを確認し、その後Userかどうかを確認します。以下のようにリソース/contactsでは情報が取得できなくなっており、リソース/usersではemailをキーにして情報が取得できるようになりました。

```bash
$ curl -X GET https://api.intercom.io/contacts?user_id=8xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -H 'accept: application/json' -H 'authorization: Bearer {your_token}' | jq '. | {id, user_id, name, email, type}'

{
  "id": null,
  "user_id": null,
  "name": null,
  "email": null,
  "type": "error.list"
}
```

```bash

$ curl -X GET https://api.intercom.io/users?email=mXXXXXXXX@XXXX.XX -H 'accept: application/json' -H 'authorization: Bearer {your_token}' | jq '. | {id, user_id, name, email, type}'

{
  "id": "{your_id}",
  "user_id": null,
  "name": "mXXXXXXXX",
  "email": "mXXXXXXXX@XXXX.XX",
  "type": "user"
}
```

以下の図のように、Usersに移動していることが確認できれば無事LeadからUserへの切り替えはパーフェクトです。これでこの訪問者についてはいつでも過去の会話や進行中の会話が見えるようになります。また弊サービスの中からプロアクティブなアクションができるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/45746/49c7c20c-b01e-ff5f-3509-5cbca164b18b.png)

# と思ったら宿題
* "mXXXXXXXX"さんが、もう一度弊サービスにログインすると、再びLead(user_idが別で発行される)となってしまいました。つまり、弊サービスではアカウントのIDが同じ場合は同一人物なのですが、intercomでは毎回、違う訪問者(Lead)として扱われてしまうようです。もう一度LeadからUserにすると同一Userとして認識はされるようですが、毎回切り替えが必要ないたちごっこのような作業が必要そうです。
* 　さらに、intercomのMessangerがブラウザ単位でLeadやUserを保持するようで、"mXXXXXXXX"さんが新たに弊サービスを利用すると、上述のとおり別Leadになるにもかかわらず、画面に表示されるIn-app(メッセンジャー)には、前にUserにした"mXXXXXXXX"さん(mXXXXXXXX@XXXX.XXでUser登録済)の会話がみえてしまいます。
* APIを叩くという行為は、非技術者にお願いしづらいので、LeadからUserへの自作のintercomの訪問者種類の切り替え画面（仮）は必需品となりそうです。それ以前にそもそも弊サービスのアカウントのIDはメールアドレスでよくない？という議論も残ってしまいました。

# おわりに
なんとかこの記事を書き終えるまでに、intercomの中の人(各国の中の人に引き継ぎながら24時間対応してくださったのには感激しました)に聞いていた内容もフィードバックができて間に合ってよかったです。次回は「私達の考える理想のカスタマーサクセス組織」について述べたいと思います（頭出しだけしておくと「カスタマーサクセスマネージャー求む」です）。

以上