この記事は、Pepabo CS Advent Calendar 2021 の19日目記事として書きました。PepaboのCSについて興味ある方は他の投稿も是非読んでみてください!
問い合わせ数の急上昇に気づきたい
問い合わせ対応の現場では、サービスの最前線に立って日々顧客と向き合っています。
問い合わせの内容は、使い方やトラブルシューティングなど様々な内容に分かれていますが、提供する製品に問題が発生した際など、顧客からの問い合わせの急な増加をきっかけに何かトラブルが発生していると検知できるケースがあります。
Zendeskを利用されている場合は、Zendesk Search APIを用いて特定条件のチケット数をモニタリングすることができます。そして、件数の増加数が一定数を超えたときにslackに通知する方法を解説します。
想定読者
- Zendeskユーザー
- 過去に急な問い合わせ増加に気づけず困った経験がある方
- 土日祝日などサポートのリソースを抑えているケース
- メール対応がメインの窓口で、数時間前の問い合わせを対応しているので今来た問い合わせの数を把握できないでいるケース
問い合わせの急上昇を検知する方法
現在弊社では、以下のような仕組みで問い合わせの急上昇を検知する設計を行っています。
- 毎10分ごとに直近の問い合わせ総数を取得する
- 取得した件数を、その前の10分間の問い合わせ総数と比較する
- 比較した件数がxx件を超えていたときslackにて通知を飛ばす
完成型
次のようなメッセージを特定のslackチャンネルに投下して、問い合わせの急上昇をお知らせします。
チケット急上昇アラート実装のレシピ
- 検知したい条件を決める
- 検知条件に応じたデータの取得APPを実装する
- スプレッドシートにて10分前のデータと比較を行う
- slackへの連携
- 通知が続かないようにする処理を入れる
それではそれぞれの手順を説明します。
1. 検知したい条件を決める
ここは、Zendeskの検索窓で行える作業です。
Zendeskの検索窓を使って、どんな検索条件のチケット数を検知したいかを決めてください。
例えば、以下のケースで説明します。
- type:チケットを指定
- brand:複数のブランド展開している場合はbrandidを指定
- staus:チケットのステータスを指定
- -なんたら:
-をつけて除外したいケースを追加します。 - ここの例では、
recipientが ****@xxx.comからの問い合わせは除外するとしています
2. 検知条件に応じたデータの取得APPを実装する
抽出条件が決まったら、その抽出条件の件数を抽出します。
まずは、Search APIを使って、先ほど決めた検索条件と同じ条件になる検索クエリを作ります。
例えば上記条件の場合は、次のURLになります。
https://SUBDOMAIN.zendesk.com/api/v2/search.json?query=type:ticket+brand:****+status<pending+-recipient:***@xxx.com
このURLを、Zendeskの認証済みブラウザで実際に叩けばjson形式のファイルをブラウザで確認することもできます。
実際にブラウザで閲覧した時、最下部にある count:xx 箇所に、期待する数字が出ていることを確認してください。
Zendesk Search APIについては以下ページを参照ください。
Search
The Search API is a unified search API that returns tickets, users, and organizations. You can define filters to narrow your search results according to resource type, dates, and object properties, such as ticket requester or tag. To search articles in Help Center, see Search in the Help Center API documentation.
developer.zendesk.com
次に、このcount数値を抽出するアプリを実装します。
ここではGASを使って抽出してみました。
function CheckPar10min(){
//取得用URLを指定
var url = 'https://SUBDOMAIN.zendesk.com/api/v2/search.json?query=type%3Aticket+brand:***+status%3Cpending';
//認証用情報の呼び出し
var email = PropertiesService.getScriptProperties().getProperty("email")
var token = PropertiesService.getScriptProperties().getProperty("token")
var data = {
'email' : email,
'token' : token
};
//dataをzendesk認証用に置き換え
var options = {
'method' : 'get',
'headers': {
'Authorization': "Basic " + Utilities.base64Encode(Utilities.newBlob(data.email + '/token:' + data.token).getBytes()),
'contentType' : 'application/json',
'Accept' : 'application/json'
}
};
//urlと認証情報をマージ
var response = UrlFetchApp.fetch(url,options);
//json形式
var json = JSON.parse(response);
//対応残件数をNewOpenticketCountに代入
var NewOpenticketCount = json["count"];
//取得日時
var now = new Date();
//スプレッドシート情報
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('ticket-alert');
var B2 = sheet.getRange('B2').getValue()
var D2 = sheet.getRange('D2').getValue();
//一つ前のデータを置く
sheet.getRange('C2').setValue(B2)
//最新のデータと取得日時を置く
sheet.getRange('A2').setValue(NewOpenticketCount);
sheet.getRange('E2').setValue(now);
}取得できたデータをスプレッドシートに吐き出します。
=B2-C2 という数式を入れて差分を出していますこの吐きだしを行った際、D2のセルにて10分間の差分を吐き出しておきます。
3. スプレッドシートにて10分前のデータと比較を行う
上記で吐きだしした数字を元にslackへの通知要否を判断する処理を追加します。
ここでもGASで検証しています。スプレッドシートに代入された筋を呼び出して、 D2 セルの数字が20を超えていたときに、slack通知が発火する処理を加えています。
function alert_push(){
//取得日時
var now = new Date();
//スプレッドシート情報
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('ticket-alert');
var A2 = sheet.getRange('A2').getValue();
var D2 = sheet.getRange('D2').getValue();
var F2 = sheet.getRange('F2').getValue();
//slack通知内容
var text = "直近のチケット発生数がしきい値を超えました。\n現在( " + now.getDate() + "日 " + ("0"+now.getHours()).slice(-2) + ":" + ("0"+now.getMinutes()).slice(-2) + " )のチケット数【" + sheet.getRange('A2').getValue() + "】件\n10分前より" + sheet.getRange('D2').getValue() +"件増加したよ"
Logger.log(text)
//var F2 = 20
if (D2 >= 20 && F2 != 1){
slackworkflow(text);
} else {
};
}4. slackへの連携
slackに通知を飛ばすための、webhookをslack側で発行します。
workflow builder にて、webhookの発行が行えるのでこちらから進みます。
GASの通知メッセージを引き渡す変数を作成します。今回は text で作成済みなのでtextと打ちました。
最後に、slack通知の一連の流れを設計します。
- 通知先チャンネル
- 通知するメッセージの細かな調整(アプリ内で実装もできますし、フロービルダー側での実装もできます)
- 一度通知が始まったら、問題が起き続けている間通知が何回も飛ばないような処理を加えておきます。(ここは後述します)
これで、フロービルダーを公開するとwebhookのURLが発行されます。
発行されたURLを通知用のGASに組み込みます。
function slackworkflow(text) {
// リクエスト内容を整形
const options =
{
"method" : "post",
"contentType" : "application/json",
"payload" : JSON.stringify(
{
"text" : text,
link_names: 1
}
)
};
//投稿先
UrlFetchApp.fetch("https://hooks.slack.com/workflows/***", options);
}これで、GASの作動を10分おきに動かすことで、slackへの通知が開始されます。
5. 通知が続かないようにする処理を入れる
最後の作業として、一度通知が始まった時、お問い合わせが落ち着くまでの間10分おきに通知が飛び続けてしまいます。その通知を一時的に停止する処理を加えます。
実装は、slackのフロービルダーとスプレッドシートにて行いました。
具体的には、 F2 に設けた「確認中フラグ」の値が 0 の時は通知可能状態とし、 1 の値が入っているときは、通知をスキップする処理です。
通常はここは 0 になっています。が、閾値を超過した時にslack通知されたメッセージ内に「確認する」旨のボタンを設けました。
ここを押下すると、「確認中フラグ」の値を 1 に切り替える処理をフロービルダーにて組み込みました。
これで、 F2 セルの値が 1 のとき、通知の条件から除外する処理を加えているので通知対象からは除外されます。
また、 1 を 0 に戻す処理は以下2つを実装しています。
- フロービルダーにて、「対応完了」ボタンアクションを用意し、対応完了時に押下することでF2の値を
0に戻す - 夜中の0時台に強制的にF2のシートの値を
0に戻す(GASで実装)
この一連の対応にてチケットの異常を検知できるようになります。もし件数のモニタリング通知を希望している方は是非お試しください。
Copyright ©︎ Takao Tatematsu. All Rights Reserved. This website is made with 🄽 Notion and ⚡️ Super