Twilio Segmentで様々なデータを集める

これは[Twilio Advent Calendar 2021](https://qiita.com/advent-calendar/2021/twilio)の2日目の記事です。昨年[Twilioが買収したSegment](https://japan.zdnet.com/article/35160829/)を実際に触ってみたので、その紹介をします。

![スクリーンショット 2021-11-16 22.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/98ab52d0-2c9e-eb56-74b1-b1f4ecd0658f.png)


# Twilio Segmentとは？

Twilio Segmentは、顧客のあらゆるデータを統合して管理できるCDP(Customer Data Platforms)です。なにができるのか、以下の絵がわかりやすいです。Segmentを使っていない場合、あらゆるサービスやデータが分散してサイロ化しがちです。

![スクリーンショット 2021-11-27 11.27.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/7df941f5-1fa2-d463-eaa5-ae50d622707b.png)

Segmentを使うとデータの通る道を整備して適切な場所に振り分けることができます。これによってデータ分析やパーソナライズが容易になってマーケティングなどに活用しやすくなります。

![スクリーンショット 2021-11-27 11.27.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/47f577b3-c80e-1f11-6ab2-6d7f2f1ec38c.png)

百聞は一見に如かずなので、実際に触ってみてみました。

# 事前準備
以下のものを用意しました。

- Twilioのアカウント
- [SendGrid](https://sendgrid.kke.co.jp/)のFreeプランのアカウント
- [Elephant SQL](https://www.elephantsql.com/)のFreeプランのアカウント

# Segmentのアカウント作成
まずはSegmentアカウントを作成します。
https://app.segment.com/signup/

名前とメールアドレス、パスワードを入力するだけです。
![2021-11-28_09h50_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/6894b5cf-b240-7eee-ae9f-0d895073b3df.png)

登録したメールアドレスにメールが届くのでリンクをクリックします。NicknameとSlug、Billing Emailが必須なので入力します。
![2021-11-28_09h52_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/bc47b86d-2373-b5fe-e667-51ece71ff01b.png)

ダッシュボードが表示されました。ここからデータを集めるもとになる__Source__とデータを格納する__Destination__を設定していきます。まずは「Add Source」ボタンを押しました。
![2021-11-28_09h53_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/f5ba807e-eae9-cd31-f001-bc634f34c8ec.png)

# Source作成（Twilio）

Sourceに表示されるカテゴリと選択肢は思っていたより多かったので[末尾](#おまけsourceリスト)にまとめました。

Twilioを選択します。
![2021-11-28_21h14_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/a97da205-b6e5-7346-13e2-4abdd92fc172.png)

Source NameとTwilio Account SIDを入力して「Log in to Twilio」ボタンを押します。
![2021-11-28_21h15_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/0bfa9b7a-d9cf-c577-bac3-bc57fc6cfe4b.png)

Twilio Account SIDはTwilioのダッシュボードで確認できます。
![2021-11-28_21h16_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/513fdcae-763a-ac86-77f6-1a8da5c76e49.png)

そのまま「Next」を押します。
![2021-11-28_21h19_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/f6a58722-dcca-85d6-9fe2-8a9a097b0c41.png)

SQL Schema名を入力します。これは後で設定するDestinationのテーブル名として利用されます。
![2021-11-28_21h20_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/0b92f731-334c-52e9-2de8-26e1420391b6.png)

続いてDestinationになるWarehouseの設定を促されるので「Add a Warehouse」を押して設定を続けます。
![2021-11-28_21h20_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/0fc7c9f6-1171-4783-ab4d-dd9645bb4914.png)

# Destination

WarehouseはPostgres SQLに決めて[Elephant SQL](https://www.elephantsql.com/)を使いました。
![2021-12-01_10h49_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/f3ef2ef8-f3d9-aa3c-d996-4ce372c01860.png)

DestinationでPostgresを選択します。
![2021-11-28_21h21_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/bcd40adc-788d-84b3-c573-bf547961de9f.png)

そのまま「Next」を押します。
![2021-11-28_21h21_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/a832e838-fefa-4761-042e-cefb51931c80.png)

Postgresのデータベースへの接続情報を入力します。
![2021-11-28_21h24_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/e88a9875-a937-ff66-b1a4-204ed9d721da.png)

Elephant SQLの場合はそれぞれの項目を以下で確認できるので該当するものを入力します。
![2021elephant.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/546fc316-4136-8982-823d-ff850f17cf41.png)

Destinationが作成されました。
![2021-11-28_21h26_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/634957a3-1711-99aa-4dee-9b32c61904c6.png)

SourceとDestinationが無事につながって紙吹雪が舞います。
![2021-11-28_21h26_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/939d94cc-3938-09b3-1978-a18190307f25.png)

# データを確認してみる

しばらく待つとデータが自動的にSyncされます（テーブルやスキーマの作成も自動で行われるので不要です）。Twilioをリンクしたあとはaddress,calls,messagesの3つのテーブルが作成されました。ユーザ情報と電話履歴、SMS履歴です。
![2021-12-01_12h57_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/e307060e-24af-b933-8b50-b1e7f55af87f.png)

Twilioを使った電話の履歴が格納されています。
![2021-12-01_12h57_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/4270537e-a792-de3d-46e5-fba409f71b05.png)

SMSも同じです。
![2021-12-01_13h00_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/3f1d3fcc-593f-b4d3-a09a-a990c7493c29.png)

# Source作成（SendGrid）

Twilioに続いてSendGridも試してみました。Source Nameを入れて、[APIキー](https://sendgrid.kke.co.jp/docs/Tutorials/A_Transaction_Mail/manage_api_key.html)を設定するだけです。
![2021-11-30_17h45_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/56c10b51-af32-359e-e424-2380fef6d5af.png)

Webhook URLが発行されるので、これをSendGridのEvent Webhookに設定します。
![2021-11-30_17h46_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/2c35cd6c-c463-b0e5-dade-9df7b469bd65.png)

![2021-11-30_17h50_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/b09faad7-01b3-61db-c4b6-c67290120167.png)

設定は以上です。
![2021-11-30_17h50_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/d6357ded-3c68-4854-e597-6abdb8bc1af2.png)

Twilioのときと同様、しばらくすると自動的にSyncされてDestinationのPostgreSQLにテーブルが作成されます。[Event Webhook](https://sendgrid.kke.co.jp/docs/API_Reference/Webhooks/event.html)の送信イベントが書き込まれます。

![2021-12-02_00h12_24 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/3754def1-9921-c3af-4362-89b31bf1dbd1.png)

# Node.jsのSourceを作る

SourceはTwilioやSendGrid、Salesforceなどの既存サービスのほか、様々なアプリケーションを設定できます。Segmentにどういう形式のデータを投入するかは実装次第です。各言語ごとにライブラリが用意されています。今回はNode.jsで簡単なプログラムを作ってSourceに設定してみました。

https://segment.com/docs/connections/sources/catalog/libraries/server/node/quickstart/

```javascript
var Analytics = require('analytics-node');
var analytics = new Analytics('Write Keyをここに貼り付ける');

analytics.identify({
  userId:'f4ca124298',
  traits: {
    name: 'Yoichi KIkuta',
    email: 'kikuta@example.com'
  }
});

analytics.track({
  userId:'f4ca124298',
  event: 'Signed Up',
  properties: {
    plan: 'free'
  }
});

analytics.track({
  userId:'f4ca124298',
  event: 'Bookmarked Article',
  properties: {
    title: '大園桃子さんのアパレルブランドオープン！',
    url: 'https://www.bubkaweb.com/2021/10/8971/'
  }
});
```

実行するとSegmentのダッシュボードでもデータが確認できます。こちらもしばらくするとDestinationにSyncされます。
![2021-12-01_14h42_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/1e7e565c-b555-10aa-d30f-53a7dd92a91a.png)


# まとめ

CDPと呼ばれるものを触ったのは初めてで、設定が難しいのかな？と思っていたのですが、画面でポチポチ進められて思ってたより簡単でした。とりあえず簡単にデータを集約できることはわかりましたが、溜まったデータをどう活用していくのか？といった部分はまだイマイチ想像ついていません。Segmentを使ってこんな風にマーケティングに活用してます、みたいな具体例があったら知りたいなーと思いました。

# おまけSourceリスト

- Popular
    - JavaScript
    - Node.js
    - Twilio
    - Android
    - iOS
    - SendGrid
- Website
    - JavaScript
    - Shopify
- Mobile
    - Android
    - iOS
    - Kotlin(Android)
    - React Native
    - AMP
    - Swift(iOS)
    - Factual Engine
    - Xamarin
- Server
    - Node.js
    - Pixel Tracking API
    - .NET
    - Clojure
    - PHP
    - AMP
    - Java
    - Python
    - Ruby
    - HTTP API
    - Go
    - Kotlin
- Cloud
    - Twilio
    - SendGrid
    - Leanplum
    - LaunchDarkly
    - ProveSource
    - Google Ads
    - Facebook Ads
    - Youbora
    - Beamer
    - Looker
    - Pendo
    - Candu
    - Amplitude Cohorts
    - Moesif API Analytics
    - Salesforce
    - HubSpot
    - Aircall
    - Amazon S3
    - Refiner
    - Nudgespot
    - Airship
    - Klenty
    - Klaviyo
    - Vero
    - Braze
    - Blueshift
    - Facebook Lead Ads
    - AutopilotHQ
    - Marketo
    - ActiveCampaign
    - Mailchimp
    - Mandrill
    - Intercom
    - Mailjet
    - Iterable
    - Drip
    - Salesforce Marketing Cloud
    - Customer.io
    - Seligent Marketing Cloud
    - Foursquare Pilgrim
    - Radar
    - Factual Engine
    - Herow
    - Zendesk
    - Project
    - Chatlio
    - Regal Voice
    - Roku (alpha)
    - Stripe
    - Friendbuy
    - Delighted
    - InMoment (formely Wootric)