KPI の異常を検知して Slack で関係者へ通知する – BigQuery で集計・Google Sheets へ書き出し・Slack ワークフローで通知

これは、Pepabo CS Advent Calendar 2021 の 11 日目の記事です。
昨日は、 @zonorin の 「2021年コロナ禍のモチベーション」 でした。

  1. はじめに
  2. QC チームでの課題・やりたいこと
  3. KPI が目標値未満になったときだけ関係者が気づけるようにする
  4. BigQuery で集計・Google Sheets へ書き出し・Slack ワークフローで通知
    1. BigQuery 上の Zendesk の情報が格納されたテーブルを参照し、サービスごとの問い合わせ満足度が目標値未満か否かを判別するクエリを用意
    2. Google Sheets の Data Connector 機能を使って、1.の集計結果を Google Sheets に書き出し、サービスごとに異なるシートに Extract
    3. サービスごとに Slack ワークフローを作成、目標値未満の場合のみ関係者へメンションし、必要な情報をメッセージで共有
  5. まとめ

はじめに

この記事では、GMOペパボ株式会社カスタマーサービス部門の QC(Quality Control)チームの全体責任者をしているべるちゃん・のせさんのエントリーで紹介された、「KPI の異常を検知して Slack で関係者へ通知する方法」について書いています。

※この記事では、カスタマーサービス部門の「QC チーム」とわたしが所属する「Customer Ops チーム」のそれぞれの役目や関わり方などについては言及しませんが、お二人のエントリーを見ていただくとわかると思います。

QC チームでの課題・やりたいこと

ペパボは 10 以上のサービスを運営しているため、カスタマーサービス部門でもそのサービス分の KPI を管理し異常に気付ける仕組みづくりが必要です。
QC チームでは、顧客満足度や応答時間などの KPI を常にチェックしていますが、サービスが複数存在するため、KPI の数 * サービスの数 = 把握が必要な値の数となってしまって、現状把握だけでかなりの時間を要してしまいます。
さらにその KPI の状況が悪ければ、改善のためのアクションを考え、アクションの期限を決め、期限までに実行されたか、アクション後に KPI が改善されたか、…などなどやること盛り沢山。

KPI を追うだけで1日が終わってしまう(話を盛っているような盛っていないような)!!

本来なら、品質・体験向上のための活動に時間を使いたい。
数字を見て、良いか悪いか判別するのは機械に任せて、悪いときに必ず気づけたらいい。

異常感知した機械がサイレンを鳴らして警告をしているイラスト(いらすとや)

KPI が目標値未満になったときだけ関係者が気づけるようにする

QC チームの課題を踏まえた上で、KPI が目標値未満になったら検知する仕組みを Customer Ops チームで作ることになりました。

ペパボのカスタマーサービス部門では、Zendesk の製品を利用してサポート業務を行っています。また、問い合わせ情報を用いた業務改善・分析を効率良く行うために、Zendesk にある問い合わせ情報の一部は BigQuery へ同期しています。
QC チームが KPI に置いている顧客満足度や応答時間は Zendesk の情報から算出できるため、KPI の現状把握の際は BigQuery でクエリを実行して集計すれば良い状態でした。
そのため、KPI の目標値未満の検知は「BigQuery の集計結果を何かを介して Slack に通知できればいいのでは?もう誰かやってそう!」と思ってググってみて、ZOZOテクノロジーさんのテックブログで以下のエントリーを発見し、「これだ!!!!!」とやってみることにしました。

BigQueryでの集計結果をノーコードでSlackに定期投稿してみた – ZOZO TECH BLOG

仕組みはほぼこちらのテックブログにあることと同じなので詳細は割愛しつつ、実装しながら工夫した点を書いていきます。

BigQuery で集計・Google Sheets へ書き出し・Slack ワークフローで通知

今回の事例で行った作業は、以下のとおりです。

  1. BigQuery 上の Zendesk の情報が格納されたテーブルを参照し、サービスごとの問い合わせ満足度が目標値未満か否かを判別するクエリを用意
  2. Google Sheets の Data Connector 機能を使って、1.の集計結果を Google Sheets に書き出し、サービスごとに異なるシートに Extract
  3. サービスごとに Slack ワークフローを作成、目標値未満の場合のみ関係者へメンションし、必要な情報をメッセージで共有

1. BigQuery 上の Zendesk の情報が格納されたテーブルを参照し、サービスごとの問い合わせ満足度が目標値未満か否かを判別するクエリを用意

ここで用意するクエリは、最終的に Slack で通知させたい情報が含まれるようにします。
今回の事例で言うと「〇〇(サービス名)」の「Zendesk で受け取った問い合わせの満足度」が「目標値未満か否か」「目標達成率」が何かが分かれば良いので、それらを抽出するクエリを用意しました。(集計期間は、KPI の確認頻度によって適当に。)

  • サービス名
    • Zendesk のブランドが何か
  • Zendesk で受け取った問い合わせの満足度
    • 満足評価がついたチケット数/満足または不満評価がついたチケット数
  • 目標値未満か
    • 例 : 満足度 90 % が目標値の場合
      • 問い合わせの満足度が 90 %未満は TRUE 、90 %以上は FALSE とする
      • IF([満足度] < 0.90 , TRUE, FALSE)
    • 目標値未満(= TRUE)なら Slack 通知させ、目標値以上なら通知しないように 3. の手順で設定します
  • 目標達成率
    • 問い合わせ満足度/目標値
    • 今回の場合は、目標値がサービスごとに異なったため、計算に利用する目標値をサービス名によって CASE 文で分岐させた

これらの情報を抽出できるクエリができたら、次は Google Sheets へ書き出します。

2. Google Sheets の Data Connector 機能を使って、1.の集計結果を Google Sheets に書き出し、サービスごとに異なるシートに Extract

Google Sheets の Data Connector 機能を使って、Google Sheets と BigQuery を接続し、1. の手順で用意したクエリをカスタムクエリとして登録、定期的にクエリを実行(Refresh)させます。
Data Connector で自動的に新しいシートが作成され、そこにカスタムクエリで抽出されたデータが書き出されるので、そこから Extract ボタンを押し、サービスごとに異なるシートを作成し、フィルターを使って 1 サービスあたり 1 シートとなるように設定して書き出します。

前述したZOZOテクノロジーさんのエントリーに詳しく手順が載っていたので、この記事では省略します🙏

なお、ZOZOテクノロジーさんのエントリーが出た当時は、Refresh Options で設定できる時刻の幅が 4 時間(つらい)あったようですが、現在は、1 時間の幅で設定が可能になっています。

Data Connector の Refresh Options – Google Sheets

最終的に、サービスごとに以下のような形で「サービス名」「満足度」「目標達成率」「目標値未満か否か(通知するか否か)」が表示される状態になりました。

目標値以上の満足度だった場合、通知はされないので FALSE

service_namesatisfaction_ratingachievement_ratenotification
service A91.04101.15FALSE
FALSE の例(数値はダミーです)

目標値未満の満足度だった場合は、通知されるので TRUE

service_namesatisfaction_ratingachievement_ratenotification
service B86.9696.62TRUE
TRUE の例(数値はダミーです)

3. サービスごとに Slack ワークフローを作成、目標値未満の場合のみ関係者へメンションし、必要な情報をメッセージで共有

2. の手順で notification の行が TRUE だった場合のみ Slack で特定のチャンネルにメッセージを送るように Slack ワークフローを作成します。

ワークフローの起動方法(「Choose a way to start this workflow」での選択肢)は、スケジュールした時間に起動するようにします。今回の場合ですと、週に 1 度、前週の満足度が目標値未満だったサービスのみ満足度の詳細が通知されるようにしたいので、「Scheduled date & time」を選択した上で、最初の通知日と時間、通知させる曜日を選択します。

Slack ワークフロー作成時にワークフローの起動方法を選択する
スケジュールの設定

スケジュール以外のステップは、以下のように設定しました。
特定のシートの列を読み取り、読み取った列をもとに特定の Slack のチャンネルへメッセージを送信します。

通知用の Slack ワークフローの設定①

2 つ目のステップでは、2. の手順で作成したシートを選び、通知をするか否かの情報が入ったカラム(notification)が TRUE の場合のみ、その行が読み込まれるようにします。

通知用の Slack ワークフローの設定②

notification が TRUE の場合は、TRUE の値が入った行の情報が読み込まれて、3 つ目のステップで特定のチャンネルにメッセージが送信されます。例えば minne の満足度が目標値未満だった場合は、以下のような形で通知されます。

minne がもし目標値未満だったら minne の QC 担当者へメンション

(サービスごとにワークフローを用意することで、メンション先をそれぞれのサービスの QC チームの担当者へメンションされるようにできていますが、Google Sheets 側でもう少し工夫すれば、サービスごとにワークフローを作らなくても 1 つのワークフローで済むようにできる気がしつつも、今のところこの形で運用を続けています…)

ちなみに、notification が FALSE の場合は、該当するセルがないのでワークフローが 2 つ目のステップでエラーになり、3 つ目のステップに進めずメッセージが送信されずに停止します。

notification が FALSE で通知されなかった場合、該当行がなくエラーになる

まとめ

このような形で、満足度などの KPI に異常があったときのみ、BigQuery にある情報をもとに Google Sheets を介して Slack 通知し、「数値を確認する仕事」を最小限にすることができました。

この仕組みは、非エンジニアでも、SQL を書くことができれば好きな条件で Slack 通知できるので、これ以外にも

  • 解決済みにならずに n 日以上放置されている Zendesk のチケットがあればまとめて通知
  • 期日が設定されていない Zendesk のタスクチケットがあれば通知

など複数の用途で利用しています。
大変、大変参考になるブログを残していただいたZOZOテクノロジーの方には感謝しかありません。
また、今回の記事で、カスタマーサービス職の方にもこの活用事例が伝えられていたらいいなーと思います。おしまい!

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA