🐧

Zendesk CSAT(カスタマー満足度)の情報をZenpyで取得する

2022/01/05に公開

はじめに

こんにちは、クラスメソッド AWS事業本部の筧です。

クラスメソッドのメンバーズサービスでは、問い合わせ管理ツールとして Zendesk を利用しています。そして内部的に Zendesk の CSAT (以降、カスタマー満足度)をサービス改善の指標として活用しています。

Zendesk のデータ分析機能の Zendesk Explore を用いることでカスタマー満足度を集計して見える化が可能なのですが、全社メンバーに共有するにはライセンスが大量に必要などの課題がありました。

そこで、Zenpy を利用してカスタマー満足度を週次集計して Slack に通知することで、本課題を解消しました。今回はカスタマー満足度を Zenpy で取得する箇所をご紹介します。

https://support.zendesk.com/hc/ja/articles/4408886173338
https://github.com/facetoe/zenpy

やってみた

Zendesk からカスター満足度を取得するインスタンスメソッドがfetch_satisfaction_ratings()です。引数は以下のように設定します。

  • score
    • 選択可能な値:offered, unoffered, received, received_with_comment, received_without_comment,good, good_with_comment, good_without_comment, bad, bad_with_comment, bad_without_comment
    • 満足評価のgoodは、満足評価(コメント有)のgood_with_commentと満足評価(コメント無し)のgood_without_commentを内包しているようでした。不満足評価についても同様。
  • start_unixtime
    • 集計期間の開始UNIX時間
  • end_unixtime
    • 集計期間の終了UNIX時間
src/services/zendesk.py
import logging

from typing import List, Dict, Optional
from datetime import datetime, timedelta
from zenpy import Zenpy

logger = logging.getLogger()
logger.setLevel(logging.INFO)

class ZendeskService:
    def __init__(self, zenpy_client) -> None:
        self.zenpy_client = zenpy_client

    def fetch_satisfaction_ratings(
        self,
        score: str,
        start_unixtime: Optional[float],
        end_unixtime: Optional[float],
    ) -> List:
        """
        refs:https://developer.zendesk.com/api-reference/ticketing/ticket-management/satisfaction_ratings/#filters
	start_unixtimeがブランクの場合は1日前のunixtimeを設定します
        """
        try:
            if start_unixtime is None:
                start_unixtime = (
                    datetime.now() - timedelta(days=+1)
                ).timestamp()

            resp = self.zenpy_client.satisfaction_ratings(
                sort_order="desc",
                score=score,
                start_time=start_unixtime,
                end_time=end_unixtime,
            )

            satisfaction_ratings = []
            for i in resp:
                satisfaction_rating = {
                    "ticket_id": i.ticket_id,
                    "ticket_comment": i.comment,
                    "requester_id": i.requester_id,
                }
                satisfaction_ratings.append(satisfaction_rating)
            return satisfaction_ratings
        except Exception as ex:
            logger.error(ex)
            return []

あとは、Zenpyクライアントからfetch_satisfaction_ratings()を呼び出していただければと思います。

from src.services.zendesk import ZendeskService
from zenpy import Zenpy

def exec():
    """
    - Zenpyクライアントの作成
    - Zenpyクライアントのクレデンシャル情報はベタ書きするのではなく、AWS Secrets Managerなどから取得してください。
    """
    creds = {
       "token": str({Zendesk APIのトークン}),
       "email": str({Zendesk APIのメールアドレス}),
       "subdomain": str({Zendeskのサブドメイン}),
    }
    zenpy_client = Zenpy(**creds)
    zendesk_service = ZendeskService(zenpy_client)

    """
    - 満足評価を取得
    - unix_utc_start_time と unix_utc_end_time を算出する処理は省略
    """
    score = "good"
    resp = zendesk_service.fetch_satisfaction_ratings(
        score,
        unix_utc_start_time,
        unix_utc_end_time,
    )
    return resp

unix_utc_start_time と unix_utc_end_time については以下のブログで紹介しています。
https://zenn.dev/t_kakei/articles/6c554f022192ee

あとがき

Zendesk API 制限に気をつけながらご利用ください!
システムの全体像は DevelopersIO の私のブログに後日公開予定です。

https://developer.zendesk.com/api-reference/ticketing/account-configuration/usage_limits/

https://dev.classmethod.jp/author/kakei-takaaki/

それではまた!

Discussion