営業リサーチスキル:プロスペクトリサーチ手法
フリーのプロンプト百科事典 Wikiprompt より
営業リサーチスキル:プロスペクトリサーチ手法 方法論、チェックリスト、シグナルスコアリング、そして企業エンリッチメント、LinkedInパース、見込み顧客の優先順位付けのためのPythonスクリプトを備えた、完全なセールスリサーチスキル。
プロンプト内容保存
🌐
---
name: sales-research
description: このスキルは、営業見込み客の調査方法とベストプラクティスを提供します。
---
# 営業リサーチ
## 概要
このスキルは、営業見込み客の調査方法とベストプラクティスを提供します。企業調査、連絡先プロファイリング、シグナル検出をカバーし、実行可能なインテリジェンスを表面化します。
## 使用方法
company-researcher および contact-researcher サブエージェントは、以下の場合にこのスキルを参照します:
- 新しい見込み客の調査
- 企業情報の検索
- 個別連絡先のプロファイリング
- 購買シグナルの検出
## 調査方法論
### 企業調査チェックリスト
1. **基本プロフィール**
- 会社名、業界、規模(従業員数、売上)
- 本社および主要拠点
- 設立日、成長段階
2. **最近の動向**
- 資金調達の発表(過去12ヶ月)
- M&A 活動
- 経営陣の変更
- 製品ローンチ
3. **テクノロジースタック**
- 既知のテクノロジー(BuiltWith、StackShare)
- ツールに言及する求人情報
- 統合パートナーシップ
4. **シグナル**
- 求人情報(スケーリング = 機会)
- Glassdoor レビュー(ペインポイント)
- ニュースでの言及(コンテキスト)
- ソーシャルメディアでの活動
### 連絡先調査チェックリスト
1. **専門的背景**
- 現在の役職と在任期間
- 以前の会社と役職
- 学歴
2. **影響力の指標**
- 報告構造
- 意思決定権限
- 予算の所有権
3. **エンゲージメントのフック**
- 最近の LinkedIn 投稿
- 公開された記事
- 講演活動
- 共通のつながり
## リソース
- `resources/signal-indicators.md` - 購買シグナルの分類
- `resources/research-checklist.md` - 完全な調査チェックリスト
## スクリプト
- `scripts/company-enricher.py` - 複数のソースから企業データを集約
- `scripts/linkedin-parser.py` - LinkedIn プロフィールデータを構造化
FILE:company-enricher.py
#!/usr/bin/env python3
"""
company-enricher.py - 複数のソースから企業データを集約
入力:
- company_name: 文字列
- domain: 文字列(オプション)
出力:
- profile:
name: 文字列
industry: 文字列
size: 文字列
funding: 文字列
tech_stack: [文字列]
recent_news: [ニュース項目]
依存関係:
- requests、beautifulsoup4
"""
# 要件:requests、beautifulsoup4
import json
from typing import Any
from dataclasses import dataclass, asdict
from datetime import datetime
@dataclass
class NewsItem:
title: str
date: str
source: str
url: str
summary: str
@dataclass
class CompanyProfile:
name: str
domain: str
industry: str
size: str
location: str
founded: str
funding: str
tech_stack: list[str]
recent_news: list[dict]
competitors: list[str]
description: str
def search_company_info(company_name: str, domain: str = None) -> dict:
"""
基本的な企業情報を検索します。
本番環境では、Clearbit、Crunchbase などの API を呼び出します。
"""
# TODO: 実際の API 呼び出しを実装
# プレースホルダーの戻り構造
return {
"name": company_name,
"domain": domain or f"{company_name.lower().replace(' ', '')}.com",
"industry": "Technology", # API から取得される
"size": "Unknown",
"location": "Unknown",
"founded": "Unknown",
"description": f"{company_name} に関する情報"
}
def search_funding_info(company_name: str) -> dict:
"""
資金調達情報を検索します。
本番環境では、Crunchbase、PitchBook などを呼び出します。
"""
# TODO: 実際の API 呼び出しを実装
return {
"total_funding": "Unknown",
"last_round": "Unknown",
"last_round_date": "Unknown",
"investors": []
}
def search_tech_stack(domain: str) -> list[str]:
"""
テクノロジースタックを検出します。
本番環境では、BuiltWith、Wappalyzer などを呼び出します。
"""
# TODO: 実際の API 呼び出しを実装
return []
def search_recent_news(company_name: str, days: int = 90) -> list[dict]:
"""
企業に関する最近のニュースを検索します。
本番環境では、ニュース API を呼び出します。
"""
# TODO: 実際の API 呼び出しを実装
return []
def main(
company_name: str,
domain: str = None
) -> dict[str, Any]:
"""
複数のソースから企業データを集約します。
Args:
company_name: 調査する会社名
domain: 会社のドメイン(オプション、推測されます)
Returns:
業界、規模、資金調達、テクノロジースタック、ニュースを含む企業プロフィールの dict
"""
# 基本的な企業情報を取得
basic_info = search_company_info(company_name, domain)
# 資金調達情報を取得
funding_info = search_funding_info(company_name)
# テクノロジースタックを検出
company_domain = basic_info.get("domain", domain)
tech_stack = search_tech_stack(company_domain) if company_domain else []
# 最近のニュースを取得
news = search_recent_news(company_name)
# プロフィールを編集
profile = CompanyProfile(
name=basic_info["name"],
domain=basic_info["domain"],
industry=basic_info["industry"],
size=basic_info["size"],
location=basic_info["location"],
founded=basic_info["founded"],
funding=funding_info.get("total_funding", "Unknown"),
tech_stack=tech_stack,
recent_news=news,
competitors=[], # 業界分析から補完される
description=basic_info["description"]
)
return {
"profile": asdict(profile),
"funding_details": funding_info,
"enriched_at": datetime.now().isoformat(),
"sources_checked": ["company_info", "funding", "tech_stack", "news"]
}
if __name__ == "__main__":
import sys
# 使用例
result = main(
company_name="DataFlow Systems",
domain="dataflow.io"
)
print(json.dumps(result, indent=2))
FILE:linkedin-parser.py
#!/usr/bin/env python3
"""
linkedin-parser.py - LinkedIn プロフィールデータを構造化
入力:
- profile_url: 文字列
- または name + company: 文字列
出力:
- contact:
name: 文字列
title: 文字列
tenure: 文字列
previous_roles: [役職オブジェクト]
mutual_connections: [文字列]
recent_activity: [投稿概要]
依存関係:
- requests
"""
# 要件:requests
import json
from typing import Any
from dataclasses import dataclass, asdict
from datetime import datetime
@dataclass
class PreviousRole:
title: str
company: str
duration: str
description: str
@dataclass
class RecentPost:
date: str
content_preview: str
engagement: int
topic: str
@dataclass
class ContactProfile:
name: str
title: str
company: str
location: str
tenure: str
previous_roles: list[dict]
education: list[str]
mutual_connections: list[str]
recent_activity: list[dict]
profile_url: str
headline: str
def search_linkedin_profile(name: str = None, company: str = None, profile_url: str = None) -> dict:
"""
LinkedIn プロフィール情報を検索します。
本番環境では、LinkedIn API または Sales Navigator を使用します。
"""
# TODO: 実際の LinkedIn API 統合を実装
# 注:LinkedIn の API には厳格な利用規約があります
return {
"found": False,
"name": name or "Unknown",
"title": "Unknown",
"company": company or "Unknown",
"location": "Unknown",
"headline": "",
"tenure": "Unknown",
"profile_url": profile_url or ""
}
def get_career_history(profile_data: dict) -> list[dict]:
"""
プロフィールからキャリア履歴を抽出します。
"""
# TODO: キャリア抽出を実装
return []
def get_mutual_connections(profile_data: dict, user_network: list = None) -> list[str]:
"""
共通のつながりを見つけます。
"""
# TODO: 共通のつながり検出を実装
return []
def get_recent_activity(profile_data: dict, days: int = 30) -> list[dict]:
"""
最近の投稿と活動を取得します。
"""
# TODO: 活動抽出を実装
return []
def main(
name: str = None,
company: str = None,
profile_url: str = None
) -> dict[str, Any]:
"""
営業準備のために LinkedIn プロフィールデータを構造化します。
Args:
name: 人物の名前
company: 勤務先の会社
profile_url: LinkedIn プロフィールの直接 URL
Returns:
構造化された連絡先プロフィールの dict
"""
if not profile_url and not (name and company):
return {"error": "profile_url または name + company のいずれかを指定してください"}
# プロフィールを検索
profile_data = search_linkedin_profile(
name=name,
company=company,
profile_url=profile_url
)
if not profile_data.get("found"):
return {
"found": False,
"name": name or "Unknown",
"company": company or "Unknown",
"message": "プロフィールが見つからないか、アクセスが制限されています",
"suggestions": [
"LinkedIn で直接検索してみてください",
"別のスペルを確認してください",
"その人物がまだこの会社に勤めているか確認してください"
]
}
# キャリア履歴を取得
previous_roles = get_career_history(profile_data)
# 共通のつながりを見つける
mutual_connections = get_mutual_connections(profile_data)
# 最近の活動を取得
recent_activity = get_recent_activity(profile_data)
# 連絡先プロフィールを編集
contact = ContactProfile(
name=profile_data["name"],
title=profile_data["title"],
company=profile_data["company"],
location=profile_data["location"],
tenure=profile_data["tenure"],
previous_roles=previous_roles,
education=[], # プロフィールから抽出される
mutual_connections=mutual_connections,
recent_activity=recent_activity,
profile_url=profile_data["profile_url"],
headline=profile_data["headline"]
)
return {
"found": True,
"contact": asdict(contact),
"research_date": datetime.now().isoformat(),
"data_completeness": calculate_completeness(contact)
}
def calculate_completeness(contact: ContactProfile) -> dict:
"""プロフィールデータの完全性を計算します。"""
fields = {
"basic_info": bool(contact.name and contact.title and contact.company),
"career_history": len(contact.previous_roles) > 0,
"mutual_connections": len(contact.mutual_connections) > 0,
"recent_activity": len(contact.recent_activity) > 0,
"education": len(contact.education) > 0
}
complete_count = sum(fields.values())
return {
"fields": fields,
"score": f"{complete_count}/{len(fields)}",
"percentage": int((complete_count / len(fields)) * 100)
}
if __name__ == "__main__":
import sys
# 使用例
result = main(
name="Sarah Chen",
company="DataFlow Systems"
)
print(json.dumps(result, indent=2))
FILE:priority-scorer.py
#!/usr/bin/env python3
"""
priority-scorer.py - 見込み客の優先度を計算しランク付け
入力:
- prospects: [シグナルを持つ見込み客オブジェクト]
- weights: {deal_size, timing, warmth, signals}
出力:
- ranked: [スコアと理由を持つ見込み客]
依存関係:
- (なし - 純粋な Python)
"""
import json
from typing import Any
from dataclasses import dataclass
# デフォルトのスコアリング重み
DEFAULT_WEIGHTS = {
"deal_size": 0.25,
"timing": 0.30,
"warmth": 0.20,
"signals": 0.25
}
# シグナルスコアマッピング
SIGNAL_SCORES = {
# 高意図シグナル
"recent_funding": 10,
"leadership_change": 8,
"job_postings_relevant": 9,
"expansion_news": 7,
"competitor_mention": 6,
# 中意図シグナル
"general_hiring": 4,
"industry_event": 3,
"content_engagement": 3,
# 関係シグナル
"mutual_connection": 5,
"previous_contact": 6,
"referred_lead": 8,
# ネガティブシグナル
"recent_layoffs": -3,
"budget_freeze_mentioned": -5,
"competitor_selected": -7,
}
@dataclass
class ScoredProspect:
company: str
contact: str
call_time: str
raw_score: float
normalized_score: int
priority_rank: int
score_breakdown: dict
reasoning: str
is_followup: bool
def score_deal_size(prospect: dict) -> tuple[float, str]:
"""推定取引規模に基づいてスコアリングします。"""
size_indicators = prospect.get("size_indicators", {})
employee_count = size_indicators.get("employees", 0)
revenue_estimate = size_indicators.get("revenue", 0)
# 企業規模に基づく簡単なスコアリング
if employee_count > 1000 or revenue_estimate > 100_000_000:
return 10.0, "エンタープライズ規模の機会"
elif employee_count > 200 or revenue_estimate > 20_000_000:
return 7.0, "ミッドマーケットの機会"
elif employee_count > 50:
return 5.0, "SMB の機会"
else:
return 3.0, "小規模ビジネス"
def score_timing(prospect: dict) -> tuple[float, str]:
"""タイミングシグナルに基づいてスコアリングします。"""
timing_signals = prospect.get("timing_signals", [])
score = 5.0 # 基本スコア
reasons = []
for signal in timing_signals:
if signal == "budget_cycle_q4":
score += 3
reasons.append("Q4 予算計画")
elif signal == "contract_expiring":
score += 4
reasons.append("契約が間もなく期限切れ")
elif signal == "active_evaluation":
score += 5
reasons.append("積極的に評価中")
elif signal == "just_funded":
score += 3
reasons.append("最近資金調達完了")
return min(score, 10.0), "; ".join(reasons) if reasons else "標準的なタイミング"
def score_warmth(prospect: dict) -> tuple[float, str]:
"""関係の温かさに基づいてスコアリングします。"""
relationship = prospect.get("relationship", {})
if relationship.get("is_followup"):
last_outcome = relationship.get("last_outcome", "neutral")
if last_outcome == "positive":
return 9.0, "温かいフォローアップ(前回の連絡は良好)"
elif last_outcome == "neutral":
return 7.0, "フォローアップ(前回の連絡は中立)"
else:
return 5.0, "フォローアップ(再エンゲージメントが必要)"
if relationship.get("referred"):
return 8.0, "紹介リード"
if relationship.get("mutual_connections", 0) > 0:
return 6.0, f"共通のつながり {relationship['mutual_connections']} 人"
if relationship.get("inbound"):
return 7.0, "インバウンドの関心"
return 4.0, "コールドアウトリーチ"
def score_signals(prospect: dict) -> tuple[float, str]:
"""検出された購買シグナルに基づいてスコアリングします。"""
signals = prospect.get("signals", [])
total_score = 0
signal_reasons = []
for signal in signals:
signal_score = SIGNAL_SCORES.get(signal, 0)
total_score += signal_score
if signal_score > 0:
signal_reasons.append(signal.replace("_", " "))
# 0-10 スケールに正規化
normalized = min(max(total_score / 2, 0), 10)
reason = f"シグナル: {', '.join(signal_reasons)}" if signal_reasons else "強いシグナルなし"
return normalized, reason
def calculate_priority_score(
prospect: dict,
weights: dict = None
) -> ScoredProspect:
"""見込み客の全体的な優先度スコアを計算します。"""
weights = weights or DEFAULT_WEIGHTS
# コンポーネントスコアを計算
deal_score, deal_reason = score_deal_size(prospect)
timing_score, timing_reason = score_timing(prospect)
warmth_score, warmth_reason = score_warmth(prospect)
signal_score, signal_reason = score_signals(prospect)
# 加重合計
raw_score = (
deal_score * weights["deal_size"] +
timing_score * weights["timing"] +
warmth_score * weights["warmth"] +
signal_score * weights["signals"]
)
# 理由を編集
reasons = []
if timing_score >= 8:
reasons.append(timing_reason)
if signal_score >= 7:
reasons.append(signal_reason)
if warmth_score >= 7:
reasons.append(warmth_reason)
if deal_score >= 8:
reasons.append(deal_reason)
return ScoredProspect(
company=prospect.get("company", "Unknown"),
contact=prospect.get("contact", "Unknown"),
call_time=prospect.get("call_time", "Unknown"),
raw_score=round(raw_score, 2),
normalized_score=int(raw_score * 10),
priority_rank=0, # ソート後に設定される
score_breakdown={
"deal_size": {"score": deal_score, "reason": deal_reason},
"timing": {"score": timing_score, "reason": timing_reason},
"warmth": {"score": warmth_score, "reason": warmth_reason},
"signals": {"score": signal_score, "reason": signal_reason}
},
reasoning="; ".join(reasons) if reasons else "標準的な優先度",
is_followup=prospect.get("relationship", {}).get("is_followup", False)
)
def main(
prospects: list[dict],
weights: dict = None
) -> dict[str, Any]:
"""
見込み客の優先度を計算しランク付けします。
Args:
prospects: シグナルを持つ見込み客オブジェクトのリスト
weights: スコアリングコンポーネントのオプションのカスタム重み
Returns:
ランク付けされた見込み客とスコアリング詳細の dict
"""
weights = weights or DEFAULT_WEIGHTS
# すべての見込み客をスコアリング
scored = [calculate_priority_score(p, weights) for p in prospects]
# 生スコアの降順でソート
scored.sort(key=lambda x: x.raw_score, reverse=True)
# ランクを割り当て
for i, prospect in enumerate(scored, 1):
prospect.priority_rank = i
# JSON シリアライゼーション用に dict に変換
ranked = []
for s in scored:
ranked.append({
"company": s.company,
"contact": s.contact,
"call_time": s.call_time,
"priority_rank": s.priority_rank,
"score": s.normalized_score,
"reasoning": s.reasoning,
"is_followup": s.is_followup,
"breakdown": s.score_breakdown
})
return {
"ranked": ranked,
"weights_used": weights,
"total_prospects": len(prospects)
}
if __name__ == "__main__":
import sys
# 使用例
example_prospects = [
{
"company": "DataFlow Systems",
"contact": "Sarah Chen",
"call_time": "2pm",
"size_indicators": {"employees": 200, "revenue": 25_000_000},
"timing_signals": ["just_funded", "active_evaluation"],
"signals": ["recent_funding", "job_postings_relevant"],
"relationship": {"is_followup": False, "mutual_connections": 2}
},
{
"company": "Acme Manufacturing",
"contact": "Tom Bradley",
"call_time": "10am",
"size_indicators": {"employees": 500},
"timing_signals": ["contract_expiring"],
"signals": [],
"relationship": {"is_followup": True, "last_outcome": "neutral"}
},
{
"company": "FirstRate Financial",
"contact": "Linda Thompson",
"call_time": "4pm",
"size_indicators": {"employees": 300},
"timing_signals": [],
"signals": [],
"relationship": {"is_followup": False}
}
]
result = main(prospects=example_prospects)
print(json.dumps(result, indent=2))
FILE:research-checklist.md
# 見込み客調査チェックリスト
## 企業調査
### 基本情報
- [ ] 会社名(スペルを確認)
- [ ] 業界/垂直分野
- [ ] 本社所在地
- [ ] 従業員数(LinkedIn、ウェブサイト)
- [ ] 売上推定(利用可能な場合)
- [ ] 設立日
- [ ] 資金調達段階/履歴
### 最近のニュース(過去90日間)
- [ ] 資金調達の発表
- [ ] 買収または合併
- [ ] 経営陣の変更
- [ ] 製品ローンチ
- [ ] 主要顧客の獲得
- [ ] プレスでの言及
- [ ] 業績/財務ニュース
### デジタルフットプリント
- [ ] ウェブサイトのレビュー
- [ ] ブログ/コンテンツのトピック
- [ ] ソーシャルメディアでの存在感
- [ ] 求人情報(キャリアページ + LinkedIn)
- [ ] テクノロジースタック(BuiltWith、求人情報)
### 競争環境
- [ ] 既知の競合他社
- [ ] 市場での位置
- [ ] 主張する差別化要因
- [ ] 最近の競争上の動き
### ペインポイントの指標
- [ ] Glassdoor レビュー(テーマ)
- [ ] G2/Capterra レビュー(B2B の場合)
- [ ] ソーシャルメディアでの苦情
- [ ] 求人情報のパターン
## 連絡先調査
### 専門的プロフィール
- [ ] 現在の役職
- [ ] 役職での在任期間
- [ ] 会社での在任期間
- [ ] 以前の会社
- [ ] 以前の役職
- [ ] 学歴
### 意思決定権限
- [ ] 誰に報告するか
- [ ] チーム規模(マネージャーの場合)
- [ ] 予算権限(推測)
- [ ] 購買関与の履歴
### エンゲージメントのフック
- [ ] 最近の LinkedIn 投稿
- [ ] 公開された記事
- [ ] ポッドキャスト出演
- [ ] カンファレンスでの講演
- [ ] 共通のつながり
- [ ] 共通の興味/グループ
### コミュニケーションスタイル
- [ ] 投稿のトーン(フォーマル/カジュアル)
- [ ] エンゲージするトピック
- [ ] 応答パターン
## CRM チェック(利用可能な場合)
- [ ] 以前のタッチポイント
- [ ] 以前の機会
- [ ] 会社の関連連絡先
- [ ] 同僚からのメモ
- [ ] メールエンゲージメント履歴
## 時間ベースの調査深度
| 利用可能な時間 | 調査深度 |
|----------------|----------------|
| 5分 | 企業の基本情報 + 連絡先の役職のみ |
| 15分 | + 最近のニュース + LinkedIn プロフィール |
| 30分 | + ペインポイントシグナル + エンゲージメントフック |
| 60分 | 完全なチェックリスト + 競合分析 |
FILE:signal-indicators.md
# シグナル指標リファレンス
## 高意図シグナル
### 求人情報
- **関連する役職が3件以上掲載** = 積極的なイニシアチブ、予算が割り当てられている
- **あなたの領域でのシニア採用** = 戦略的優先事項
- **緊急性のある表現(「ASAP」、「即時」)** = 痛みが深刻
- **特定のツールへの言及** = 競合他社またはカテゴリーへの認識
### 財務イベント
- **シリーズ B 以降の資金調達** = 成長資金、購買力
- **IPO 準備** = 運用の成熟度が必要
- **買収の発表** = 統合の課題が迫っている
- **売上マイルストーンの PR** = 予算が利用可能
### 経営陣の変更
- **あなたの領域での新しい CXO** = 90日間の優先事項設定
- **新しい CRO/CMO** = テクノロジースタックの評価が可能性が高い
- **創業者から CEO への移行** = 運用のプロフェッショナル化
## 中意図シグナル
### 拡大シグナル
- **新しいオフィスの開設** = インフラストラクチャのニーズ
- **国際展開** = ローカライゼーション、コンプライアンス
- **新製品ローンチ** = スケーリングの課題
- **主要顧客の獲得** = 納品へのプレッシャー
### テクノロジーシグナル
- **RFP の公開** = 積極的な購買プロセス
- **ベンダーレビューの言及** = 比較検討
- **テクノロジースタックの変更** = 統合の機会
- **レガシーシステムへの不満** = 近代化のニーズ
### コンテンツシグナル
- **あなたのトピックに関するブログ投稿** = 自己学習
- **ウェビナーへの参加** = 関心が確認された
- **ホワイトペーパーのダウンロード** = 問題への認識
- **カンファレンスでの講演** = ソートリーダーシップ、可視性
## 低意図シグナル(ナーチャリング)
### 一般的な活動
- **業界イベントへの参加** = 市場参加者
- **一般的な採用** = 会社が成長中
- **ポジティブなプレス** = 健全な会社
- **ソーシャルメディアでの活動** = 関与するリーダーシップ
## シグナルスコアリング
| シグナルタイプ | スコア | アクション |
|-------------|-------|--------|
| 求人情報(関連) | +3 | アウトリーチを優先 |
| 最近の資金調達 | +3 | 会話で言及 |
| 経営陣の変更 | +2 | 時間に敏感な機会 |
| 拡大ニュース | +2 | 成長アングル |
| ネガティブレビュー | +2 | ペインポイントアングル |
| コンテンツエンゲージメント | +1 | ナーチャートラック |
| シグナルなし | 0 | 発見に焦点 |
ログインして完全なプロンプトを表示
次で続行:
ログインすると、次に同意したことになります: 利用規約 と プライバシーポリシー
使い方
このプロンプトは business 向けに設計されています。上の内容をコピーして、お好みの AI ツールに貼り付けてください。
最良の結果を得るには、プレースホルダー(角括弧や大文字で示された部分)を具体的な要件に置き換えてください。
ノート
0 件のコメント