lead-qualification について
lead-qualificationは、リードの基準を定め、確信度と理由を添えてリストを評価するマーケティングスキルです。基準の聞き取り、プロンプトの再利用や調整に対応し、LinkedIn情報の補完と並列処理も選択できます。
主な機能
- 01段階的な聞き取りによる基準作成
- 02保存済み資格プロンプトの再利用と調整
- 03CSV、URL、テキスト一覧、シートの受け付け
- 04ApifyによるLinkedIn情報補完の選択
- 05結果を調整後に並列評価
- 06評価と理由のCSV出力
活用シーン
- 01新規アウトリーチ施策の基準作成
- 02既存基準によるリード一覧の評価
- 03サンプル結果を確認して基準を調整
- 04評価前にLinkedInリード情報を補完
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ gooseworks-ai/ goose-skills --skill lead-qualificationインストール後、Claude Code で/lead-qualificationを入力して読み込まれたか確認します。
同梱ファイルscripts/enrich_leads.pyskill.meta.json
詳細
リード適格性判定エンジン
構造化されたヒアリングプロセスを通じて、独自の基準に照らしてリードの適格性を判定し、その後、信頼度評価と理由を添えてリードリストを並行してスコアリングします。
3つの運用モード
モード1:ヒアリング+適格性判定
既存の適格性判定プロンプトがありません。ヒアリングを行ってプロンプトを作成し、保存してからリードの適格性を判定します。
トリガー: ユーザーが適格性判定プロンプトを提示しない場合。
モード2:既存プロンプトを再利用+適格性判定
ユーザーが既存の適格性判定プロンプトを提供した場合は、ヒアリングを省略し、すぐにスコアリングを開始します。
トリガー: ユーザーが適格性判定プロンプトのファイルを添付または指定した場合(たとえば、以前に作業ディレクトリの
qualification-prompts/ に保存したファイル)、またはメッセージ内に基準を貼り付けた場合です。貼り付けられた基準が整理されていない場合は、まず以下の構成にまとめてから、ユーザーに確認してください。
このスキルにはすぐに使えるプロンプトは含まれていません。すべてのプロンプトはユーザーが提供するか、エージェントがヒアリングを通じて作成します。
モード3:改善/調整
ユーザーが結果を確認し、基準の調整を希望しています。保存済みのプロンプトを更新し、再実行します。
トリガー: ユーザーが「改善」「調整」「それは違う」などと言う場合、または適格性判定の結果についてフィードバックを提供する場合です。
フェーズ1:ヒアリング(モード1のみ)
目的は、ユーザーが適格とみなす対象と不適格とみなす対象を完全に把握することです。ユーザーが効率よく回答できるよう、質問をまとめて提示します。
ラウンド1 — 基本の質問(一度にすべて提示)
以下の質問を番号付きリストで提示します。ユーザーには次のように伝えてください。「関係する項目に回答し、関係のない項目は飛ばしてください。確認が必要な点があれば、追加で質問します。」
製品とキャンペーンの背景:
- 製品/サービスを一文で説明すると、どのようなものですか?
- どのような課題を、誰のために解決しますか?
- 具体的なキャンペーンやアプローチの切り口は何ですか?(例:「シリーズAの資金調達を終えたばかりの企業をターゲットにする」「競合他社Xからの乗り換えを検討しているチームを狙う」)
企業レベルの基準: 4. どの規模の企業をターゲットにしていますか?(例:1~10人、11~50人、51~200人、201~1000人、1000人以上) 5. 適合する業界や分野は何ですか? 6. 明確に除外する業界や企業の種類はありますか? 7. 対象地域はどこですか?それとも全世界が対象ですか? 8. 除外する地域はありますか? 9. 企業のステージは重要ですか?(例:シード、シリーズA、シリーズB以降、上場企業) 10. 重要な売上高または資金調達額の範囲はありますか?
担当者レベルの基準: 11. 理想的な購入者の役職や職種は何ですか? 12. 明確に不適格とする役職は何ですか? 13. 職位のレベルは重要ですか?(例:ディレクター以上、VP以上、Cレベルであること) 14. どの部門に所属している必要がありますか?(例:グロース、マーケティング、営業、エンジニアリング) 15. 現在の会社での最低勤続期間はありますか?(例:購買決定権を持つために6か月以上) 16. 総就業年数は重要ですか?
行動・状況に関するシグナル: 17. 適格または不適格の判断材料となる技術スタックのシグナルはありますか?(例:「Salesforceを利用している」=適合) 18. 最近の企業活動は重要ですか?(例:採用の急増、資金調達、製品のローンチ) 19. コンテンツや投稿に関するシグナルはありますか?(例:「AIについて投稿した」=関連性がある) 20. 高い購買意欲や適合性を示すほかのシグナルはありますか?
除外条件と即時適格条件: 21. 絶対的な不適格条件は何ですか。他の要素に関係なく、該当すれば直ちに「対象外」となる条件です。 22. 最も強力な適格条件は何ですか。該当すれば、ほぼ確実に「対象」となる条件です。
ラウンド2 — 追加質問
ユーザーの回答に基づき、曖昧な点を解消するための具体的な追加質問を5~10個尋ねます。例:
- 「ミッドマーケットと言われましたが、従業員数は50~500人ですか、それとも50~1000人ですか?」
- 「グロース担当VPを挙げられましたが、『Head of Growth』も対象ですか。それともVPという肩書きが必要ですか?」
- 「地域について触れられていませんでしたが、全世界を対象としてよいですか?」
- 「勤続期間は最低6か月とのことですが、社内で昇進してから4か月の人はどう扱いますか?」
- 「シリーズAの企業を挙げられましたが、同等の売上があるブートストラップ企業はどうですか?」
ラウンド 3 — 境界ケースのシナリオ(任意ですが推奨)
境界ケースを試すため、架空のリードプロフィールを 3~5 件提示します。「この人は条件を満たしますか?」と尋ねてください。
作成するシナリオの例(ユーザーの基準に応じて調整してください):
- 肩書きは条件に合うものの、会社の規模がわずかに大きすぎる、または小さすぎる人
- 会社は条件に合うものの、肩書きが境界線上にある人
- すべての条件に合うものの、勤続年数が短い人
- 肩書きは完全には一致しないものの、関心を示すシグナルが強い人
- 競合他社の顧客である人
このラウンドでは、ユーザーが明示していない暗黙の基準を見つけられます。
適格性判定プロンプトの生成と保存
情報の聞き取りが完了したら、回答をすべて構造化された適格性判定プロンプトにまとめます。次回も再利用できるよう、ユーザーの作業ディレクトリ(またはユーザーの希望する場所)に保存します。
qualification-prompts/[campaign-name].md
保存するプロンプトは、必ず以下の構成に従ってください。
# Qualification Prompt: [Campaign Name]
Generated: [date]
## Campaign Context
- **Product:** [one-liner]
- **Campaign Angle:** [specific angle]
- **Problem Solved:** [what and for whom]
## Hard Disqualifiers (Instant No)
- [list each with explanation]
## Hard Qualifiers (Instant Yes)
- [list each with explanation]
## Company Criteria
| Criterion | Qualified | Disqualified | Notes |
|-----------|-----------|--------------|-------|
| Size | [range] | [range] | |
| Industry | [list] | [list] | |
| Geography | [list] | [list] | |
| Stage | [list] | [list] | |
| Funding/Revenue | [range] | [range] | |
## Person Criteria
| Criterion | Qualified | Disqualified | Notes |
|-----------|-----------|--------------|-------|
| Titles | [list] | [list] | |
| Seniority | [level+] | [below level] | |
| Department | [list] | [list] | |
| Tenure | [minimum] | [below minimum] | |
| Experience | [range] | [range] | |
## Behavioral & Situational Signals
- [list signals that boost qualification]
- [list signals that reduce qualification]
## Confidence Rules
- **High Confidence:** Enough data available for company size, title, tenure, and at least one signal.
- **Medium Confidence:** Missing one or two non-critical data points but core criteria are clear.
- **Low Confidence:** Missing critical data points (e.g., no company size, unclear title). Still make a yes/no call but flag it.
## Edge Case Guidance
- [specific guidance derived from Round 3 scenarios]
- [any nuanced rules from the intake conversation]
## Qualification Reasoning Instructions
When evaluating a lead, structure your reasoning as:
1. Check hard disqualifiers first — if any match, immediately disqualify.
2. Check hard qualifiers — if any match, lean strongly toward qualifying.
3. Evaluate company criteria against thresholds.
4. Evaluate person criteria against thresholds.
5. Factor in behavioral/situational signals as tiebreakers.
6. Assign confidence based on data completeness.
7. Write 2-3 sentence reasoning summarizing the decision.
短い例(形式を示すための架空の会社):
# Qualification Prompt: Acme Payroll — Seed-Stage Founders
## Campaign Context
- **Product:** Payroll software for small startups
- **Campaign Angle:** Founders who just raised a seed round and are making their first hires
## Hard Disqualifiers (Instant No)
- Agencies and consultancies (they resell, they don't buy)
- Companies with more than 200 employees
## Hard Qualifiers (Instant Yes)
- Founder or CEO at a US startup that raised a seed round in the last 6 months
## Person Criteria
| Criterion | Qualified | Disqualified | Notes |
|-----------|-----------|--------------|-------|
| Titles | Founder, CEO, COO, Head of People | Engineer (IC), Intern | A founder qualifies in any department |
フェーズ 2:リードの適格性判定
ステップ 1 — 入力の解析
次のいずれかの形式の入力を受け付けます。
- CSV ファイルパス — ファイルシステムから直接読み込みます(デフォルト)
- LinkedIn のプロフィール URL — メッセージ内に 1 つ以上の URL が提示されます
- インラインリスト — メッセージ内に名前や会社が記載されます
- Google Sheet の URL — ユーザーが Google Sheet を提示した場合、利用可能な Google Sheets ツールを使って読み込みます
- その他のソース — CSV としてエクスポートするか、データを貼り付けるようユーザーに依頼します
ユーザーが提示した内容に基づいて、形式を自動的に判別します。
ステップ 1.5 — Apify による一括エンリッチメント
実行条件: 入力に linkedin_url 列が含まれている場合(または LinkedIn URL が利用可能な場合)。
スキップ条件: LinkedIn URL がない場合、またはユーザーがエンリッチメントを明示的にスキップするよう指示した場合。
LLM による適格性判定の前に、すべてのリードを一括エンリッチメントし、構造化されたプロフィールデータを収集します。適格性判定中にリードごとにウェブ検索を行うよりも、はるかに高速で低コストです。
エンリッチメントスクリプトを実行します:
python3 scripts/enrich_leads.py INPUT_CSV \
--output ENRICHED_CSV \
--cache-hours 24
このスキルのフォルダーから実行してください。GOOSEWORKS_API_KEY が設定されている場合は GooseWorks Apify プロキシ経由でユーザーの GooseWorks クレジットを使用して実行され、設定されていない場合に限り、ユーザー自身の APIFY_API_TOKEN がフォールバックとして使われます。Apify トークンをユーザーに求めてはいけません。
これは有料の実行であり、実行終了時に実際の実行分が請求されます。事前の料金見積もりはありません。まず --dry-run を実行してください。これは何も呼び出さずに、実際に実行した場合にスクレイピングされるプロフィールの件数を(キャッシュ適用後に)数えます。その件数と、ユーザーの GooseWorks クレジットから料金が差し引かれることをユーザーに伝え、承諾を得てから実行してください。
この処理の内容:
- 入力 CSV からすべての LinkedIn URL を読み込みます
- ローカルキャッシュ(デフォルトで 24 時間)を確認し、すでにエンリッチメント済みのプロフィールはスキップします
- キャッシュにない URL を 50 件ずつ Apify に送信します
- 次の項目を含むエンリッチメント済み CSV を返します:
enriched_title、enriched_company、enriched_industry、enriched_location、enriched_connections、enriched_education、enriched_experience_years、enriched_headline、enriched_about、enrichment_status - 実際の実行分を GooseWorks クレジットから請求します。キャッシュ済みプロフィールは無料です
エンリッチメント後は、ステップ 2~4 の入力にエンリッチメント済み CSV を使用してください。 エンリッチメント済みデータを使うと、LLM による適格性判定ではウェブ検索ではなく構造化フィールドを参照できるため、速度と一貫性が大幅に向上します。
一部のプロフィールでエンリッチメントに失敗した場合: 出力では enrichment_status: failed となります。LLM による適格性判定では、それらのリードに限りウェブ検索に切り替えてください。
Step 2 — キャリブレーションバッチ
全件を処理する前に、最初の5~10件のリードを実行し、結果を表にしてユーザーに提示します。
バッチのエンリッチメントを実行している場合(Step 1.5)、エンリッチされた列(enriched_title、enriched_company など)を主なデータソースとして使用します。enrichment_status が failed または no_url のリードについてのみ、ウェブ検索で補完します。
| # | Name | Title | Company | Qualified | Confidence | Reasoning |
|---|------|-------|---------|-----------|------------|-----------|
| 1 | ... | ... | ... | Yes | High | ... |
| 2 | ... | ... | ... | No | Medium | ... |
| ... |
次のように尋ねます:「こちらで問題ありませんか?全件を処理する前に、基準を調整しますか?」
ユーザーから問題が指摘された場合:
- 変更が必要な内容について話し合います
- 保存済みの適格性判定プロンプトファイルを更新します
- キャリブレーションバッチを再実行します
- 続行する前に、改めて確認します
ユーザーの承認が得られるまで繰り返します。
Step 3 — 全件実行(並列化)
キャリブレーションの承認後、並列サブエージェントを使用して残りのリードをすべて処理します。必ず並列化してください。リードを逐次処理してはいけません。
並列化の手順(必須):
-
バッチ数を計算する:
- 残りのリード数 / 15 = バッチ数(切り上げ)
- 目安:1バッチあたり約15件
- 最低:2バッチ(リストが少数でも、並列処理が機能することを検証するため)
- 最大:同時に10バッチ(コンテキストの過負荷を避けるため)
-
バッチ入力を準備する: 各バッチについて、自己完結型のコンテキストパッケージを作成します:
- 適格性判定プロンプト全文(保存済みまたは指定されたプロンプト)
- リードの行のバッチ(Step 1.5でエンリッチされたデータを含む、すべての列)
- 出力形式の指示:Name、Qualified(Yes/No)、Confidence(High/Medium/Low)、Reasoning(2~3文)
- 次の指示:「
enrichment_status=failedまたはno_urlのリードについては、簡単なウェブ検索を行ってください。検索にかける時間は、1リードにつき30秒以内にしてください。」
-
並列でTaskエージェントを起動する: Taskツールを使用し、複数のツール呼び出しを含む単一のメッセージで、すべてのバッチを同時に起動します:
Task: "Qualify leads batch 1/N" Context: [qualification prompt] + [batch 1 lead rows] Task: "Qualify leads batch 2/N" Context: [qualification prompt] + [batch 2 lead rows] ... (launch ALL at once — do NOT wait for batch 1 before launching batch 2) -
結果を収集して統合する:
- すべてのTaskエージェントが完了するまで待ちます
- すべてのバッチ結果を単一のリストに統合します
- 入力の元の行順を維持します
- バッチに失敗した場合、そのバッチを1回再試行します。再度失敗した場合、そのリードを「qualification_failed」として記録し、処理を続けます。
-
完全性を検証する:
- 件数を確認します:適格 + 不適格 + 失敗 = 入力リードの合計
- リードが欠けている場合は特定して再処理します
リードごとの処理(各バッチエージェント内):
- 入力行に含まれる利用可能なデータをすべて読み取ります(Step 1.5でエンリッチされた列を含む)
- エンリッチされたデータがある場合(
enrichment_status: successまたはcached):enriched_title、enriched_companyなどを使用します - エンリッチされたデータがない場合(
enrichment_status: failedまたはno_url):簡単なウェブ検索を行います(最大30秒) - 適格性判定プロンプトを適用します:
- まず、失格となる必須条件を確認します。いずれかに該当した場合は、直ちに不適格と判定します
- 次に、適格となる必須条件を確認します。いずれかに該当した場合は、適格と判定する方向で強く検討します
- すべての基準を評価します
- 適格(Yes/No)と確信度(High/Medium/Low)を判定します
- 2~3文の理由を記載します
- 結果を返します
Step 4 — 結果を出力する
デフォルト:CSV
- すべての元の列に加えて、次の3列を含むCSVを作成します:
Qualified— Yes / NoConfidence— High / Medium / LowReasoning— 2~3文の説明
- 現在の作業ディレクトリ、またはユーザーが指定した場所に保存します
- ファイルパスをユーザーに伝えます
ユーザーがGoogle Sheetsや別の保存先を希望する場合:
- ツールが利用可能であれば、Google Sheetsに書き込みます
- リクエストがあれば、Notionに書き込みます
- ユーザーが希望する形式でエクスポートします
Step 5 — まとめ
出力が完了したら、まとめを提示します:
## Qualification Results: [Campaign Name]
**Total leads processed:** X
**Qualified:** X (Y%)
**Disqualified:** X (Y%)
**Confidence breakdown:**
- High: X leads
- Medium: X leads
- Low: X leads (may need manual review)
**Top disqualification reasons:**
1. [reason] — X leads
2. [reason] — X leads
3. [reason] — X leads
**Output:** [Google Sheet link or CSV path]
**Qualification prompt saved to:** qualification-prompts/[campaign-name].md
必要なツール
選別エージェントは、次のツールを利用できる必要があります。
- Apify LinkedIn Enrichment — 選別前にプロフィールを一括でエンリッチするための
scripts/enrich_leads.pyharvestapi~linkedin-profile-scraperApify アクターを使用します(Cookie は不要です)GOOSEWORKS_API_KEYを使い、GooseWorks Apify プロキシ経由で GooseWorks クレジットを消費して実行します。ユーザー自身のAPIFY_API_TOKENは予備手段としてのみ使用します- 最初に
--dry-runを実行してプロフィール数を確認し、有料の実行を開始する前にユーザーの承諾を得てください
- Web Search — エンリッチメントデータが少ない、または欠けている場合にリードを調査するため
- Fetch (web page) — LinkedIn のプロフィールや企業ページなどを取得するため
- Read/Write — CSV の入出力と選別プロンプトの保存のため
- Glob/Grep — 既存の選別プロンプトファイルを探すため
- 任意:Google Sheets tools — ユーザーが Google Sheets から読み取る、または Google Sheets に書き込みたい場合
使用例
CSV から全件を取り込み、選別する:
Qualify leads for our outbound campaign. Here's the lead list: leads.csv
→ 保存済みプロンプトがないことをエージェントが検出し、取り込みを開始してプロンプトを作成した後、選別します。
既存のプロンプトを再利用する:
Qualify these leads using @qualification-prompts/seed-founders.md
— lead list: leads.csv
→ エージェントは取り込みを省略し、そのままキャリブレーションと選別に進みます。
LinkedIn のプロフィールを直接選別する:
Using the seed-founders qualification prompt, qualify these people:
- https://linkedin.com/in/person1
- https://linkedin.com/in/person2
- https://linkedin.com/in/person3
結果を確認した後に調整する:
Those results look off — also disqualify anyone at a consulting firm, and lower the
tenure minimum to 3 months for Director+ titles.
→ エージェントは保存済みプロンプトを更新して再実行します。