Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

お客様フィードバックをAzureとNotionで構造化:カスタマーサクセスに寄り添うQAの取り組み

序章: カスタマーサクセスに寄り添うためのQAの役割

こんにちは。QA部門でEightとContract Oneの品質マネジャーを務めている三好秀治です。本稿では、Slack・Azure Logic Apps・Azure OpenAI Service・Notionを活用したお客様フィードバックの管理効率化と、カスタマーサクセスに寄り添う取り組みについてご紹介します。

カスタマーサクセスの向上には、お客様のフィードバックが不可欠です。これはプロダクト改善や顧客満足度向上に直結するからです。私たちは、フィードバックの自動分類や可視化を通じて迅速な対応を実現します。本記事では、この仕組みの構築方法を具体例を交えて説明します。

なお、セキュリティ上の理由からAPIキーや認証情報の管理は省略しますが、実際の運用ではこれらの適切な管理が不可欠です。ご留意ください。

第1章: Slackに集まるお客様の声を収集する仕組み

Sansanでは、Slackを通じて日常的にお客様からフィードバックを受け取っていますが、これを手動で管理するには多大な労力を要します。そこで、Slackで得られたフィードバックを自動で収集・整理するプロセスをご紹介します。

このシステムのアーキテクチャは、Slack → Azure Logic Apps → Azure OpenAI(GPT) → Notionという流れで構成されています。QA部門にはプログラミング経験の少ないエンジニアも在籍するため、コードレスで設計可能なAzure Logic Appsを採用しました。詳細は公式文書をご確認ください。

1.1 Slack APIの設定

まず、Slack APIを利用してフィードバックを収集するための設定を行います。

Slackアプリの作成

  • Slack APIにアクセスし、新しいアプリを作成します。
  • 必要なスコープを追加します。以下が必要です。
    • channels:read: パブリックチャンネルへのアクセス。
    • users:read: メッセージ投稿者の情報を取得するため。

イベントの取得

  • Slack APIトークンを取得し、Azure Logic Appsで使用します。
  • 対象チャンネルIDを確認し、そこからフィードバックを収集します。
1.2 Azure Logic Appsの設定

次に、Azure Logic AppsでSlackからフィードバックを受信し、自動で処理するワークフローを設定します。

HTTPトリガーの設定

  1. Azure Logic Appsの作成
  2. HTTPリクエストトリガーの設定
    • Logic Apps内で、**「When an HTTP request is received(HTTPリクエストを受信したとき)」**というトリガーを追加します。これがSlackのメッセージを受け取るエンドポイントになります。
  3. 受信URIの設定
    • HTTPトリガーを設定すると、Logic Appsが自動的にエンドポイントのURIを生成します。このURIをSlackの「Event Subscriptions」で設定し、メッセージの通知を受け取れるようにします。
Notionの準備

次に、Slackで取得したフィードバックをNotionに自動的に保存・整理するための準備を行います。

Notion Integrationの作成

  • Notion APIでインテグレーションを作成し、APIキーを取得します。
  • 取得したAPIキーをAzure Logic Appsで使用します。

データベースの設定
Notion内で以下のようなフィールドを含むデータベースを作成します。

  • Title: フィードバックの要約。
  • Slack Description: Slackのメッセージ内容。
  • Slack URL: 元のSlackメッセージに戻るためのリンク。
  • Date: フィードバックの投稿日。

第2章: Azure Logic Appsでのフィードバックデータの加工と整形

Slackから収集したお客様のフィードバックは形式が一定していないため、整理と整形が必要です。Azure Logic Appsを活用し、このフィードバックデータを解析・加工して、Notionに登録しやすい形に変換するプロセスをご紹介します。

2.1 JSONデータの解析(Parse JSONアクションの利用)

Slack APIから取得したメッセージデータは、通常JSON形式で提供されます。このデータを効果的に処理するには、「Parse JSON」アクションを使用し、フィードバックの内容を構造化データとして扱います。これにより、後続の処理が容易になります。

手順:
Parse JSONアクションを追加し、Slackメッセージを解析します。
メッセージ本文、投稿者、タイムスタンプなど、必要なフィールドを抽出し、スキーマを指定してデータを整形します。
スキーマ例:

{
  "event": {
    "type": "message",
    "text": "お客様の要望の内容",  // Slackに投稿されたお客様の要望やフィードバック
    "user": "USER_ID",  // ユーザーIDを匿名化
    "ts": "1697092886.429139",  // タイムスタンプ
    "channel": "CHANNEL_ID",  // チャンネルIDを匿名化
    "event_ts": "1697092886.429139",  // イベントタイムスタンプ
    "channel_type": "channel"  // チャンネルの種類
}

このスキーマを活用することで、メッセージの内容を効率的に整理し、必要なデータを抽出する準備が整います。

2.2 データの整形と加工

Azure Logic Appsでは、フィードバックメッセージをNotionに登録する前に、「Compose」アクションや「Expression(式)」を用いてデータを整形します。以下に、メッセージデータの加工例を示します。

データの加工例:
URLやキーワードの抽出: メッセージ本文から特定のURLやキーワードを抽出し、別のフィールドに保存します。
受信日時の保存: Slackからメッセージを受信した日時をNotionに保存します。

{
"Date": {
  "type": "date",
  "date": {
    "start": "@{formatDateTime(utcNow(), 'yyyy-MM-dd')}",
    "end": null
  }
}

投稿者IDを表示名に変換: SlackのユーザーIDを表示名に変換し、投稿者名として表示します。必要に応じて、Slack APIからユーザー情報を取得します。

2.3 Azure OpenAIを使ったタイトル生成の自動化

Azure Logic AppsとAzure OpenAIサービスを組み合わせることで、フィードバック内容から自動的にタイトルを生成できます。フィードバックの本文をGPTモデルに送信し、その要点を抽出してタイトルとして活用します。

手順:
Slackメッセージの内容をAzure OpenAI GPTモデルに送信
フィードバック本文をGPTに送信し、その内容から適切なタイトルを生成します。

{
  "messages": [
    {
      "role": "system",
      "content": [
        {
          "type": "text",
          "text": "あなたはお客様からの要望を分類する担当です。"
        }
      ]
    },
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "@{triggerBody()?['event']?['text']}"
        }
      ]
    }
  ]
}

この自動化プロセスにより、フィードバックデータは適切に整形され、さらに各フィードバックに対して要点を捉えたタイトルが自動生成されます。

第3章: Azure Logic Appsで整形したデータをNotionに登録する方法

本章では、Azure Logic Appsを活用し、Slackから収集・整形したフィードバックデータを、GPTが生成したタイトルとともにNotionへ登録する手順を詳しく説明します。

3.1 Notion APIの設定

Notion APIを活用し、外部システムからNotionデータベースへデータを登録します。まず、Notion APIキーを取得し、Azure Logic Appsで使用できるよう設定します。

3.2 Azure Logic AppsでNotionへのデータ送信

Azure Logic AppsのHTTPアクションを使用し、GPTが生成したタイトルとフィードバックデータをNotionに送信します。データは適切にフォーマットされ、「Title」フィールドと「フィードバック内容」フィールドにそれぞれ分けて登録されます。

サンプルコード: GPTで生成したタイトルとSlackメッセージをNotionに送信
Azure Logic Appsを活用し、Slackから収集したフィードバックデータをもとにAzure OpenAI GPTが「タイトル」を生成します。GPTが抽出したフィードバックの要点はNotionの「Title」フィールドに、フィードバックメッセージ本文は別のフィールドに登録されます。以下に、GPTが生成したタイトルとSlackメッセージの内容をNotionに登録するサンプルリクエストを示します。

{
 "parent": {
    "database_id": "YOUR_DATABASE_ID"
  },
  "properties": {
    "Title": {
      "title": [
        {
          "text": {
            "content": "@{body('Generate_Title')?['choices']?[0]?['message']?['content']}"
          }
        }
      ]
    },
    "Slack Description": {
      "rich_text": [
        {
          "text": {
            "content": "@{triggerBody()?['event']?['text']}"
          }
        }
      ]
    },
    "Date": {
      "date": {
        "start": "@{formatDateTime(utcNow(), 'yyyy-MM-dd')}"
      }
    },
    "Slack URL": {
      "url": "@{concat('https://slack.com/archives/', triggerBody()?['event']?['channel'], '/p', replace(triggerBody()?['event']?['ts'], '.', ''))}"
    }
  }
}

このサンプルでは、GPTが生成したタイトルを「Title」フィールドに、Slackメッセージの本文を「Slack Description」フィールドに登録します。さらに、SlackメッセージのURLと投稿日時も、それぞれ対応するNotionのフィールドに記録されます。

結論: お客様の声を効果的に管理・分析する

カスタマーサクセスの実現と製品改善には、顧客からのフィードバックを効率的に収集・管理・分析することが不可欠です。本記事では、Slack、Azure Logic Apps、Azure OpenAI Service、そしてNotionを活用し、お客様の声を自動的にNotionに集約し、可視化・分析する技術的アプローチを詳述しました。
この仕組みにより、フィードバック管理の負担が大幅に軽減され、顧客の声をより迅速に製品改善に反映できるようになります。
今後も、Azure Logic Appsをはじめとする自動化ツールを積極的に活用し、さらに効率的なフィードバック管理システムの構築に努めます。これにより、継続的な製品改善を実現してまいります。

中途採用のご案内

  • 「Sansan/Datahub/Eight/Contract One」のいずれかの品質保証業務を担当し、プロダクトのテスト設計、テスト自動化、品質基準の策定、リリース前後の品質管理を行います。新技術の導入やプロセス改善に積極的に取り組める方を募集しています。詳細はこちらをご覧ください。
  • インボイス管理サービス「Bill One」の品質保証業務を担当します。基本的な要件は上記と同様ですが、よりグローバルな環境での業務となるため、英語力のある方を歓迎します。詳細はこちらをご覧ください。

© Sansan, Inc.