Zendeskの概要を理解して、うわさのAPIを試しに叩いてみた

こんにちは。DA事業本部の春田です。

先ほど、Zendeskというカスタマーサービスプラットフォームに触る機会があったので、トライアルの様子を見せながら概要をご紹介していきたいと思います。

また、Zendeskの強みである 全ての機能を動かすことができるAPI も試しに叩いてみました。これはすなわち、ZendeskのGUIに依存することなくその機能を使えてしまうということです。かなりシンプルにトークンを生成できたので、参入障壁はかなり低かったです。みなさんもぜひ試してみてください。

Zendesk | カスタマーサービスソフトウェア&サポートチケットシステム

※スクショは英語表記ですが、日本語にも対応しています。

トライアルアカウントの作成

ZendeskのHPから Free trial をクリックします。このトライアルでは Zendesk Suite の全機能を14日間お試しで使うことができます。

Emailとパスワードを入力します。

次に会社情報とユーザー属性を入力します。

最後にチームアカウントのグローバルIDを作成して完了です。

登録したメールアカウントに送られてくる認証確認を終えると、上で作成したURLにアクセスできるようになります。

ホーム画面

生成されたURLにアクセスすると、Zendesk Supportのトップページに繋がります。

左側のタブで、 SupportGuideChatTalk の4項目を確認できるかと思います。この4つのツールはZendeskの主要プロダクトであり、 Zendesk Suite としてパッケージ化されています。そのうち最も代表的なプロダクトがZendesk Supportです。

Zendesk Support では、メールやSNSといったマルチチャネルから来る問い合わせを「チケット」という単位で自動的に振り分けて集約・管理し、個人個人に合わせたコミュニケーションをシームレスに行うことができます。Zendesk Supportで様々なチャネルから来る様々の問い合わせを統合し、テンプレート化や自動化を進めることで、従来までは難しかったカスタマーサポートの効率化を進めることができます。個人的にいいなと思った機能は、 Pathfinder という個々のユーザー行動を細かくトラッキングして可視化できる機能です。これによって、突発的・断片的な問い合わせに対しても、その経緯や顧客の背景を把握することができ、顧客対応がより適切になることが期待できます。

画面下のOpen sample ticketをクリックするとサンプルのチケットが作成されます。画面上部には「incident」と「customer」のタブがある通り、チケットの内容を「問い合わせ情報」と「顧客情報」の2つの観点から把握・管理することができます。問い合わせに関連する情報がすべて集約され、多角的に状況が把握できると、対応もスムーズかつ適切に行うことができそうですね。

その他、 Zendesk Guide ではカスタマーサポート向けのナレッジ管理、 Zendesk Chat ではリアルタイムのチャット・メッセージ、 Zendesk Talk ではモダンなコールセンター機能が展開されており、これらもすべてシームレスに連携して使用することができます。

そして、Zendeskは Zendesk explore というBIツールも提供しており、上のツールで集約したデータをその場で可視化できます。このデータ自体が同じプラットフォーム上で管理されているため、データクレンジングなしにそのまま分析できる点が嬉しいですね。

Zendesk API を叩いてみよう

Zendeskが多くの企業に支持されている理由の一つに、 すべての動作をAPI経由で実行することができる ことが挙げられます。自社サービスをもっているIT企業では、自社製品とZendeskをAPIで連携させることで、ZendeskのGUIに依らずにその機能を活用することができます。

トライアルでもAPIを使用することができるので、試しに叩いてみましょう。画面左端の歯車のアイコンをクリックし、adminの画面のchannlesの欄から「API」を選択します。手軽なパスワードアクセスやトークンアクセス、よりセキュアなOAuthクライアントなど様々な認証方法が用意されていますが、今回はシンプルなトークンアクセスを用います。画面右のボタンをEnabledにし、その下の「+」をクリックするとAPIトークンを生成できます。

Token Access右の「?」をクリックすると curl のワンライナーが表示されます。 api/v2/users/me.json のエンドポイントを叩いてみます。

$ curl -u emailaddress@sample.jp/token:************************************** https://**********************.zendesk.com/api/v2/users/me.json | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   990    0   990    0     0   1987      0 --:--:-- --:--:-- --:--:--  1987
{
  "user": {
    "id": *************,
    "url": "https://**********************.zendesk.com/api/v2/users/**********.json",
    "name": "Takumi Haruta",
    "email": "emailaddress@sample.jp",
    "created_at": "2019-07-31T05:57:44Z",
    "updated_at": "2019-07-31T06:24:42Z",
    "time_zone": "Eastern Time (US & Canada)",
    "iana_time_zone": "America/New_York",
    "phone": null,
    "shared_phone_number": null,
    "photo": null,
    "locale_id": 1,
    "locale": "en-US",
    "organization_id": *************,
    "role": "admin",
    "verified": true,
    "authenticity_token": "***************************************",
    "external_id": null,
    "tags": [],
    "alias": null,
    "active": true,
    "shared": false,
    "shared_agent": false,
    "last_login_at": "2019-07-31T06:24:42Z",
    "two_factor_auth_enabled": null,
    "signature": null,
    "details": null,
    "notes": null,
    "role_type": null,
    "custom_role_id": null,
    "moderator": true,
    "ticket_restriction": null,
    "only_private_comments": false,
    "restricted_agent": false,
    "suspended": false,
    "chat_only": false,
    "default_group_id": *************,
    "report_csv": true,
    "user_fields": {}
  }
}

無事レスポンスを取得できました。今度は Zendesk API quick start にある /api/v2/tickets.json のエンドポイントに対して、curlでPOSTしてみます。

# data
{
  "ticket": {
    "subject": "Test ticket 1",
    "comment": {
      "body": "This is test ticket 1"
    }
  }
}
$ curl -X POST -H "Content-Type: application/json" -d "@test_ticket.json" -v -u emailaddress@sample.jp/token:************************************** https://**********************.zendesk.com/api/v2/tickets.json | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3042  100  2935  100   107   1399     51  0:00:02  0:00:02 --:--:--  1399
{
  "ticket": {
    "url": "https://*************.zendesk.com/api/v2/tickets/5.json",
    "id": 5,
    "external_id": null,
    "via": {
      "channel": "api",
      "source": {
        "from": {},
        "to": {},
        "rel": null
      }
    },
    "created_at": "2019-07-31T07:04:01Z",
    "updated_at": "2019-07-31T07:04:01Z",
    "type": null,
    "subject": "Test ticket 1",
    "raw_subject": "Test ticket 1",
    "description": "This is test ticket 1",
    "priority": null,
    "status": "open",
    "recipient": null,
    "requester_id": *************,
    "submitter_id": *************,
    "assignee_id": *************,
    "organization_id": *************,
    "group_id": *************,
    "collaborator_ids": [],
    "follower_ids": [],
    "email_cc_ids": [],
    "forum_topic_id": null,
    "problem_id": null,
    "has_incidents": false,
    "is_public": true,
    "due_at": null,
    "tags": [],
    "custom_fields": [],
    "satisfaction_rating": null,
    "sharing_agreement_ids": [],
    "fields": [],
    "followup_ids": [],
    "brand_id": *************,
    "allow_channelback": false,
    "allow_attachments": true
  },
  "audit": {
    "id": *************,
    "ticket_id": 5,
    "created_at": "2019-07-31T07:04:01Z",
    "author_id": *************,
    "metadata": {
      "system": {
        "client": "curl/7.54.0",
        "ip_address": "*************",
        "location": "Tokyo, 40, Japan",
        "latitude": *************,
        "longitude": *************
      },
      "custom": {}
    },
    "events": [
      {
        "id": *************,
        "type": "Comment",
        "author_id": *************,
        "body": "This is test ticket 1",
        "html_body": "<div class=\"zd-comment\" dir=\"auto\"><p dir=\"auto\">This is test ticket 1</p></div>",
        "plain_body": "This is test ticket 1",
        "public": true,
        "attachments": [],
        "audit_id": *************
      },
      {
        "id": *************,
        "type": "Create",
        "value": "Test ticket 1",
        "field_name": "subject"
      },
      {
        "id": *************,
        "type": "Create",
        "value": "386985761733",
        "field_name": "requester_id"
      },
      {
        "id": *************,
        "type": "Create",
        "value": "open",
        "field_name": "status"
      },
      {
        "id": *************,
        "type": "Create",
        "value": null,
        "field_name": "priority"
      },
      {
        "id": *************,
        "type": "Create",
        "value": null,
        "field_name": "type"
      },
      {
        "id": *************,
        "type": "Create",
        "value": "*************",
        "field_name": "assignee_id"
      },
      {
        "id": *************,
        "type": "Create",
        "value": "*************",
        "field_name": "group_id"
      },
      {
        "id": *************,
        "type": "Create",
        "value": "*************",
        "field_name": "organization_id"
      },
      {
        "id": *************,
        "type": "Notification",
        "via": {
          "channel": "rule",
          "source": {
            "from": {
              "deleted": false,
              "title": "Notify requester of received request",
              "id": *************
            },
            "rel": "trigger"
          }
        },
        "subject": "[Request received]",
        "body": "Your request ({{ticket.id}}) has been received and is being reviewed by our support staff.\n\nTo add additional comments, reply to this email.",
        "recipients": [
          *************
        ]
      },
      {
        "id": *************,
        "type": "Notification",
        "via": {
          "channel": "rule",
          "source": {
            "from": {
              "deleted": false,
              "title": "Notify all agents of received request",
              "id": *************
            },
            "rel": "trigger"
          }
        },
        "subject": "[{{ticket.account}}] {{ticket.title}}",
        "body": "A ticket (#{{ticket.id}}) by {{ticket.requester.name}} has been received. It is unassigned.\n\n{{ticket.comments_formatted}}",
        "recipients": [
          *************
        ]
      }
    ],
    "via": {
      "channel": "api",
      "source": {
        "from": {},
        "to": {},
        "rel": null
      }
    }
  }
}

こちらも無事POSTでき、チケットが作成されました。チケットが作成されると自動的にメールに通知が飛びます。(よくできてるなぁ・・・

他にもかなりの数のAPIが用意されており、様々な要件に合わせてカスタマイズできそうですね。

Introduction - Support API - Zendesk Developer Portal

おわりに

Zendeskは、「カスタマーサポート」という普段はなかなか意識しない領域を扱っているため、ユースケースを考えるのが難しくもあり、そこが面白い部分でもあるかと思います。

次回は、他のサービスとの連携パターンも考えていきたいですね。

Zendesk | カスタマーサービスソフトウェア&サポートチケットシステム