Outreach Sequencer — Multi-Step Personalized Campaigns
Design, schedule, and execute multi-step outreach sequences across LinkedIn and email. Each message is personalized per lead using their profile data from DuckDB.
Sequence Templates
Template 1: LinkedIn Connection + Message
CODEBLOCK0
Template 2: Cold Email Sequence
CODEBLOCK1
Template 3: Multi-Channel
CODEBLOCK2
Personalization Engine
Each message is generated per-lead using their DuckDB profile data. Use these variables:
| Variable | Source | Example |
|---|
| INLINECODE0 | Name field (split) | "Jane" |
| INLINECODE1 |
Company field | "Acme Corp" |
|
{title} | Title field | "CTO" |
|
{mutual} | Shared connections/background | "Stanford" |
|
{trigger} | Why reaching out now | "saw your Series A" |
|
{value_prop} | What you offer them | "AI-powered analytics" |
|
{pain_point} | Their likely challenge | "scaling engineering team" |
Personalization Rules
- - Never use generic openers like "I hope this finds you well"
- Reference something specific: recent post, company news, shared background
- Keep LinkedIn messages under 300 chars (connection note limit)
- Keep cold emails under 150 words (respect attention)
- Vary language across leads — don't send identical messages to people at the same company
- Match tone to seniority: C-suite gets concise/strategic, ICs get technical/peer-level
Message Generation Pattern
CODEBLOCK3
Execution
LinkedIn Messages (via Browser)
CODEBLOCK4
Email (via gog CLI)
CODEBLOCK5
For follow-ups (reply to thread):
CODEBLOCK6
Sequence Status Tracking
Track in DuckDB with these status fields:
| Field | Values | Notes |
|---|
| Outreach Status | Queued, Sent, Replied, Converted, Bounced, Opted Out | Main status |
| Sequence Step |
1, 2, 3, 4 | Current step in sequence |
| Last Outreach | date | When last message was sent |
| Next Outreach | date | When next step is due |
| Outreach Channel | LinkedIn, Email, Both | Active channel |
| Reply Received | boolean | True if they responded |
| Thread ID | text | Gmail thread ID for email chains |
CODEBLOCK7
Cron Integration
Set up automated sequence execution:
CODEBLOCK8
Cron Job Setup (for OpenClaw)
CODEBLOCK9
Safety & Compliance
- - Daily send limits: Max 50 LinkedIn connection requests/day, 100 messages/day
- Email limits: Max 100 cold emails/day (avoid spam flags)
- Opt-out handling: If someone replies "not interested" / "unsubscribe", immediately set status to "Opted Out" and never contact again
- Bounce handling: If email bounces, mark as "Bounced" and try alternate email patterns
- CAN-SPAM compliance: Include sender identity, physical address option, and opt-out mechanism in emails
- LinkedIn ToS: Keep connection notes professional, don't spam InMails
- Cool-down: If a lead hasn't replied after full sequence, wait 90 days before any re-engagement
Analytics
After each sequence run, track:
CODEBLOCK10
Outreach Sequencer — 多步骤个性化营销活动
在LinkedIn和电子邮件上设计、安排并执行多步骤的外联序列。每条消息均根据DuckDB中的潜在客户资料进行个性化定制。
序列模板
模板1:LinkedIn好友请求 + 消息
第0天:发送LinkedIn好友请求(附备注)
第1天:如果已接受 → 发送介绍消息
第3天:如果未回复 → 发送跟进消息
第7天:如果未回复 → 发送结束/增值消息
模板2:冷邮件序列
第0天:初始冷邮件
第3天:跟进(回复原始邮件线程)
第7天:增值邮件(案例研究、资源)
第14天:结束邮件(收尾)
模板3:多渠道
第0天:LinkedIn好友请求
第2天:冷邮件(如果未在LinkedIn上建立联系)
第4天:LinkedIn消息(如果已建立联系)或邮件跟进
第7天:最终接触(使用他们参与过的渠道)
个性化引擎
每条消息均根据DuckDB中的潜在客户资料生成。使用以下变量:
| 变量 | 来源 | 示例 |
|---|
| {first_name} | 姓名字段(拆分) | Jane |
| {company} |
公司字段 | Acme Corp |
| {title} | 职位字段 | CTO |
| {mutual} | 共同联系/背景 | Stanford |
| {trigger} | 现在联系的原因 | 看到您的A轮融资 |
| {value_prop} | 您能提供的价值 | AI驱动的分析 |
| {pain_point} | 他们可能面临的挑战 | 扩展工程团队 |
个性化规则
- - 绝不使用通用开场白,如希望您一切顺利
- 引用具体内容:最近的帖子、公司新闻、共同背景
- LinkedIn消息控制在300字符以内(好友请求备注限制)
- 冷邮件控制在150字以内(尊重注意力)
- 针对不同潜在客户变换语言 — 不要向同一公司的人发送相同消息
- 根据职位级别调整语气:高管层使用简洁/战略性语言,个人贡献者使用技术/同级语言
消息生成模式
- 1. 从DuckDB读取潜在客户资料
- 识别个性化切入点:
- 共同背景(学校、公司、地点)
- 近期公司新闻(如需可进行网络搜索)
- 职位特定痛点
- 3. 为序列步骤选择消息模板
- 生成个性化消息
- 将消息及状态存储到DuckDB中
执行
LinkedIn消息(通过浏览器)
浏览器 → 打开LinkedIn消息界面
浏览器 → 搜索收件人
浏览器 → 打开对话
浏览器 → 输入个性化消息
浏览器 → 发送
→ 更新DuckDB状态:已发送
电子邮件(通过gog CLI)
bash
gog gmail send \
--to {email} \
--subject {subject} \
--body {personalized_body} \
--account patrick@candlefish.ai
对于跟进(回复邮件线程):
bash
gog gmail reply \
--thread-id {thread_id} \
--body {followupbody}
序列状态跟踪
在DuckDB中使用以下状态字段进行跟踪:
| 字段 | 值 | 备注 |
|---|
| 外联状态 | 已排队、已发送、已回复、已转化、已退回、已退订 | 主要状态 |
| 序列步骤 |
1, 2, 3, 4 | 序列中的当前步骤 |
| 上次外联 | 日期 | 上次消息发送时间 |
| 下次外联 | 日期 | 下一步骤到期时间 |
| 外联渠道 | LinkedIn、电子邮件、两者 | 活跃渠道 |
| 是否收到回复 | 布尔值 | 如果对方回复则为True |
| 线程ID | 文本 | 邮件链的Gmail线程ID |
sql
-- 查找需要进行下一步序列的潜在客户
SELECT Name, Email, Outreach Status, Sequence Step, Next Outreach
FROM v_leads
WHERE Outreach Status = Sent
AND Reply Received = false
AND Next Outreach <= CURRENT_DATE
ORDER BY Next Outreach;
Cron集成
设置自动化序列执行:
计划:工作日(周一至周五)9am-5pm,每2小时执行一次
操作:
- 1. 查询需要进行下一步的潜在客户
- 对于每个到期的潜在客户:
a. 为其当前步骤生成个性化消息
b. 通过适当渠道发送
c. 更新状态并推进步骤
d. 设置下次外联日期
- 3. 报告:已发送12条消息(8条LinkedIn,4封邮件)。收到3条回复。
Cron任务设置(适用于OpenClaw)
json
{
name: 外联系列,
schedule: { kind: cron, expr: 0 9,11,13,15
1-5, tz: America/Denver },
sessionTarget: isolated,
payload: {
kind: agentTurn,
message: 运行外联系列检查。查询DuckDB中Next Outreach <= 今天的潜在客户。为其当前序列步骤发送个性化消息。更新状态。报告结果。,
timeoutSeconds: 300
}
}
安全与合规
- - 每日发送限制:每天最多50个LinkedIn好友请求,100条消息
- 邮件限制:每天最多100封冷邮件(避免触发垃圾邮件标记)
- 退订处理:如果有人回复不感兴趣/取消订阅,立即将状态设置为已退订,且不再联系
- 退回处理:如果邮件退回,标记为已退回并尝试其他邮件模式
- CAN-SPAM合规:在邮件中包含发件人身份、实体地址选项和退订机制
- LinkedIn服务条款:保持好友请求备注专业,不滥发InMail
- 冷却期:如果潜在客户在完整序列后仍未回复,等待90天后再重新接触
分析
每次序列运行后,跟踪以下数据:
活跃序列:85个潜在客户
├── 步骤1(初始):20个潜在客户
├── 步骤2(跟进):35个潜在客户
├── 步骤3(增值):18个潜在客户
├── 步骤4(结束):12个潜在客户
│
结果:
├── 已回复:23(回复率27%)
├── 已转化:8(转化率9.4%)
├── 已退订:3(3.5%)
├── 已退回:2(2.4%)
└── 无回复(已完成):15(17.6%)