アウトリーチシーケンスビルダー
購買シグナルを受け取ります。パーソナライズされたマルチチャネル・アウトリーチシーケンスを生成します。Eメール、LinkedIn、電話で送信可能なメッセージを出力します。
重要なルール: すべてのメッセージは、読み込んだコンテキストから完全に埋めなければなりません。変数として {{first_name}} のみ使用可能です。[Company Name] のような角括弧や [INSERT PAIN POINT] のようなプレースホルダーは禁止です。情報が不足している場合は、作成前にユーザーに質問してください。未入力のプレースホルダーがあるメッセージを絶対に送信しないでください。
ステップ 1: セットアップチェック
必要な環境変数を確認します:
echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+set}"
echo "COMPOSIO_API_KEY: ${COMPOSIO_API_KEY:-not set, Gmail drafting will be skipped}"
GEMINI_API_KEY がない場合: 停止します。ユーザーに次のように伝えます:「GEMINI_API_KEY が必要です。aistudio.google.com から取得し、.env ファイルに追加してください。」
COMPOSIO_API_KEY がない場合: 続行します。シーケンスはコピー&ペースト用のフォーマットされたテキストとして出力されます。Gmail 下書きの作成はスキップされます。
ステップ 2: コンテキストの読み込み
既存の ICP ファイルとアカウントファイルを確認します:
ls docs/icp.md 2>/dev/null && echo "icp found" || echo "icp missing"
ls docs/accounts/ 2>/dev/null && echo "accounts found" || echo "accounts missing"
docs/icp.md が存在する場合: 読み取り、以下を抽出します:
- ターゲットペルソナ(役職、役職レベル、部門)
- 企業プロフィール(規模、業界、資金調達ステージ)
- コアとなるペインポイント(バイヤーの言葉をそのまま使用)
- 主な差別化要因(競合ではなく自社製品を選ぶ理由)
docs/accounts/{company}.md が存在する場合: 該当ファイルを読み取り、以下を抽出します:
- 会社名、規模、最近の状況
- 既知のテクノロジースタックやペインポイント
- 既存の関係や過去のコンタクト
どちらも存在しない場合: ユーザーに以下の4つの質問をします。4つすべてが回答されるまで進めません:
- あなたの製品は何をしますか?(1~2文)
- 誰をターゲットにしていますか?(役職、企業規模、業界)
- あなたが解決する主な問題は何ですか?(バイヤーの視点から、あなたの視点ではなく)
- あなたの主な差別化要因は何ですか?(彼らが現在使用している代替品ではなく、あなたを選ぶ理由)
ステップ 3: シグナルの特定
7つのシグナルタイプのうちどれが該当するかを判断します。各シグナルタイプの完全なインサイト、ブリッジ、オープナー、アスクについては、references/signal-playbook.md を参照してください。
7つのシグナルタイプ:
| シグナル | 定義 |
|---|---|
| 資金調達後 | 企業が過去30日以内に資金調達ラウンドを実施した |
| 採用シグナル | 企業が自社がサービスを提供する機能において5つ以上のポジションを募集している |
| 競合からの移行 | コンタクトが競合を使用しており、不満を示している |
| 製品発表 | 企業が新製品または主要機能を発表した |
| コンテンツエンゲージメント | コンタクトが自社のコンテンツに「いいね!」、コメント、またはシェアした |
| イベントフォローアップ | カンファレンスやウェビナーで会った、または同じセッションに参加した |
| 転職 | コンタクトが過去60日以内に新しい会社に転職した |
ユーザーがプロンプトでシグナルを提供した場合: タイプを確認し、具体的な詳細(ラウンド規模、役職名、製品名、イベント名など)を抽出します。
シグナルが不明な場合: 質問します:「このアウトリーチのきっかけは何ですか?(例:資金調達ラウンドを実施した、エンジニアを採用している、イベントで会った)」
先に進む前に、検出されたシグナルタイプと具体的な詳細を明記します。
ステップ 4: アングルの開発
ステップ2~3で読み込んだシグナルタイプとコンテキストを使用して、4つのアングル要素を定義します。このシグナルタイプの公式については、references/signal-playbook.md を参照してください。
メッセージを生成する前に、明示的に書き出します:
シグナル:[具体的なシグナル+具体的な詳細]
インサイト:[このシグナルが彼らの状況について明らかにすること]
ブリッジ:[あなたの製品がシグナルが明らかにしたことにどのように関連するか]
オープナー:[具体的なシグナルの詳細に言及する一文]
アスク:[最小限の実行可能なCTA、10語未満]
オープナーは具体的なトリガーを明記しなければなりません。曖昧なオープナーは却下されます。
良い例:「1800万ドルのシリーズB、おめでとうございます — 営業チームを急速に拡大すると、通常オンボーディングのギャップが生じます。」 悪い例:「御社が最近資金調達をしたのを見ました。」
ステップ 5: チャネルシーケンスの計画
Eメール、LinkedIn、電話にわたる4~6のタッチポイントを設計します。ルール:
- 合計期間:10~14日
- 最小間隔:任意の2つのタッチの間に2日以上
- 同じチャネルを連続して使用しない
- 各フォローアップは新しい価値を追加する必要がある(新しいリソース、新しいアングル、新しい証明ポイント)。「フォローアップだけ」は禁止。
- 最後のタッチポイントは短いブレイクアップメッセージ
ほとんどのシグナルのデフォルトのケイデンス:
1日目:Eメール(最初のタッチ、シグナル主導のオープナー)
3日目:LinkedIn(コネクションノートまたはショートDM)
7日目:Eメール(新しいアングルまたはケーススタディ)
9日目:電話(トーク台本+ボイスメールスクリプト)
12日目:Eメール(別のフレーミングまたは反論への対応)
14日目:Eメール(短いブレイクアップメッセージ)
シグナルタイプに応じて調整:
- 資金調達後:より迅速に(1、2、4、7、10日目)。発表から48時間以内に行動。
- イベントフォローアップ:EメールではなくLinkedInから開始(より温かいチャネルを先に)
- コンテンツエンゲージメント:Eメールの前にLinkedInの返信またはコメントから開始
メッセージを作成する前に、各タッチポイントの計画された日とチャネルを明記します。
ステップ 6: シーケンスの生成
references/sequence-format.md をすべて読みます。references/output-template.md を読み、このシグナルタイプのテンプレートを選択します。
Geminiリクエストを一時ファイルに書き込みます:
cat > /tmp/outreach-sequence-request.json << 'ENDJSON'
{
"system_instruction": {
"parts": [{
"text": "あなたは返信を得るコールドアウトリーチを書くB2B営業コピーライターです。ルール:すべてのメッセージの最初の文は、自社ではなく相手についてです。最初のメッセージでは、具体的な購買シグナルを名前と詳細で参照します。自然に短縮形を使用します。短い文。企業の専門用語は禁止。禁止語:シナジー、レバレッジ、タッチベース、サークルバック、ピング、ループイン、アラインメント、革新的、最先端、ベストインクラス、ワールドクラス、ゲームチェンジング、ディスラプティブ、バンドウィズ、ディープダイブ、ローリングフルーツ、ムーブザニードル。挨拶は不要:「このメールがご都合よければ幸いです」「良い月曜日を」「ただ〜したかっただけ」は禁止。各フォローアップは新しい価値を追加 — 「フォローアップだけ」は絶対に禁止。厳格な制限:Eメール本文は100語未満、LinkedInメモは300文字未満、電話オープナーは20語未満。変数として {{first_name}} のみ許可 — 他のすべての詳細は提供されたコンテキストから埋めてください。ブレイクアップメッセージは短く(3〜4文)、フレンドリーで、ドアを開けたままにします。"
}]
},
"contents": [{
"parts": [{
"text": "HERE_CONTEXT_AND_INSTRUCTIONS"
}]
}],
"generationConfig": {
"temperature": 0.7,
"maxOutputTokens": 4096
}
}
ENDJSON
curl -s -X POST \
"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d @/tmp/outreach-sequence-request.json \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"
HERE_CONTEXT_AND_INSTRUCTIONS を次の内容に置き換えます:
- ステップ2の製品説明、ターゲットペルソナ、ペインポイント、差別化要因
- ステップ4のシグナルタイプ、具体的な詳細、4つのアングル要素
- ステップ5のチャネル計画
- 各タッチポイントを、件名(Eメール)、文字数(LinkedIn)、トーク台本(電話)とともに記述する指示
各Eメールタッチポイントに対して、2つの件名バリエーション(A/Bテスト)を要求します。
ステップ 7: 反論のマッピング
シーケンス生成後、このシグナルタイプで最も可能性の高い2~4の反論を特定します。それぞれの反論を、既存のタッチポイント内に自然に先取りして組み込みます。反論処理専用のメッセージを追加しないでください。先取りをシーケンスに織り込みます。
references/sequence-format.md の反論プレイブックを読みます。各反論をどのタッチポイントで処理するかをマッピングします。
先取りする4つの標準的な反論:
| 反論 | 先取りアプローチ |
|---|---|
| 「すでにソリューションを持っている」 | 現在のツールを認め、自社を補完的、または次のステップとして位置づける |
| 「今はタイミングが良くない」 | シグナルを、今が適切なタイミングである理由に直接結びつける |
| 「高すぎる」 | ROIをフレーミングし、彼らが気にする数字にアンカーする |
| 「もっと多くの人を巻き込む必要がある」 | 共有可能なリソース(ワンページャー、録画デモ)を提供する |
最終シーケンスを提示する前に、各反論をどのタッチポイントで処理するかを明記します。
ステップ 8: セルフQA
すべてのチェックを実行し、違反があれば修正してから提示します:
- すべてのメッセージは相手についての文から始まる
- 具体的なシグナルの詳細が少なくとも最初のタッチポイントで言及されている
-
{{first_name}}以外の未入力のプレースホルダーがない - Eメール本文は100語未満(それぞれの語数をカウントして明記)
- LinkedInメモは300文字未満(それぞれの文字数をカウントして明記)
- 電話オープナーは20語未満
- どのメッセージにも禁止語がない
- どのフォローアップにも「フォローアップだけ」がない
- 各フォローアップは新しいアングルまたは価値を追加する
- 同じチャネルが連続して使用されていない
- シーケンス全体で少なくとも2つの反論が先取りされている
- ブレイクアップメッセージは3〜4文、フレンドリーで、罪悪感を与えない
提示前に違反を修正します。
ステップ 9: 出力と保存
完全なシーケンスをコードブロックで提示します。
ファイルに保存:
mkdir -p docs/sequences
cat > docs/sequences/SIGNAL-TYPE.md << 'EOF'
SEQUENCE_CONTENT_HERE
EOF
echo "Sequence saved to docs/sequences/SIGNAL-TYPE.md"
COMPOSIO_API_KEY が設定されている場合: 確認します:「Composio経由でGmailにEメールのタッチポイントを下書きしますか?」
確認後、各Eメールタッチポイントに対して:
# エージェントは GMAIL_CREATE_EMAIL_DRAFT Composio アクションを呼び出す
# 件名 = [件名]、本文 = [Eメール本文]、宛先 = [連絡先Eメール(既知の場合)]
下書き作成後:「GmailにEメール下書きが作成されました。下書きフォルダを確認してください。」
LinkedInメモ: 各タッチポイントに明確なラベルを付けて、個別のコピー&ペーストブロックとして提示します。LinkedInはプログラムによるメッセージ送信をサポートしていません。
電話スクリプト: 厳格なスクリプトではなく、箇条書きのフォーマットされたトーク台本として提示します。