Node.jsでIntercomのカスタマーを作成・更新する

アプリやサービスからIntercomにデータを連携させる必要が出てきたので、色々試してみました。 ライブラリを追加する IntercomにはSDKがありますので、これをインストールしましょう。 Note: momentは […]

広告ここから
広告ここまで

目次

    アプリやサービスからIntercomにデータを連携させる必要が出てきたので、色々試してみました。

    ライブラリを追加する

    IntercomにはSDKがありますので、これをインストールしましょう。

    $ npm i -S intercom-client moment

    Note: momentはなくても大丈夫です

    signed_up_atの値を作るためにmomentを入れています。Cognito User PoolsのトリガーやStripeのWebhookなどで連携できる場合、momentはいらないかもしれません。

    Intercomのtokenを埋め込む

    .env.envrcにtokenを入れておきましょう。さすがにコードに入れてコミットするのは蛮勇かなと思います。AWSであれば、SSMのパラメーターストアやKMSでの暗号化なども良いでしょう。

    export INTERCOM_DEV_TOKEN="token"
    export INTERCOM_PROD_TOKEN="token"

    テストと本番でtokenが変わるので、Serverless Frameworkのステージなどを使って判定するとよいでしょう。

    const Intercom = require('intercom-client')
    
    // 環境変数を取得
    const { stage, INTERCOM_DEV_TOKEN, INTERCOM_PROD_TOKEN } = process.env
    
    // 使用するtokenを決定
    const token = stage === 'production' ? INTERCOM_PROD_TOKEN : INTERCOM_DEV_TOKEN
    
    // Clientを立ち上げ
    const client = new Intercom.Client({ token })

    カスタマーを作成する

    カスタマーの作成は、client.users.createを使用します。

    /* eslint-disable no-console */
    const Intercom = require('intercom-client')
    const moment = require('moment')
    const { stage, INTERCOM_DEV_TOKEN, INTERCOM_PROD_TOKEN } = process.env
    const token = stage === 'production' ? INTERCOM_PROD_TOKEN : INTERCOM_DEV_TOKEN
    const client = new Intercom.Client({ token })
    
    const run = async () => {
      try {
        const user = {
          email: '[email protected]',
          signed_up_at: moment().unix()
        }
        const result = await client.users.create(user)
        console.log(`Status: ${result.statusCode} - ${result.statusMessage}`)
        console.log('result: %j', result.body)
      } catch (e) {
        console.log(e)
      }
    }
    
    run()
    

    実行すると、こんな感じで結果が出ます。

    Status: 200 - OK
    result: {"type":"user","id":"5bc7f1b2aba7ac1206a80814","user_id":null,"anonymous":false,"email":"[email protected]","phone":null,"name":null,"pseudonym":null,"avatar":{"type":"avatar","image_url":null},"app_id":"bdguin94","companies":{"type":"company.list","companies":[]},"location_data":{},"last_request_at":null,"last_seen_ip":null,"created_at":1539830194,"remote_created_at":1539830285,"signed_up_at":1539830285,"updated_at":1539830284,"session_count":0,"social_profiles":{"type":"social_profile.list","social_profiles":[]},"unsubscribed_from_emails":false,"marked_email_as_spam":false,"has_hard_bounced":false,"user_agent_data":null,"tags":{"type":"tag.list","tags":[]},"segments":{"type":"segment.list","segments":[]},"custom_attributes":{},"referrer":null,"utm_campaign":null,"utm_content":null,"utm_medium":null,"utm_source":null,"utm_term":null,"do_not_track":null}

    注意点

    Intercomの管理画面からみるとわかるのですが、ブラウザから取れる情報がことごとくない状態です。

    基本的にはブラウザ側のSDKからユーザーを作成し、サーバー側のSDKでは更新や削除などの操作に留める方針にした方が良さそうです。

    更新

    更新はclient.users@updateで実行できます。

    /* eslint-disable no-console */
    const Intercom = require('intercom-client')
    const { stage, INTERCOM_DEV_TOKEN, INTERCOM_PROD_TOKEN } = process.env
    const token = stage === 'production' ? INTERCOM_PROD_TOKEN : INTERCOM_DEV_TOKEN
    const client = new Intercom.Client({ token })
    
    const run = async () => {
      try {
        const user = {
          email: '[email protected]',
          name: 'John doe',
          phone: '+81901234567'
        }
        const result = await client.users.update(user)
        console.log(`Status: ${result.statusCode} - ${result.statusMessage}`)
        console.log('result: %j', result.body)
      } catch (e) {
        console.log(e)
      }
    }
    
    run()
    

    emailuser_id・またはanonymous_idのいずれかが必須ですので、Firebase / Cognito User Poolsなどと連携する場合はEmailを、Stripeなどではemailをattributesとして持たせるか、create時の戻り値からuser_idを割り振るとよいでしょう。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark