Day 9
海外运营 × Codex 训练营

销售线索评分
+ CRM 集成

把 HubSpot / Calendly / 官网表单 3 来源的线索合并去重,让 Codex 写脚本自动评分,再推回 CRM 触发跟进。

讲师 Terrence 时长 90 分钟 产物 跑通 50 条线索评分 + HubSpot 标签同步
Day 9 · 开场

今天结束,你能做到

本节关键判断:评分模型不是越复杂越好——4 维 × 25 分 = 100 分是行业 baseline,先跑通再调权重。
Day 9 · 痛点

为什么"线索散在一堆工具里"是销售第一杀手

79%
B2B 线索从来没被销售跟进过,因为它没出现在销售当天打开的那个工具里
5 分钟内联系新线索 vs 30 分钟后联系,成单率差 5 倍(MIT 经典研究)
23h
销售平均每周花在手动整理线索数据上的时间——这是 AI 该接管的

意味着:你不缺线索,缺的是把线索按优先级排出来的人——而这件事 Codex 一个脚本就能干完。

Day 9 · 漏斗

海外运营常见的 3 类线索来源

1
主动来询 · 官网 contact form(Webflow / Framer / Typeform)
高意向
2
预约日历 · Calendly / SavvyCal / Cal.com 通过邮件通知
高意向
3
CRM 沉淀 · HubSpot / Salesforce / Pipedrive / Apollo(已有 contact)
需重新评估
4
冷邮件回复(Apollo / Lemlist / Instantly 群发后回复)
中意向
5
LinkedIn DM / Sales Navigator 互动
中意向
6
线下展会扫码 / 名片(手动导入)
需清洗

今天聚焦前 3 类——这是 SaaS / 出海 B2B 团队覆盖率最高、API 最成熟的来源。

Day 9 · 模型

Lead Scoring 模型 · 4 × 25 = 100 分

维度 1 · 行业匹配(25 分)

SaaS / 电商 / 金融 = 25 分。教育 / 制造 / 医疗 = 15 分。其他 = 5 分。

→ 用公司邮箱域名反查行业(Clearbit / Apollo enrich)。

维度 2 · 公司规模(25 分)

1000+ 员工 = 25。100-1000 = 20。10-100 = 12。1-10 = 5。

→ LinkedIn employee count,HubSpot enrich 自带。

维度 3 · 沟通信号(25 分)

邮件提到具体业务 + 12 分,提到价格 + 8 分,提到Demo / 试用 + 5 分。

→ Codex 用关键词 + LLM 做语义判定。

维度 4 · 意向词频率(25 分)

"price" / "demo" / "urgent" / "buy" 出现 1 次 +6,3 次以上封顶 25 分。

→ 正则匹配 + 词频统计,最便宜的一维。

为什么先用 25/25/25/25 等权?等权是 baseline,跑 2 个月有数据后再调权重——比一开始猜权重靠谱。
Day 9 · 工具栈

今天要用到的工具栈

1
Codex CLI · 主战场,让它写 Python 脚本 + 调试用 Day 1-2 装好的 Codex,今天开新工作目录 ~/lead-scoring/
2
HubSpot Free CRM · 免费够用 · Settings → Integrations → Private Apps 拿 API key需要 scopes:crm.objects.contacts.read / write + tickets.read
3
Calendly · Personal API token(Account → Integrations → API & Webhooks)免费版可读 booking history,付费版可拿 invitee details
4
官网 contact form · Webflow 表单 → Zapier / Make 转发到 webhook 或 Google Sheet本节用 Google Sheet 演示,CSV 也行
5
Python 3.10+ · pandas / requests / openaiCodex 会帮你写 requirements.txt,不用手动装
安全:所有 API key 必须存 .env不要直接写脚本里。让 Codex 用 python-dotenv 读。
Day 9 · Prompt

今天的核心 Prompt(一字不差喂给 Codex)

我有以下线索来源: - HubSpot CRM(API key 已有,存在 .env 里 HUBSPOT_TOKEN) - Calendly 邮件订阅(导出的 .eml 文件夹 ./calendly_emails/) - 官网 contact form(Webflow CMS,已导出为 ./contacts.csv) 请帮我: 1) 写 Python 脚本,统一收集 3 来源的线索 + 按邮箱去重 2) 评分模型(满分 100): - 行业匹配 25 分(SaaS / 电商 / 金融) - 公司规模 25 分(员工数:1-10/10-100/100-1000/1000+) - 沟通信号 25 分(邮件是否提到具体业务 / 价格 / Demo) - 意向词 25 分('price' / 'demo' / 'urgent' / 'buy') 3) >70 分:自动在 HubSpot 标 'hot lead' + 创建跟进任务(销售拿单) 4) 40-70 分:标 'warm' + 加入 nurturing 邮件序列 5) <40 分:标 'cold' + 季度 review 6) 每周生成线索质量报告:各来源转化率 + TOP 10 高分线索详情 要求:所有 API key 走 .env;脚本可重跑(idempotent); 失败要有日志;输出一份 README 说明运行步骤。
Day 9 · Prompt

为什么 Prompt 长成这样?拆 6 个动作

1
声明输入 · 把 3 个来源 + 文件路径写清楚Codex 看到具体路径才会写真实代码,模糊"邮件附件"会让它假设结构
2
去重逻辑 · 按邮箱合并 + 保留最早接触时间"按邮箱"是关键词,否则 Codex 会按 name 去重导致同名公司丢数据
3
评分规则量化 · 不写"SaaS 优先" → 写 "SaaS = 25 分"量化规则让 Codex 直接生成可执行代码,模糊描述会让它生成空函数
4
分档动作 · 每档明确"要在 CRM 干什么"hot → 创建 task;warm → 加 list;cold → 加 tag。Codex 会自动查 HubSpot API 文档
5
报告需求 · "周报 · 来源转化率 · TOP 10"这是给老板看的,不是销售。明确受众 Codex 才知道格式
6
工程约束 · .env / idempotent / 日志 / README没这段你拿到的是 demo,加上这段你拿到的是生产代码
Day 9 · 演示

Codex 跑完后的目录结构

lead-scoring/ ├── .env # HUBSPOT_TOKEN / CALENDLY_TOKEN / OPENAI_API_KEY ├── README.md # 运行步骤 + 评分模型说明 ├── requirements.txt # pandas / requests / python-dotenv / openai ├── src/ │ ├── ingest_hubspot.py # 拉 HubSpot contacts │ ├── ingest_calendly.py # 解析 .eml 提取 invitee │ ├── ingest_form.py # 读 contacts.csv │ ├── dedupe.py # 按 email 去重 + 合并字段 │ ├── score.py # 4 维评分核心 │ ├── push_hubspot.py # 回写 tag + 创建 task │ └── report.py # 周报生成(Markdown 输出) ├── data/ │ ├── raw/ # 3 来源原始数据 │ └── scored.csv # 评分结果 └── logs/ └── run_2026-05-26.log # 每次运行的日志

Codex 拆成 7 个模块——每个模块独立可测,这是能维护的代码不是 demo 代码。

Day 9 · 演示

score.py 的核心逻辑(Codex 生成)

def score_lead(lead: dict) -> dict: score = 0 breakdown = {} # 1. 行业匹配 industry = enrich_industry(lead['email']) # Clearbit / Apollo industry_score = {'SaaS': 25, 'eCommerce': 25, 'Finance': 25, 'Education': 15, 'Manufacturing': 15, 'Healthcare': 15}.get(industry, 5) score += industry_score breakdown['industry'] = (industry, industry_score) # 2. 公司规模 size = lead.get('company_size', 0) size_score = 25 if size > 1000 else 20 if size > 100 else 12 if size > 10 else 5 score += size_score breakdown['size'] = (size, size_score) # 3. 沟通信号(语义判定,调 LLM) signal_score = classify_signals(lead.get('latest_message', '')) score += signal_score breakdown['signal'] = signal_score # 4. 意向词频率 text = lead.get('all_messages', '').lower() keywords = ['price', 'demo', 'urgent', 'buy'] hits = sum(text.count(k) for k in keywords) intent_score = min(hits * 6, 25) score += intent_score breakdown['intent'] = (hits, intent_score) return {'score': score, 'breakdown': breakdown}
Day 9 · 分档

3 档线索 · 不同动作

HOT · 70-100 分

销售当天联系

  • HubSpot 标 'hot lead' 标签
  • 自动创建 task 派给 AE
  • Slack #sales-hot 频道 @相应销售
  • Calendly 链接直接私信

→ 5 分钟响应窗口

WARM · 40-70 分

nurturing 序列

  • HubSpot 标 'warm' 标签
  • 加入 7 封自动邮件序列
  • 每周生成 case study 投递
  • 2 周后重新打分

→ 教育 → 转 hot

COLD · 0-40 分

季度 review

  • HubSpot 标 'cold' 标签
  • 放入归档列表
  • 季度初批量重打分
  • 避免销售浪费时间

→ 不主动跟进

关键设计:cold 不等于"扔掉"。季度重打分——因为公司可能 6 个月后融资 / 招人 / 转型,状态会变。
Day 9 · API

HubSpot API · 3 个核心调用

# 1. 拉取 contacts(拉 100 条 / 页,要 paginate) GET /crm/v3/objects/contacts?limit=100&properties=email,firstname, company,industry,num_employees,lifecyclestage # 2. 更新 contact 的 lead score property PATCH /crm/v3/objects/contacts/{contactId} Body: { "properties": { "lead_score": 78, "lifecyclestage": "marketingqualifiedlead" } } # 3. 给 hot lead 创建 task POST /crm/v3/objects/tasks Body: { "properties": { "hs_task_subject": "Hot Lead · 5min response window", "hs_task_priority": "HIGH", "hs_task_body": "Score: 82. Industry: SaaS. Last signal: asked for demo", "hubspot_owner_id": "" }, "associations": [{ "to": {"id": ""}, "types": [...] }] }

这 3 个 endpoint 覆盖 90% 场景。Codex 会自己查 HubSpot 文档——你不用记。

Day 9 · 数据流

完整数据流 · 从原始线索到销售桌面

1
Ingest · HubSpot API + Calendly .eml + Webflow CSV → data/raw/每个来源独立模块,独立失败不影响其他
2
Dedupe · 按 email 合并 → data/merged.csv同一人多来源时合并字段,保留最早 first_touch 时间
3
Enrich · 调 Clearbit / Apollo 补齐行业 + 公司规模缓存 enrich 结果,避免重复 API 消耗
4
Score · 4 维评分 → data/scored.csv每条记录带 breakdown,方便人工审查
5
Push · 回写 HubSpot lead_score + lifecyclestage + tagidempotent:重跑不会重复创建 task
6
Notify · Hot lead → Slack / 邮件即时通知销售5 分钟响应窗口的关键
7
Report · 每周一早 9 点生成上周线索质量周报Markdown → 邮件给老板
Day 9 · 周报

每周线索质量周报(Markdown)

# 线索周报 · Week 21 (2026-05-19 ~ 2026-05-25) ## 总览 - 新线索:247 条(↑18% vs 上周) - Hot (70+):23 条 · 转化中:12 (52%) - Warm (40-70):89 条 · nurturing 中 - Cold (<40):135 条 ## 各来源转化率 | 来源 | 新增 | Hot 率 | 平均分 | |------|------|--------|--------| | 官网 contact form | 42 | 31% | 58 | | Calendly | 18 | 67% | 71 | ← 最优 | HubSpot 沉淀 | 187 | 4% | 28 | ## TOP 10 高分线索 1. Sarah Chen · Stripe (Finance, 8000+) · 88 分 · "ready to buy this Q" 2. Marcus Webb · Linear (SaaS, 200) · 84 分 · 已 booked demo 3. ... ## 洞察 - Calendly 来源 Hot 率 67%,应加大投放 - 官网表单的 industry enrich 失败率 12%,需修 - HubSpot 沉淀池 4% Hot 率偏低,建议清洗后重打分
Day 9 · 避坑

Lead Scoring · 4 个常见误区

误区 1 · 维度太多

15 维评分模型听起来牛,实际跑不通也调不动——每个维度都要数据 + 阈值 + 监控。

→ 4 维 baseline,3 个月后再加。

误区 2 · 等权迷信

跑 3 个月有真实转化数据后,必须重训权重。继续等权就是浪费数据。

→ 看哪一维和成单相关性最高,加权。

误区 3 · 没有人工 override

销售从经验判断"这个 30 分的其实是大单"——脚本必须支持手动标 hot 并记录原因。

→ AI 是辅助,不是裁判。

误区 4 · 不监控漂移

3 个月后行业关键词变了(比如"AI agent"火了),不更新词库 → 分数失真。

→ 月度 review 关键词命中率。

核心原则:Lead scoring 是活的系统,不是装一次的工具。3 个月不维护就开始漂移。
Day 9 · 实操
现在轮到你

学员练习
50 条脱敏线索跑通

讲师准备了 50 条脱敏线索 CSV(混合 3 来源)
用 Codex 把今天的 prompt 跑一遍,
最终在 HubSpot Free 上看到 hot / warm / cold 标签

CSV 已发群 HubSpot Free 当场注册 90 分钟时长 完成 = 拿到今天产物
Day 9 · 实操

练习步骤 · 跟着做

  1. 注册 HubSpot Free · hubspot.com → Free CRM → 注册 → Settings → Integrations → Private Apps → 创建
  2. 下载 CSV · 群里发的 day09_leads.csv · 50 条脱敏数据
  3. 新建工作目录 · mkdir ~/lead-scoring && cd ~/lead-scoring
  4. 启动 Codex CLI · codex 然后把 SLIDE 7 的完整 prompt 喂进去
  5. 盯着 Codex 干活 · 它会问你 API key 放哪、是否创建 .gitignore——确认即可
  6. 跑脚本 · python src/main.py --input data/raw/day09_leads.csv --push
  7. 验收 · 打开 HubSpot → Contacts → 看到 50 条记录 + lead_score + lifecyclestage 标签
  8. 生成周报 · python src/report.py --week current → 输出 Markdown
Day 9 · 调试

常见报错 · 3 类

1
401 Unauthorized · HubSpot API key 没权限→ 回 Private App 检查 scope,必须勾 crm.objects.contacts.read 和 write
2
429 Rate Limit · 调用太快被限流→ Codex 应该自动加了 retry,看 logs 确认有 backoff;没有就让 Codex 加 time.sleep(0.5)
3
KeyError: 'email' · CSV 列名不匹配→ 让 Codex 加 column rename mapping,或者改 CSV 表头
4
Clearbit 返回 None · enrich 失败→ 加 fallback:industry = 默认值;保留原始记录不要丢
5
Task 重复创建 · 脚本不是 idempotent→ 让 Codex 加"先查 task 是否已存在再创建"逻辑
调试技巧:把报错原样粘给 Codex,加一句"修复并重跑"——比自己 Google 快 10 倍。
Day 9 · 进阶

进阶 · 一句话切换 Salesforce / Pipedrive

跑通 HubSpot 后,让 Codex 加一层抽象 → 切换 CRM 只改一个环境变量。

我已经跑通了 HubSpot 集成。现在请: 1) 把 push_hubspot.py 重构成 push_crm.py, 抽象出 CRMClient 接口(upsert_contact / create_task / update_property) 2) 实现 HubSpotClient / SalesforceClient / PipedriveClient 3 个子类 3) 在 .env 用 CRM_PROVIDER=hubspot|salesforce|pipedrive 切换 4) 写 3 套测试,覆盖 mock API 响应 5) 更新 README 说明如何切换

跑完这一段,你团队明年换 CRM 时省下的工作量足够回本整个训练营

Day 9 · 进阶

进阶 · Apollo 做 outbound 线索补充

用法 1 · enrich 已有线索

Apollo API 输入 email → 返回公司规模 / 行业 / 技术栈 / 资金状况

→ 替代 Clearbit,价格更友好($49/mo 起)

  • 覆盖率:B2B 邮箱 75%+
  • 响应速度:单条 < 1s
  • 可批量(100 条 / 调用)
用法 2 · ICP 主动挖掘

定义 ICP → Apollo Search → 拉出符合条件的潜在客户 → 灌进 lead pool

→ 不要 spam,每周 50 条精挑细选

  • SaaS, 50-500 employees, US
  • Stack 含 Stripe / HubSpot
  • 近 6 个月有融资 / 招聘动作
边界:Apollo 是补刀工具,不是主线。inbound(被动来询)永远比 outbound(主动挖)转化高 5-10 倍——优先把 inbound 评分系统跑顺。
Day 9 · 部署

把脚本部署成定时任务

1
方案 A · GitHub Actions · 推到 private repo + .env 走 secrets每天凌晨 4 点 cron 跑一次。完全免费(公网仓库 2000 分钟 / 月)
2
方案 B · Vercel Cron · 适合配合 Next.js dashboard 一起部署免费版每天 1 次调用,付费 $20/mo 无限
3
方案 C · 本地 cron · macOS launchd / Linux crontab开发期最快,但电脑得开机——只适合个人 PoC
4
方案 D · 云服务器 · 阿里云 / DO / AWS t3.micro$5-10/mo,自己装 cron + Python + .env,最稳定
推荐:team 用 GitHub Actions(零运维),个人 PoC 用本地 cron(最快),需要 dashboard 配套就上 Vercel。
Day 9 · 合规

合规 · 4 件你不能不管

实操建议:让 Codex 在 dedupe.py 里加一个 consent_check()没有 consent 记录的 email 不进 nurturing 序列——分进 pool 但不主动联系。罚款一次能花掉一年广告预算。
Day 9 · 验收

今日成果 · 4 项验收清单

HubSpot Free 账号注册完成 · API key 拿到 + 存在 .env验收:echo $HUBSPOT_TOKEN 能输出
Codex 生成的 lead-scoring/ 目录跑通 · 50 条记录已评分验收:cat data/scored.csv | head 看到分数 + breakdown
HubSpot Contacts 看到标签 · hot/warm/cold 分布合理验收:登录 HubSpot → Contacts → 按 lead_score 排序
周报 Markdown 生成成功 · 含来源转化率 + TOP 10验收:cat reports/week_21.md
下课前 5 分钟:把你的周报截图发训练营群——讲师当晚逐条 review。
Day 9 · 小结

今天 3 个 takeaway

  1. Lead scoring 是销售注意力预算——4 维 × 25 分 = 100 分是 baseline,跑通再调权重
  2. Codex 把"概念 demo"拆成"可维护代码"——7 个模块独立可测,换 CRM 只改一个文件
  3. 评分系统是活的——3 个月不维护就漂移,月度 review 关键词 + 季度重训权重
课后作业(明天前完成):把你真实工作里的 100 条线索(脱敏后)跑一次评分,看 TOP 10 是不是你心里的 TOP 10——不一致的部分就是模型还要调的方向。
Day 9 · 结束
明天 · Day 10

A/B 测试自动数据分析

从 GA4 / Mixpanel / Amplitude 拉 A/B 测试数据
让 Codex 算显著性 + 切 segment + 写"是否推全量"决策报告

现在 · Q&A 时间
课后微信群答疑 · 联系讲师 Terrence · 13299138336
讲师备注 · 按 N 切换显示 / 隐藏
翻页 · Space 下一页 · F 全屏 · N 备注 · Home 首页