失注コメントを分類して失注理由を集計する
CRMに自由記述で溜まっている失注コメントを入力に、生成AIへ「価格」「機能不足」「タイミング」「競合」「予算凍結」「社内調整不調」「担当者離職」などの分類コードを割り当てさせます。1件のコメントに複数の理由が含まれる場合は、主因と副因を分けて返させます。
- 利用ツール
- ChatGPT/Claude/Gemini/Google Apps Script/Make/Power Automate/Python
- 対象業界
- IT・SaaS/商社/製造
- 対象部門
- 営業/経営企画
- 対象業務
- 分類・仕分け/集計・分析
- 主な課題
- データ分析に時間がかかる/判断に時間がかかる/属人化している
- AIで行う処理
- 分類
- 主な効果
- 判断支援/品質標準化/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- 既存ツールのみ(小)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 営業担当が案件を失注にする際、プルダウンから失注理由を選び、自由記述欄にコメントを書く
- 月末、営業企画がプルダウンの集計をレポートで出す
- プルダウンの結果を見ると「その他」が4割を占めている
- 「その他」の自由記述を1件ずつ読み、手元のスプレッドシートに分類を打ち直す
- 途中で時間が尽きて、読むのをやめる
- 集計は「価格が原因の失注が多い」という粗い結論で終わる
- 営業担当が案件を失注にし、自由記述でコメントを書く(従来どおり)
- 自動月末に、その月の失注案件のコメントをまとめて取得する
- 自動AIが1件ずつ、主因・副因の分類コードと確信度を返す
- 人確信度が低い案件、および「分類不能」の案件だけを人が確認する
- 自動分類結果をCRMの専用項目へ書き戻す
- 自動月次の集計レポートを生成する
各工程の詳しい説明を読む
- 営業担当が案件を失注にする際、プルダウンから失注理由を選び、自由記述欄にコメントを書く
- 月末、営業企画がプルダウンの集計をレポートで出す
- プルダウンの結果を見ると「その他」が4割を占めている
- 「その他」の自由記述を1件ずつ読み、手元のスプレッドシートに分類を打ち直す
- 途中で時間が尽きて、読むのをやめる
- 集計は「価格が原因の失注が多い」という粗い結論で終わる
問題は3つあります。
(a)プルダウンが機能していない。 営業担当は失注案件に時間をかけたくないので、迷ったら「その他」を選びます。結果、プルダウンの集計はそのまま使えません。
(b)自由記述に本当の理由が書いてある。 「先方の情報システム部が既存ベンダーとの関係を優先」といった、プルダウンにない粒度の情報がコメントには残っています。ここを読まないと打ち手が決まりません。
(c)1件に複数の理由が混ざっている。 「価格も高かったが、決め手は納期が合わなかったこと」というコメントを、プルダウンの単一選択では表現できません。
- 営業担当が案件を失注にし、自由記述でコメントを書く(従来どおり)
- 【自動】 月末に、その月の失注案件のコメントをまとめて取得する
- 【自動】 AIが1件ずつ、主因・副因の分類コードと確信度を返す
- 【人】 確信度が低い案件、および「分類不能」の案件だけを人が確認する
- 【自動】 分類結果をCRMの専用項目へ書き戻す
- 【自動】 月次の集計レポートを生成する
自動化されるのは「読んで分類する」部分です。残るのは、AIが迷った案件の判断だけになります。確信度が高い案件まで全件確認する運用にすると、この構成の効果はほぼ消えます。
02今回想定するシステム構成
Salesforce ── 失注案件のコメントを一括取得 │ ▼ スクリプト(Python / Google Apps Script)または ワークフロー(Power Automate / Make) │ ▼ LLM API ── 分類コード・主因/副因・確信度を返す │ ├──【確信度 高】→ そのまま書き戻し └──【確信度 低・分類不能】→ 人が確認 │ ▼ Salesforce の分類項目へ書き戻し │ ▼ スプレッドシート / BIツールで月次集計
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| CRM | Salesforce | HubSpot、kintone、Zoho CRM |
| 実行環境 | Python スクリプト | Google Apps Script、Power Automate、Make |
| 生成AI | Claude API | OpenAI API、Gemini API |
| 集計 | Googleスプレッドシート | Looker Studio、Power BI、Tableau |
この構成は月1回のバッチ処理です。 リアルタイム連携は要りません。そのぶん実装が軽く済みます。
03どうやって実装するのか
処理の起点を決める
毎月1日の朝9時など、時刻起動にします。
失注が発生するたびに1件ずつ処理する構成にもできますが、この業務では意味がありません。集計は月次でしか見ないため、月1回まとめて処理したほうが、API呼び出しも運用も単純になります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 失注コメント | 営業担当が書いた自由記述 | Salesforce |
| 案件情報 | 商談金額、業種、フェーズ、商談期間 | Salesforce |
| 分類コードの定義 | コードごとの意味と、判断の境界 | プロンプトに固定 |
案件情報を渡す理由は、コメントの解釈が案件の文脈で変わるためです。「予算が合わなかった」というコメントは、100万円の案件と5,000万円の案件では意味が違います。
データの取得方法を決める
Salesforce REST API の SOQL クエリで、前月に失注(StageName = 'Closed Lost')となった商談を取得します。
SELECT Id, Name, Amount, CloseDate, LossReason__c, LossComment__c, Industry__c
FROM Opportunity
WHERE StageName = 'Closed Lost'
AND CloseDate >= LAST_MONTH
HubSpot の場合は、ディールのフィルタ検索(POST /crm/v3/objects/deals/search)で dealstage が失注のものを取ります。
AIへ渡す前に整形する
- 空コメントの除外 … コメントが空、または「-」「なし」だけの案件を対象外にします。ここをAIに渡すと、AIは案件名から理由を推測します
- 短すぎるコメントの分離 … 10字未満のコメント(「価格」だけなど)は、分類はできますが副因は取れません。別扱いにします
- 個人名のマスキング … コメントに書かれた顧客担当者の氏名を、外部AIへ送る前に伏せ字にします。分類に氏名は不要です
AIに処理させる
分類コードの割り当てです。コードは先に自社で決めます。AIに「適切に分類して」と丸投げすると、毎月違うカテゴリが出てきて集計になりません。
| コード | 意味 | 判断の境界 |
|---|---|---|
PRICE | 価格が高い | 自社の提示額が理由。予算そのものが無い場合は BUDGET |
BUDGET | 予算が確保できなかった | 金額の多寡ではなく、予算枠がない・凍結された |
FUNCTION | 機能・仕様が要件に合わない | 必要な機能がない、性能が足りない |
TIMING | 検討時期が合わない | 導入時期の先送り。ニーズ自体は残っている |
COMPETITOR | 競合に決まった | 他社の名前が出ている場合 |
INCUMBENT | 既存ベンダーが継続 | 現行取引先との関係が理由 |
INTERNAL | 顧客の社内調整がつかなかった | 決裁が下りない、部門間の合意が取れない |
CONTACT_LOST | 担当者の異動・離職で立ち消え | |
NO_RESPONSE | 連絡が途絶えた | 理由が不明のまま終了 |
UNKNOWN | コメントから判断できない | 推測させず、必ずこれを使わせる |
指示内容を固定する
あなたは営業データを分類する担当者です。
以下の失注コメントを、指定された分類コードに割り当ててください。
【厳守事項】
- 分類コードは下記のリストからのみ選んでください。新しいコードを作らないでください。
- コメントに書かれていない理由を推測しないでください。
判断できない場合は必ず UNKNOWN を返してください。
- 主因は1つだけ選んでください。副因は0〜2つまでです。
- confidence は、コメントの記述だけを根拠に判断できた度合いです。
案件金額や業種から推測して補った場合は、必ず low にしてください。
- evidence には、判断の根拠になったコメント中の文言をそのまま引用してください。
引用できない場合は confidence を low にしてください。
【分類コードの定義】
{code_definitions}
【案件情報】
金額: {amount} / 業種: {industry} / 商談期間: {duration_days}日
【失注コメント】
{loss_comment}
evidence にコメントの原文を引用させる指示が、この構成の要です。 引用できない分類は、AIが文脈から作った推測です。引用の有無を機械的にチェックすれば、確信度の自己申告を検証できます。
出力形式を固定する
{
"primary_reason": "",
"secondary_reasons": [],
"confidence": "high | medium | low",
"evidence": "",
"note": ""
}
primary_reason と secondary_reasons の値は、定義した10コードに限定します。JSON Schema の enum で列挙すれば、リスト外の値が返ることを防げます。Claude API の Structured Outputs は、指定したスキーマに沿った出力だけを生成するよう制約をかける仕組みです。同種の機能は他社のLLM APIにもあります。
システムへ連携する
分類結果をSalesforceの商談レコードに書き戻します。
| JSONのキー | Salesforceの項目 |
|---|---|
primary_reason | カスタム項目「失注主因(AI分類)」 |
secondary_reasons | カスタム項目「失注副因(AI分類)」(複数選択) |
confidence | カスタム項目「分類確信度」 |
evidence | カスタム項目「分類根拠」 |
既存の「失注理由」プルダウンは上書きしません。 営業担当が選んだ値と、AIが分類した値を別項目で持ちます。両者を比べることで、プルダウンがどれだけ実態とずれているかが分かります。これ自体が経営に報告できる情報になります。
人が確認する
confidence が low の案件と、UNKNOWN の案件だけを人が確認します。
想定では、150件のうち30件程度(2割)がここに該当します。1件2分として60分。これが残る作業です。
high の案件を全件確認する運用にすると、削減効果がなくなります。ただし導入初月だけは全件を人が確認し、AIの分類と人の判断が何割一致するかを測ってください。一致率が8割を下回るなら、分類コードの定義が曖昧です。 コードを見直してから運用に入ります。
例外に対処する
| 起きること | 対応 |
|---|---|
| コメントが空 | 処理対象外。UNKNOWN として集計に含め、「コメント未記入」として別に数える |
| コードのリストにない値が返る | JSON Schemaのenumで防ぐ。それでも起きたら1回再実行し、失敗したら人へ回す |
| 1件のコメントに5つ以上の理由が書かれている | 副因は上位2つまでに切る。全部を拾うと集計が分散して読めなくなる |
| 顧客名・個人名がコメントに含まれる | 前処理でマスキングする |
| 月の失注が0件 | 正常系として扱い、レポートに「該当なし」と出す |
| API呼び出しが途中で失敗する | 処理済みの案件IDを記録し、再実行時はそこから続ける(同じ案件を二重に処理しない) |
記録を残す
- 入力したコメント(マスキング後)
- AIの出力JSON(
evidenceを含む) - 人が確認して変更した場合の、変更前後の値
変更ログは、分類コードの定義を見直す材料になります。「PRICE と BUDGET の取り違えが毎月起きる」と分かれば、境界の説明を書き直せます。
04実装レベルの3段階
本格構成の価値は、失注理由が案件レコードに構造化されて入ることで、「価格が理由の失注案件を、半年後に再アプローチする」といった動きが取れるようになる点です。集計だけが目的なら、半自動化で止めて構いません。
05工数削減シミュレーション
導入後 150件 × 1分 ÷ 60 = 2.5 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- CRMの自由記述欄に失注コメントが蓄積されており、月100件以上の失注がある組織。失注分析を打ち手につなげたい場合。
- 失注コメントを記入していない組織。月20件未満で、手作業で読み切れる規模。
07最小構成で試す方法
この業務は、最小構成のまま運用しても成立します。 月150件なら、手作業でのコピー&ペーストでも回るためです。
- Salesforceから前月の失注案件をCSVで書き出す
- コメント列を20件分コピーする
- ChatGPT、Claude、Gemini などのチャット画面に、上のプロンプトと分類コードの定義を貼る
- 続けて20件分のコメントを貼り、まとめて分類させる
- 出てきた結果をスプレッドシートに貼る
20件を1回のやり取りで処理できるので、150件でも8回のコピー&ペーストで終わります。まずこれを1か月分やってみて、集計結果が経営会議で使えるかを確かめてください。 使えないなら、自動化しても価値はありません。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 分類コードの境界が曖昧で、毎回違う結果が出る | コードごとに「判断の境界」を1文で書く。特に PRICE と BUDGET、COMPETITOR と INCUMBENT |
| AIがコメントにない理由を書く | evidence に原文の引用を必須にする。引用できないものは low に落とす |
| コード外の値が返る | JSON Schema の enum で列挙する |
| 1件のコメントに理由が多すぎて分散する | 副因は2つまでに制限する |
| 導入初月から全件自動にして、誤分類に気づかない | 初月は全件を人が確認し、一致率を測る。8割を下回ればコード定義を直す |
| 既存のプルダウンを上書きしてしまう | 別項目で持つ。両者の差分自体が分析材料になる |
| 前月分を二重に処理する | 処理済み案件IDを記録し、再実行時はスキップする |
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 顧客の社名、商談金額、失注理由、競合他社名。コメントに顧客担当者の氏名が含まれることがあります。
- 個人名のマスキング … 分類に氏名は不要です。前処理で伏せ字にしてから外部AIへ渡します
- 競合他社名の扱い … コメントには競合名が書かれます。外部AIへの入力可否を、自社の情報管理規程で確認します
- 学習利用 … 入力を学習に使わないことが保証されるサービスを選びます
- 自動実行してよい範囲 … 分類結果はCRMに書き込まれるだけで、顧客に対する行動を起こしません。この構成は、確信度が高い案件の自動処理を認めてよい部類です。 ただし、分類結果を根拠に自動で再アプローチメールを送るような拡張をする場合は、そこに人の確認を入れてください
誤分類が起きた場合のリスクは、経営が誤った失注傾向をもとに打ち手を決めることです。evidence を残し、集計の元データをたどれる状態にしてください。
10まず何から始めるか
1週目:分類コードを決める
過去3か月分の失注コメント(450件程度)をざっと読み、実際に出てくる理由を書き出します。そこから10前後のコードに整理します。この作業をAIにやらせないでください。 自社の事業構造を反映したコードでないと、集計が意思決定に使えません。
2週目:20件で試す
最小構成(§8)で20件を分類し、人の判断と突き合わせます。一致率が8割を超えるまで、コードの定義文を直します。
3週目:1か月分を通す
150件を最小構成のまま処理し、月次集計を作ります。それを営業会議に出して、議論に使えるかを確かめます。
その後: 使えることが確認できてから、スクリプト化とCRMへの書き戻しを実装します。この順番を逆にすると、「動くけれど誰も見ないダッシュボード」ができます。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Claude APIのStructured Outputs(JSON Schemaによる出力形式の固定、enumによる値の制限) | Anthropic: Structured outputs | 2026-09-02 |
| HubSpotのオブジェクト検索・プロパティ更新API | HubSpot: Properties API | 2026-09-02 |
Salesforce の SOQL および REST API は一般提供されている機能ですが、カスタム項目の追加とAPI利用には自社のSalesforce管理者による設定が必要です。この部分は利用環境に応じた個別確認が必要です。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0003)についてのご相談はこちらから。
