サーバー スクリプト、ジョブ、Google Workspace を使用して KPI を管理する - ケーススタディ

数か月前、Vtigerは サーバースクリプトとジョブ VTAP プラットフォームの機能。この記事では、この機能の実際的な応用を検討し、Vtigerチームがチームメンバーに主要業績評価指標(KPI)についての情報を提供し続けるために内部でどのように使用しているかを紹介します。

課題: KPI について常にチームに最新の情報を提供する

Vtigerエンジニアリングチームは、パフォーマンス、セキュリティ、ユーザーエクスペリエンス、顧客の問題に焦点を当てた小規模なユニットで構成されています。各チームには、目標に対する進捗状況を追跡するための独自の KPI セットがあります。全員が確実に情報を入手できるように、チームの目標と現在のパフォーマンスを定期的に更新する方法が必要でした。

解決策: Google Spaces と VTAP サーバーのスクリプトとジョブ

当社は、Google Chats や Google グループなどの内部コミュニケーションに Google Workspace を利用しています。各チームには専用の Google スペースがあり、メンバーは指標に直接影響を与え、目標の達成に責任を負います。

Google Chats は、スペースに自動メッセージを送信するための Webhook を提供します。これらの Webhook を構成するには、[スペース設定] > [アプリと統合] > [Webhook] > [Webhook の追加] に移動します。

チームごとに専用のスペースを作成しました。たとえば、フェラーリ グループは、内部ツールによって取得され、顧客から報告されたパフォーマンスの問題を追跡しています。これらの問題は影響によって分類され、対応する重み付けを使用して優先度レベルが割り当てられます。複数のユーザーまたはサーバーに影響を及ぼす重大な問題は最も高い重み付け (例: 10 ポイント) を受け取りますが、特定のユーザーまたは機能に限定された問題はより低い重み付け (例: 5 ポイント) を受け取ります。報告されたすべての問題を集計し、インデックス スコアを計算します。スコアが高いほど解決の必要性が高いことを示し、スコアが低いほど前向きな進歩が見られることを示します。

各チームの更新頻度は、ワークフローに応じて異なります。顧客対応チームは、重要な問題を常に把握するために、毎日午前 10 時に更新を行う必要があります。パフォーマンス チームの業務には分析と検証が含まれており、修正をリリースする前に徹底的な調査ができるよう、週に 00 回アップデートを受け取ります。

毎日の更新のスケジュールされたジョブの作成

毎日午前 10 時に顧客対応チームにスコアを通知するサーバー側ジョブを設定する方法は次のとおりです。

  1. メインメニューでプラ​​ットフォームアプリに移動し、サーバージョブを選択します。
  2. 新しいサーバー ジョブを作成します。これらは cron ジョブと同様に機能し、2 分間の実行制限があります。

サーバージョブの機能

要件: 顧客の問題インデックスに関する通知を毎日 Google Space に送信します。

解決策:

  • VtigerのWebサービスAPIを利用してレポートデータにアクセスしました。 
  • Vtigerのカスタムレポートは、優先度別に分類された未解決の問題をカウントするために作成されました。
  • 問題はVtigerのタスクモジュール内で報告されました。
  • サーバー スクリプトは、VTAP の HTTP API を利用してレポートにアクセスし、JSON 形式でデータを取得しました。
  • スコアが計算および集計され、情報を Space Webhook に送信するためのテンプレートが準備されました。
  • 最後に、サーバー ジョブ内の VTAP の HTTP API が詳細をスペースに送信しました。
  • 注意: 新しい Web サービス API については、今後数か月以内にさらに詳しく説明される予定です。

スケジュール管理: サーバー ジョブの頻度により、グループへのタイムリーな情報配信が保証されます。

CPコード


  

asyncfunctionmain() { //Type your code here let url = "https://YOUR_ACCOUNT_URL/api/records/data?module=Reports&id=REPORT_ID"; var USERNAME = 'VTIGER_USERNAME'; var PASSWORD = 'VTIGER_PASSWORD'; var authHeader = btoa(USERNAME+":"+PASSWORD); var options = {           headers: {Authorization: 'Basic '+authHeader}       } var response = await vtap.macro.http.get(url, options); var body = JSON.parse(response.body); //extract information from the report. let data = {}; for(let i in body){ if("Bug" === body[i]["Calendar.tasktype"]) {         data[body[i]["Calendar.taskpriority"]] = body[i]["record_count"];     } } if(!data["URGENT"]) data['URGENT']=0; if(!data["High"]) data['High']=0; if(!data["Medium"]) data['Medium']=0; if(!data["Low"]) data['Low']=0; let text = "\n\n Today's open bugs tasks count - "+ newDate().toDateString()+'\n -------------------------------------\n'; text = text + "URGENT Tasks - "+data["URGENT"]+"\n"; text = text + "High Tasks - "+data["High"]+"\n"; text = text + "Medium Tasks - "+data["Medium"]+"\n"; text = text + "Low Tasks - "+data["Low"]+"\n"; text = text + "Performance Index Score : "+ ((10 * parseInt(data["URGENT"])) + (5 * parseInt(data['High'])) + (3 * parseInt(data['Medium']))) + "\n"; var options = {         headers : { 'contentType': 'application/json'         }, 'body' : JSON.stringify({'text':text})     }; let chatWebhookURL = "https://chat.googleapis.com/v1/spaces/zz/messages?key=yyyyyy&token=xxxxx";     vtap.macro.http.post(chatWebhookURL,options); }


  

asyncfunctionmain() { //Type your code here let url = "https://YOUR_ACCOUNT_URL/api/records/data?module=Reports&id=REPORT_ID"; var USERNAME = 'VTIGER_USERNAME'; var PASSWORD = 'VTIGER_PASSWORD'; var authHeader = btoa(USERNAME+":"+PASSWORD); var options = {           headers: {Authorization: 'Basic '+authHeader}       } var response = await vtap.macro.http.get(url, options); var body = JSON.parse(response.body); //extract information from the report. let data = {}; for(let i in body){ if("Bug" === body[i]["Calendar.tasktype"]) {         data[body[i]["Calendar.taskpriority"]] = body[i]["record_count"];     } } if(!data["URGENT"]) data['URGENT']=0; if(!data["High"]) data['High']=0; if(!data["Medium"]) data['Medium']=0; if(!data["Low"]) data['Low']=0; let text = "\n\n Today's open bugs tasks count - "+ newDate().toDateString()+'\n -------------------------------------\n'; text = text + "URGENT Tasks - "+data["URGENT"]+"\n"; text = text + "High Tasks - "+data["High"]+"\n"; text = text + "Medium Tasks - "+data["Medium"]+"\n"; text = text + "Low Tasks - "+data["Low"]+"\n"; text = text + "Performance Index Score : "+ ((10 * parseInt(data["URGENT"])) + (5 * parseInt(data['High'])) + (3 * parseInt(data['Medium']))) + "\n"; var options = {         headers : { 'contentType': 'application/json'         }, 'body' : JSON.stringify({'text':text})     }; let chatWebhookURL = "https://chat.googleapis.com/v1/spaces/zz/messages?key=yyyyyy&token=xxxxx";     vtap.macro.http.post(chatWebhookURL,options); }

 

公式サイト限定

このアプローチにより、チームに KPI を通知するプロセスが自動化されました。現在、私たちは全員が常に最新情報を入手し、目標の達成に集中できるようにするために を使用しています。

また、チームの効率と生産性の向上にも役立ちます。

 

公式サイト限定

このアプローチにより、チームに KPI を通知するプロセスが自動化されました。現在、私たちは全員が常に最新情報を入手し、目標の達成に集中できるようにするために を使用しています。

また、チームの効率と生産性の向上にも役立ちます。

 
 
 

VTAP で近日公開予定

 
 

データ コネクタ デザイナー モジュールはユーザー インターフェイスを提供し、他のアプリケーションとの統合を支援します。

データをVtigerに保存せずに、Vtigerインターフェイス内でアプリケーションデータを確認できます。データを CRM にコピーせずに、外部データに依存する自動化フローを実装する、より安全かつ簡単な方法を有効にすることもできます。

これについては今後数か月以内にさらに詳しくお知らせしますので、ご期待ください。

 

データ コネクタ デザイナー モジュールはユーザー インターフェイスを提供し、他のアプリケーションとの統合を支援します。

データをVtigerに保存せずに、Vtigerインターフェイス内でアプリケーションデータを確認できます。データを CRM にコピーせずに、外部データに依存する自動化フローを実装する、より安全かつ簡単な方法を有効にすることもできます。

これについては今後数か月以内にさらに詳しくお知らせしますので、ご期待ください。

 
 

サインアップして最新のアップデートを受け取りましょう!