外联序列生成器
接收一个购买信号。生成一个个性化的多渠道外联序列。输出可在邮件、LinkedIn 和电话中直接发送的消息。
关键规则: 每条消息必须根据你加载的上下文完整填写内容。只允许使用 {{first_name}} 作为变量。不允许出现 [公司名称] 这样的方括号,或 [插入痛点] 这样的占位符。如果你没有所需的信息来填充,请在撰写之前询问用户。切勿发送包含未填充占位符的消息。
步骤 1:环境检查
确认所需的环境变量:
echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+set}"
echo "COMPOSIO_API_KEY: ${COMPOSIO_API_KEY:-未设置,将跳过 Gmail 起草}"
如果缺失 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" || echo "未找到 ICP"
ls docs/accounts/ 2>/dev/null && echo "已找到账户" || echo "未找到账户"
如果 docs/icp.md 存在: 读取它。提取:
- 目标人物画像(职位、资历、部门)
- 公司画像(规模、行业、融资阶段)
- 核心痛点(使用买家的原话)
- 关键差异化优势(你的产品相对于替代方案的优势)
如果 docs/accounts/{公司名}.md 存在: 读取相关文件。提取:
- 公司名称、规模、近期背景
- 已知的技术栈或痛点
- 任何现有的关系或过往联系
如果两者都不存在: 向用户询问以下 4 个问题。在全部回答完成前,不要继续:
- 你的产品是做什么的?(一两句话)
- 你的目标人群是哪些?(职位、公司规模、行业)
- 你解决的主要问题是什么?(从买家的角度,而不是你的角度)
- 你的关键差异化优势是什么?(为什么用户应该选择你而不是他们目前使用的替代方案)
步骤 3:识别信号
确定以下 7 种信号类型中的哪一种适用。阅读 references/signal-playbook.md 以获取每种信号类型的完整洞察(Insight)、桥梁(Bridge)、开场白(Opener)和请求(Ask)。
7 种信号类型:
| 信号 | 定义 |
|---|---|
| 融资后 | 公司在过去 30 天内完成了一轮融资 |
| 招聘信号 | 公司在某个你服务的职能领域发布了 5 个或以上职位 |
| 竞品替代 | 联系人正在使用竞争对手产品并表现出不满 |
| 产品发布 | 公司发布了一款新产品或重大功能 |
| 内容互动 | 联系人点赞、评论或分享了你的内容 |
| 活动跟进 | 你在会议或网络研讨会中遇到了联系人,或同场出席了活动 |
| 职位变更 | 联系人在过去 60 天内跳槽到了新公司 |
如果用户在提示中提供了信号: 确认类型,并提取具体细节(融资轮次金额、职位名称、产品名称、活动名称等)。
如果没有明确的信号: 询问:“是什么触发了这次外联?(例如,他们融资了,他们在招聘工程师,你在某个活动上遇到了他们)”
在继续之前,声明检测到的信号类型及具体细节。
步骤 4:制定切入点
根据在步骤 2-3 中加载的信号类型和上下文,定义四个切入点要素。阅读 references/signal-playbook.md 以获取该信号类型的公式。
在生成任何消息之前,明确写出:
信号:[具体信号 + 具体细节]
洞察:[这个信号揭示了他们当前状况的什么信息]
桥梁:[你的产品如何与信号揭示的信息相关联]
开场白:[一句提及具体信号细节的句子]
请求:[最小的可行行动号召,少于 10 个字]
开场白必须提及具体的触发点。模糊的开场白会被拒绝。
好的:“恭喜你们完成 1800 万美元的 B 轮融资——快速扩张销售团队通常会产生入职缺口。” 不好的:“我看到你们公司最近融资了。”
步骤 5:规划渠道序列
设计 4-6 个跨越邮件、LinkedIn 和电话的触达点。规则:
- 总时长:10-14 天
- 任意两个触达点之间至少间隔 2 天
- 绝不在连续两次触达中使用相同的渠道
- 每次跟进必须增加新的价值(新资源、新角度、新证明点)。绝不要“只是跟进一下”。
- 最后一个触达点是一段简短的分手消息
大多数信号的默认节奏:
第 1 天:邮件(首次触达,信号驱动的开场白)
第 3 天:LinkedIn(连接请求备注或简短私信)
第 7 天:邮件(新角度或案例研究)
第 9 天:电话(通话脚本 + 语音留言草稿)
第 12 天:邮件(不同框架或回应对抗)
第 14 天:邮件(简短的分手消息)
根据信号类型调整:
- 融资后:加快节奏(第 1、2、4、7、10 天)。在公告发布后的 48 小时内行动。
- 活动跟进:从 LinkedIn 开始,而不是邮件(先使用更温暖的渠道)
- 内容互动:在发邮件之前,先从 LinkedIn 回复或评论开始
在撰写消息之前,声明每个触达点的计划日期和渠道。
步骤 6:生成序列
完整阅读 references/sequence-format.md。阅读 references/output-template.md 并选择该信号类型的模板。
将 Gemini 请求写入一个临时文件:
cat > /tmp/outreach-sequence-request.json << 'ENDJSON'
{
"system_instruction": {
"parts": [{
"text": "你是一位 B2B 销售文案写手,撰写能够获得回复的冷外联消息。规则:每条消息的第一句是关于他们(买家)的,而不是你的公司。在开场消息中按名称和细节提及具体的购买信号。自然地使用缩写形式。句子要短。不使用公司行话。禁用词:协同效应、杠杆作用、保持联系、回访、ping、拉入群聊、对焦、创新、尖端、一流、世界级、改变游戏规则、颠覆、带宽、深度挖掘、唾手可得的果实、推动指标。不要客套:不要写“希望这封邮件对您一切顺利”,不要写“周一快乐”,不要写“只是想”。每次跟进增加新价值——绝不要“只是跟进一下”。硬性限制:邮件正文不超过 100 词,LinkedIn 消息不超过 300 字符,电话开场白不超过 20 词。只允许 {{first_name}} 作为变量——根据提供的上下文填充所有其他细节。分手消息要简短(3-4 句话)、友好,并留有余地。"
}]
},
"contents": [{
"parts": [{
"text": "CONTEXT_AND_INSTRUCTIONS_HERE"
}]
}],
"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'])"
将 CONTEXT_AND_INSTRUCTIONS_HERE 替换为:
- 来自步骤 2 的产品描述、目标人物画像、痛点及差异化优势
- 来自步骤 4 的信号类型、具体细节及四个切入点要素
- 来自步骤 5 的渠道计划
- 针对每个触达点的撰写指令:邮件需包含主题行(邮件)、字符数(LinkedIn)和通话脚本(电话)
对于每个邮件触达点,要求提供两个主题行变体(A/B 测试)。
步骤 7:映射反对意见
生成序列后,识别该信号类型的 2-4 个最可能的反对意见。在现有的某个触达点中自然地预先化解这些反对意见。不要添加单独的反对意见处理消息。将预期的化解融入序列中。
阅读 references/sequence-format.md 中的反对意见剧本。映射哪个触达点处理哪个反对意见。
需要预先化解的 4 个标准反对意见:
| 反对意见 | 预先化解方法 |
|---|---|
| “我们已经有一个解决方案了” | 肯定他们当前的工具,将你的定位为互补或下一步 |
| “现在不是合适的时候” | 将信号直接与为什么现在是合适的时候联系起来 |
| “太贵了” | 阐述投资回报率,锚定他们关心的一个数字 |
| “需要让更多人参与进来” | 提供一个可共享的资源(单页介绍、录制的演示视频) |
在展示最终序列之前,声明每个触达点处理哪个反对意见。
步骤 8:自我质量检查
在展示之前,执行每一项检查并修复违规问题:
- 每条消息都以关于他们(买家)的句子开头
- 至少在第一个触达点中提到了具体的信号细节
- 除了
{{first_name}}之外,没有未填充的占位符 - 邮件正文不超过 100 词(计数并说明每条的字数)
- LinkedIn 消息不超过 300 字符(计数并说明每条)
- 电话开场白不超过 20 词
- 任何消息中都没有禁用词
- 任何跟进消息中都没有“只是跟进一下”
- 每次跟进都增加了新的角度或价值
- 没有连续两次使用相同的渠道
- 整个序列中至少预先化解了 2 个反对意见
- 分手消息是 3-4 句话,友好,没有负罪感
在展示之前修复任何违规问题。
步骤 9:输出并保存
在代码块中展示完整的序列。
保存到文件:
mkdir -p docs/sequences
cat > docs/sequences/信号类型.md << 'EOF'
序列内容在此处
EOF
echo "序列已保存到 docs/sequences/信号类型.md"
如果设置了 COMPOSIO_API_KEY: 询问:“是否通过 Gmail 中的 Composio 起草邮件触达点?”
确认后,对每个邮件触达点执行:
# Agent 调用 GMAIL_CREATE_EMAIL_DRAFT Composio 动作
# 参数:subject = [主题行], body = [邮件正文], recipient = [联系人的邮箱(如果已知)]
起草完成后:“邮件草稿已创建在 Gmail 中。请检查你的草稿文件夹。”
LinkedIn 消息: 以独立的复制粘贴块形式呈现,每个触达点带有清晰标签。LinkedIn 不支持程序化消息发送。
电话脚本: 以格式化对话要点形式呈现,而非刻板的脚本。