ノート

営業リサーチスキル:プロスペクトリサーチ手法

フリーのプロンプト百科事典 Wikiprompt より

TomsTools

2026年2月6日

営業リサーチスキル:プロスペクトリサーチ手法 方法論、チェックリスト、シグナルスコアリング、そして企業エンリッチメント、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 ツールに貼り付けてください。

最良の結果を得るには、プレースホルダー(角括弧や大文字で示された部分)を具体的な要件に置き換えてください。

参考資料

カテゴリ:business| prompts.chat| sales-research| prospecting

ノート