名称: campaign-orchestrator
描述: ShapeScale 销售多渠道跟进活动编排器。可安排和执行短信+邮件序列,集成 CRM 日志记录,并在收到回复时自动终止活动。适用于跟进演示线索或管理外展活动。
主页: https://github.com/kesslerio/shapescale-moltbot-skills
元数据: {"moltbot":{"emoji":"📋","requires":{"env":["DIALPAD_API_KEY","ATTIO_API_KEY","GOG_KEYRING_PASSWORD"]},"primaryEnv":"DIALPAD_API_KEY"}}
ShapeScale 销售多渠道跟进活动编排器。执行预定的短信+邮件序列,集成 CRM,并在收到回复时自动终止。
一个活动是一系列定义好的、随时间执行的步骤(短信/邮件)。当线索回复任何消息时,活动将自动终止。
所需环境变量:
DIALPAD_API_KEY=你的_dialpad_api_密钥
ATTIO_API_KEY=你的_attio_api_密钥
GOG_KEYRING_PASSWORD=你的_谷歌密码 # 用于 Gmail 访问
同时确保:
- Dialpad 网络钩子已配置为指向此服务器
- Attio 中已有线索对应的公司/联系人记录
- 销售邮箱已启用 Gmail API 访问权限
# 为线索启动主要跟进活动
python3 campaign.py start "primary" --lead "Apex Fitness"
# 启动时覆盖自定义延迟(小时)
python3 campaign.py start "primary" --lead "Apex Fitness" --delay 2
# 使用 Attio 交易/公司 ID 启动
python3 campaign.py start "post-demo" --lead "Apex Fitness" --attio-id "deal-uuid"
在启动任何活动前,请验证:
客户状态检查
邮件格式检查(针对邮件步骤)
语气检查
切勿向现有客户发起活动,除非明确要求进行增销。
# 特定线索的状态
python3 campaign.py status "Apex Fitness"
# 所有活跃活动
python3 campaign.py list
# 手动终止(线索已回复、不感兴趣等)
python3 campaign.py stop "Apex Fitness" --reason "replied_interested"
# 从活动中移除线索(选择退出、不感兴趣)
python3 campaign.py remove "Apex Fitness"
# 检查线索是否已回复任何先前消息
python3 campaign.py check "Apex Fitness"
# 显示每个已完成步骤的回复状态
# 如果检测到回复会发出警告(可安全继续或终止)
# 显示所有按时间排序的待处理活动步骤
python3 campaign.py pending
# 便于查看所有活动中即将到期的步骤
# 列出可用模板
python3 campaign.py templates
# 预览模板
python3 campaign.py preview "primary"
| 模板 | 时间安排 | 渠道 | 目的 |
|---|---|---|---|
primary |
+4 小时 | 短信 | 演示回顾,分享录制 |
secondary |
+1 天 | 邮件 | 定价,详细投资回报率 |
tertiary |
+4 天 | 短信 | 快速跟进 |
quaternary |
+7 天 | 邮件 | 最终跟进,案例研究 |
post-demo |
+0 小时 | 短信 | 立即感谢 |
模板支持变量替换:
{name} - 线索名字
{company} - 公司名称
{deal_value} - Attio 中的交易价值
{owner} - 销售负责人姓名
{demo_notes} - 演示对话笔记
{checkout_link} - 个性化结账链接
campaign-orchestrator/
├── SKILL.md # 本文档
├── campaign.py # 主 CLI(启动、停止、状态、列表)
├── webhook_handler.py # 处理回复 → 终止
├── primary.md # 短信跟进模板
├── secondary.md # 邮件模板
├── post-demo.md # 立即跟进模板
└── state/
└── campaigns.json # 活动状态持久化存储
活动状态存储在 <workspace>/state/campaigns.json 中:
{
"campaigns": {
"Apex Fitness": {
"template": "primary",
"attio_id": "deal-uuid",
"started": "2026-01-27T13:00:00Z",
"steps_completed": ["sms_primary"],
"next_step": "email_secondary",
"next_scheduled": "2026-01-28T13:00:00Z",
"status": "active"
}
},
"templates": {
"primary": {...},
"secondary": {...}
}
}
活动步骤通过 Clawdbot 的 cron 系统执行:
调度脚本会自动创建和管理这些任务。
当 Dialpad 收到活动消息的回复时:
webhook_handler.py 解析回复python3 /home/art/niemand/skills/dialpad/send_sms.py --to "+14155551234" --message "..."
gog-shapescale --account martin@shapescale.com send-email --to "lead@company.com" --subject "..." --body "..."
attio note companies "company-uuid" "活动消息已发送:{message}"
# 1. 演示后,启动活动
/campaign start "post-demo" --lead "Dr. Smith's Clinic"
# 2. 第二天检查状态
/campaign status "Dr. Smith's Clinic"
# 输出:步骤 1 已发送,步骤 2 计划于明天
# 3. 线索回复“感兴趣”
# 网络钩子自动终止活动
# 将回复记录到 Attio
# 4. 如需,手动跟进
/campaign start "secondary" --lead "Dr. Smith's Clinic" --delay 0
# 列出所有活跃活动
/campaign list
# 输出:
# 活跃活动:
# - Apex Fitness (primary) - 步骤 2/4,下一步:邮件
# - Dr. Smith's Clinic (post-demo) - 已完成
# - Wellness Center (tertiary) - 步骤 1/3,下一步:短信
活动未发送:
- 检查 cron 是否运行:crontab -l
- 检查日志:journalctl -u moltbot 或活动日志
- 验证 API 密钥:echo $DIALPAD_API_KEY
网络钩子未终止:
- 确认 Dialpad 网络钩子 URL 已配置
- 检查网络钩子处理器是否在运行
- 检查 campaigns.json 中是否有匹配的线索
模板变量未填充:
- 确认线索存在于 Attio 中且包含必填字段
- 检查模板语法:应为 {variable} 而非 { variable }
属于 shapescale-moltbot-skills 的一部分。请参阅父仓库。