我们用 Claude、Instantly 和 Supabase 构建了冷邮件系统
你的 Instantly 仪表板打开时有 200 条线索排队、模板已准备好,还有那种熟悉的空虚感——又一批「嗨 {firstName},我注意到你的公司...」即将发送出去。每个代理商都讨厌冷邮件。我们也是。不是因为外展不起作用,而是因为我们付费使用的每个平台仍然需要数小时的手动研究,仍然发送看起来像机器人写的文案,仍然花费每月 $300 来做我们知道 Claude 能在几秒内做得更好的事情。所以我们停止了租赁。我们将 Claude、Hunter、Instantly 和 Supabase 连接成一个系统,该系统从实时网页抓取中写出有针对性的开场白,按意图对回复进行评分,并记录每一次互动,而无需 SaaS 税。架构并不复杂——但回复率上升了,繁忙工作消失了,我们拥有整个堆栈。
这不是理论架构文章。我们已经在生产环境中运行此系统数月,发送了数千封个性化电子邮件,这些邮件确实获得了回复。我将逐步介绍我们为什么构建它、各个部分如何组合在一起,以及我们以艰难的方式学到的东西。
目录
- 现成外展工具的问题
- 我们的技术栈以及为什么选择它
- 架构概述
- 使用 Hunter 查找和丰富线索
- 使用 Claude 进行 AI 个性化
- Supabase 作为编排层
- 使用 Instantly 大规模发送
- 自动化粘合剂
- 结果和我们学到的内容
- 成本分析
- 常见问题

现成外展工具的问题
我们尝试过通常的选择。Lemlist。Apollo。Woodpecker。它们是许多用例的不错工具。但作为一个无头网络开发代理商,我们的外展需求以这些平台无法处理的方式是具体的。
以下是不断出现的问题:
通用个性化字段不是个性化。 将某人的公司名称和职位插入模板不会在 2026 年愚弄任何人。我们需要引用潜在客户实际技术栈、他们的网站性能问题或在他们的公共网站上可见的具体架构决策的电子邮件。
研究步骤是瓶颈。 我们表现最好的外展总是涉及团队中的某个人实际查看潜在客户的网站、通过 PageSpeed Insights 运行它、检查他们的框架,并写下具体内容。这每个线索需要 10-15 分钟。在规模上,那是一份全职工作。
数据分散在太多地方。 一个电子表格中的线索、另一个平台中的电子邮件序列、第三个仪表板中的结果。我们无法构建反馈循环,因为没有任何东西相互交流。
AI 集成是表面的。 一些平台添加了「AI 写作」功能,但它们基本上是生成每个人都在发送的相同乏味文案的 GPT 包装器。无法输入自定义上下文、无法控制提示、无法构建多步推理链。
我们需要一个 AI 进行研究的系统,而不仅仅是写作。
我们的技术栈以及为什么选择它
在几次迭代后,我们选择了这个:
| 组件 | 工具 | 角色 | 月成本 |
|---|---|---|---|
| 线索查找和电子邮件验证 | Hunter.io | 查找和验证电子邮件地址 | $49(入门版) |
| AI 研究和文案撰写 | Claude (Anthropic API) | 分析潜在客户、生成个性化电子邮件 | ~$30-60 |
| 数据库和编排 | Supabase | 存储线索、管理状态、触发工作流 | $25(专业版) |
| 电子邮件发送和预热 | Instantly.ai | 可递送性、发送基础设施、预热 | $30(增长版) |
| 自动化粘合剂 | 自定义边缘函数 + Cron | 连接所有内容 | $0(包含在 Supabase 中) |
我们评估了很多替代品。以下是我们选择所选内容原因的简短版本:
Claude 而不是 GPT-4: 我们两者都进行了广泛测试。Claude 3.5 Sonnet(现在 2025 年 Claude 4 Sonnet)持续生成听起来更自然、更不「AI 化」的电子邮件。它在遵循复杂系统提示而不偏离方面也更好。定价具有可比性,但 Claude 的更长上下文窗口意味着我们可以为每个潜在客户输入更多研究数据。
Supabase 而不是 Airtable 或自定义 Postgres 设置: 我们需要一个真实的数据库,具有行级安全性,但我们不想管理基础设施。Supabase 为我们提供了 Postgres、边缘函数、Cron 作业和一个不错的仪表板——所有这些都在一个地方。我们在客户项目中也经常使用 Supabase,所以团队已经很熟悉了。
Instantly 而不是 Lemlist 或 Smartlead: Instantly 的预热网络确实不错,他们的 API 清晰,定价符合我们的数量。我们不需要 Instantly 的内置序列构建器,因为我们自己处理序列逻辑。
Hunter 而不是 Apollo 或 Snov.io: Hunter 的电子邮件验证始终是我们测试过的最准确的。他们的域搜索 API 速度很快,数据质量很高。Apollo 有更多数据点,但我们发现他们的电子邮件准确性较低,这会杀死可递送性。
架构概述
该系统分五个阶段工作,每个阶段独立运行:
[线索来源] → [Hunter 丰富] → [Supabase DB] → [Claude 研究 + 文案] → [Instantly 发送]
↑ ↑ |
| | |
+----------- 反馈循环 ----------+--------------------------------------+
- 摄取:我们从各种来源(手动列表、抓取工具、推荐数据)输入潜在客户域
- 丰富:Hunter 查找联系人并验证电子邮件
- 存储:所有内容都进入 Supabase,带有状态跟踪
- 研究 + 写作:Claude 分析每个潜在客户并生成个性化文案
- 发送:获批电子邮件推送到 Instantly 活动
- 学习:回复数据流回 Supabase,告知未来的个性化
每个阶段都是解耦的。如果 Hunter 的 API 出现故障,丰富队列就会备份——它不会破坏发送。如果我们想将 Claude 换成不同的模型,我们更改一个函数。

使用 Hunter 查找和丰富线索
Hunter.io 处理两个关键工作:在公司中查找正确的人并验证他们的电子邮件确实有效。
以下是我们丰富功能的简化版本:
import { createClient } from '@supabase/supabase-js';
const HUNTER_API_KEY = Deno.env.get('HUNTER_API_KEY');
async function enrichLead(domain: string) {
// 域搜索以查找决策者
const searchRes = await fetch(
`https://api.hunter.io/v2/domain-search?domain=${domain}&department=executive,it&api_key=${HUNTER_API_KEY}`
);
const searchData = await searchRes.json();
const contacts = searchData.data.emails
.filter((e: any) => e.confidence > 70)
.slice(0, 3); // 每个域最多 3 个联系人
// 验证每个电子邮件
for (const contact of contacts) {
const verifyRes = await fetch(
`https://api.hunter.io/v2/email-verifier?email=${contact.value}&api_key=${HUNTER_API_KEY}`
);
const verifyData = await verifyRes.json();
if (verifyData.data.status === 'valid') {
await supabase.from('leads').insert({
domain,
email: contact.value,
first_name: contact.first_name,
last_name: contact.last_name,
position: contact.position,
confidence: contact.confidence,
status: 'enriched',
enriched_at: new Date().toISOString()
});
}
}
}
我们针对 executive 和 it 部门进行筛选,因为那些是我们的买家——CTO、工程副总裁、技术创始人。Hunter 的部门筛选并不完美,但它消除了很多噪音。
我们学到的一件事:永远不要跳过电子邮件验证。 即使有 Hunter 的信心分数,我们仍然验证每个地址。反弹率超过 3% 将摧毁您发送域的声誉。我们看到域从 95% 收件箱放置下降到 40% 垃圾邮件文件夹,原因是一个坏批。
我们每周运行约 500 个 Hunter 搜索积分,这轻松适合他们的入门级计划。
使用 Claude 进行 AI 个性化
这是事情变得有趣的地方。Claude 集成不仅仅是「给我写一封冷邮件」。这是一个多步骤的研究和写作管道。
步骤 1:网站分析
在 Claude 写任何内容之前,我们向它提供有关潜在客户网站的数据。我们使用轻量级函数进行抓取:
async function analyzeProspectSite(domain: string) {
// 获取主页和关键页面
const homepage = await fetch(`https://${domain}`);
const html = await homepage.text();
// 从 HTML 中提取技术信号
const signals = {
hasNextJs: html.includes('__next') || html.includes('_next/static'),
hasReact: html.includes('react') || html.includes('__REACT'),
hasWordPress: html.includes('wp-content') || html.includes('wp-includes'),
hasShopify: html.includes('shopify') || html.includes('cdn.shopify'),
hasGatsby: html.includes('gatsby'),
usesJQuery: html.includes('jquery'),
metaGenerator: extractMeta(html, 'generator'),
pageSize: html.length,
// ... 更多信号
};
// 通过 API 运行 PageSpeed 检查
const psiData = await fetchPageSpeedInsights(domain);
return {
...signals,
performanceScore: psiData.lighthouseResult.categories.performance.score * 100,
lcp: psiData.lighthouseResult.audits['largest-contentful-paint'].numericValue,
cls: psiData.lighthouseResult.audits['cumulative-layout-shift'].numericValue,
fid: psiData.lighthouseResult.audits['max-potential-fid'].numericValue
};
}
这为 Claude 提供了真实的数据来处理。不是「嗨,我注意到你的公司做 X」——更像是「你的主页 LCP 是 4.2 秒,你仍然在 React 旁边运行 jQuery,这为你的初始包添加了 90KB。」
步骤 2:Claude 研究提示
我们使用 Claude 的 API,带有精心制作的系统提示。以下是简化版本:
const researchPrompt = `你是一名高级网络开发人员,为无头开发代理商分析潜在客户的网站。根据有关他们网站的以下技术数据,确定:
1. 他们的当前技术栈(要具体)
2. 2-3 个具体的性能或架构问题
3. 迁移到现代无头架构可能改进什么
4. 一个具体的、不明显的观察,显示真正的分析
不要是通用的。如果你找不到具体的东西,就说吧。
不要提及「在当今的数字时代」或类似的填充物。
直接且技术性。
网站数据:
${JSON.stringify(siteAnalysis, null, 2)}
潜在客户:${lead.first_name} ${lead.last_name},${lead.position} 在 ${lead.domain}`;
const research = await anthropic.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 1000,
messages: [{ role: 'user', content: researchPrompt }]
});
步骤 3:电子邮件生成
研究输出进入第二个 Claude 调用,该调用编写实际的电子邮件。将研究与写作分开是一个关键的见解——当我们尝试在一个提示中同时进行两者时,电子邮件会变得更糟。Claude 会跳过研究以更快地开始写作。
const emailPrompt = `从无头网络代理商的高级开发人员那里写一封冷邮件。
研究笔记:
${research.content[0].text}
规则:
- 最多 4-6 句。每句话都必须赚取它的位置。
- 以最具体的技术观察开头。
- 没有奉承。没有「我喜欢你在做的事情。」
- 一个清晰的 CTA:询问他们是否想看性能审计。
- 听起来像一个开发人员,而不是销售人员。
- 使用他们的名字。签名中没有姓氏。
- 主题行:简短,特定于他们的技术问题,小写。`;
结果?电子邮件以「你的 Shopify Plus 商店正在服务器渲染可以静态生成的产品页面——这为每个产品视图增加了 2+ 秒」之类的内容开头,而不是「我注意到你令人印象深刻的公司,想要联系」。
Supabase 作为编排层
Supabase 是操作的大脑。以下是我们的核心模式:
create table leads (
id uuid primary key default gen_random_uuid(),
domain text not null,
email text,
first_name text,
last_name text,
position text,
confidence int,
status text default 'new', -- new, enriched, researched, drafted, approved, sent, replied, bounced
site_analysis jsonb,
research_notes text,
email_subject text,
email_body text,
instantly_campaign_id text,
sent_at timestamptz,
opened_at timestamptz,
replied_at timestamptz,
created_at timestamptz default now(),
updated_at timestamptz default now()
);
create index idx_leads_status on leads(status);
create index idx_leads_domain on leads(domain);
status 字段驱动一切。Supabase Cron 作业每 15 分钟运行一次,在每个阶段接上线索并将它们推送到下一个:
-- Cron:处理通过 Claude 研究的丰富线索
select cron.schedule(
'process-research',
'*/15 * * * *',
$$select net.http_post(
'https://your-project.supabase.co/functions/v1/process-research',
'{}',
'{"Authorization": "Bearer your-service-key"}'::jsonb
)$$
);
我们每次批量处理 20 条线索,以保持在 Claude 的速率限制内,并保持成本可预测。
site_analysis JSONB 列非常有用。我们可以查询所有线索以查找模式——例如「显示我所有运行 WordPress 且性能分数低于 50 的线索」——并从这些细分市场构建有针对性的活动。
使用 Instantly 大规模发送
Instantly 处理实际的电子邮件传递。我们通过他们的 API 推送获批的电子邮件:
async function pushToInstantly(lead: Lead) {
const response = await fetch('https://api.instantly.ai/api/v1/lead/add', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
api_key: INSTANTLY_API_KEY,
campaign_id: lead.instantly_campaign_id,
skip_if_in_workspace: true,
leads: [{
email: lead.email,
first_name: lead.first_name,
last_name: lead.last_name,
company_name: lead.domain,
personalization_1: lead.email_subject,
personalization_2: lead.email_body
}]
})
});
if (response.ok) {
await supabase
.from('leads')
.update({ status: 'sent', sent_at: new Date().toISOString() })
.eq('id', lead.id);
}
}
Instantly 的活动模板使用 {{personalization_1}} 和 {{personalization_2}} 变量,这些变量映射到我们 Claude 生成的主题和正文。活动本身只是一个壳——所有的智能都在我们的系统中。
我们在任何外展之前通过 Instantly 的预热至少运行 3 个发送帐户 2 周。域预热不是可选的。我们在第一个域在一周内被标记时以艰难的方式学到了这一点。
可递送性设置
我们的发送基础设施:
- 3 个域(我们品牌的变体,而不是我们的主要域)
- 所有这些域上都配置了 SPF、DKIM 和 DMARC
- Google Workspace 帐户(不是 Outlook——Google 在我们的测试中更好地处理冷邮件)
- Instantly 预热持续运行,即使在活跃发送天也是如此
- 每个帐户每天最多 35 封电子邮件
- 发送间隔 3-7 分钟的随机间隔
自动化粘合剂
Supabase 边缘函数连接所有内容。以下是流程的伪代码:
每 15 分钟:
1. 拿起状态='new' 的线索,运行 Hunter 丰富 → 状态='enriched'
2. 拿起状态='enriched' 的线索,运行网站分析 → 状态='analyzed'
3. 拿起状态='analyzed' 的线索,运行 Claude 研究 + 电子邮件生成 → 状态='drafted'
4. (人工在 Supabase 仪表板中审核起草的电子邮件)
5. 拿起状态='approved' 的线索,推送到 Instantly → 状态='sent'
6. 从 Instantly API 拉取参与度数据 → 更新 opened_at、replied_at
第 4 步很重要。我们不会完全自动化发送。每封电子邮件都要在发送前进行人工审核。这抓住了偶尔的幻觉(Claude 曾声称网站是用 Remix 构建的,而它显然是 Next.js),并让我们添加个人风格。
审核步骤每封电子邮件大约需要 2-3 秒,因为 Claude 正确处理 95% 的工作。我们使用简单的 Supabase 仪表板视图批量批准。
结果和我们学到的内容
我们从 2025 年 Q1 开始运行此系统。以下是真实数据:
| 指标 | 我们的系统 | 行业平均值 (2026) |
|---|---|---|
| 打开率 | 62% | 24% |
| 回复率 | 8.4% | 1-3% |
| 正面回复率 | 4.1% | 0.5-1% |
| 反弹率 | 0.8% | 3-5% |
| 每个联系线索的成本 | $0.18 | $0.50-2.00 |
| 每条线索的时间(人工) | ~5 秒(审核) | 10-15 分钟 |
打开率很高,因为主题行是具体的。「你的 shopify lcp 是 4.2s」会被打开。「快速问题」不会。
回复率很高,因为电子邮件展示了真正的技术知识。当 CTO 读到正确识别他们技术栈和真实性能问题的电子邮件时,他们更有可能进行互动——即使他们知道这是外展。
不起作用的事情
完全自动化发送(无人工审核): 我们尝试了两周。Claude 幻觉了大约 5% 的技术栈细节。对于 LLM 来说,这是一个低错误率,但向运行 Vue 的人发送一封说「你的 React 应用」的电子邮件比发送通用电子邮件更糟。信任伤害是真实的。
长电子邮件: 我们的第一个 Claude 提示生成了 8-10 句电子邮件。回复率是我们现在看到的 4-6 句的一半。更短总是更好。一直都是。
每天每个帐户发送超过 40 封电子邮件: 可递送性下降陡峭。30-35 是 2026 年的甜蜜点。
根据打开的 Claude 进行后续跟进: 我们尝试生成由打开触发的后续电子邮件。后续感觉很有侵犯性,转化不值得成本。我们现在三天后发送一个简单的非 AI 后续。
成本分析
以下是此成本每月的情况,处理大约 2,000 条线索:
| 服务 | 月成本 | 说明 |
|---|---|---|
| Hunter.io(入门版) | $49 | 500 次搜索 + 验证 |
| Anthropic API (Claude) | $45 | ~2,000 次研究 + 电子邮件生成 |
| Supabase(专业版) | $25 | 数据库、边缘函数、Cron |
| Instantly(增长版) | $30 | 发送、预热、分析 |
| Google Workspace(3 个帐户) | $21 | 发送基础设施 |
| 域名(3 个) | $10 | 摊销年度成本 |
| 总计 | ~$180 | 每条线索处理成本 $0.09 |
将其与 Apollo 的 $79/月计划(有限丰富、基本序列)或 Lemlist 的 $69/月/用户进行比较。我们花费更少,获得显著更好的结果,因为个性化是真实的,而不是基于模板的。
就上下文而言,此系统直接产生了导致 Next.js 开发和 Astro 开发项目的线索,价值 50-100 倍的月度成本。ROI 是荒唐的。
常见问题
构建此系统需要多长时间? 第一个可用的版本花费了大约两周的兼职工作——总共约 40 小时。从那时起我们不断迭代,主要是调整 Claude 提示和添加边缘情况处理。如果你对 Supabase 边缘函数和 REST API 感到满意,你可以在一个周末内让基本版本运行。
这不只是有额外步骤的垃圾邮件吗? 公平的问题。区别在于每封电子邮件都包含对收件人网站的真实技术观察。我们没有向 10,000 人爆炸「让我们进行通话」。我们向实际拥有我们解决的问题的目标列表中的人发送具体、有用的见解。我们的取消订阅率低于 0.5%,这表明收件人也不将其视为垃圾邮件。
为什么选择 Claude 而不是 GPT-4 或 Gemini? 我们测试了所有三个。Claude 更可靠地遵循了我们的系统提示——特别是「不要是通用的」和「不要使用填充短语」之类的约束。GPT-4 会向销售语言漂移,即使有明确的指令也不会。Gemini 速度很快,但输出质量不一致。随着模型的发展,这可能会改变,我们的系统设计为可以轻松交换模型。
你如何处理 GDPR 和 CAN-SPAM 合规性? 我们所有的外展都针对商业电子邮件(而不是个人),包括我们的实际地址,每封电子邮件中都有明确的选择退出。对于 GDPR,我们根据 B2B 外展的合法利益处理数据,维护处理活动的记录,并通过自动化 webhook 立即处理移除请求。我们还自动清除超过 90 天的线索从我们的数据库中。为了你的具体情况,请咨询律师——这不是法律建议。
当线索回复时会发生什么? Instantly API 的回复流回 Supabase。我们为每条回复收到 Slack 通知,人工立即接手对话。我们从不使用 AI 进行回复处理。一旦有人互动,他们应该得到一个真实的人。感兴趣的潜在客户被指向我们的联系页面或直接进行通话预约链接。
这种方法对非技术服务有效吗? 网站分析部分是特定于网络开发的,但架构模式——丰富线索、使用 AI 进行研究和个性化、通过专用工具发送——适用于任何 B2B 外展。你只需要不同的研究输入。设计代理商可能会分析视觉设计和 UX 模式。营销代理商可能会拉取 SEO 指标。关键是向 Claude 提供真实数据,而不是要求它编造东西。
维护此系统最难的部分是什么? 提示维护。随着 Claude 模型的更新,完美运行的提示有时需要调整。我们还花费时间监控电子邮件可递送性——检查 Google Postmaster Tools、注意垃圾邮件率激增、轮换发送帐户。这总共每周大约 2-3 小时的维护。
你会将此作为产品销售吗? 我们考虑过,但诚实地说,竞争优势太有价值了。如果每个代理商都运行这个确切的系统,有效性会下降,因为收件人开始到处看到 AI 研究的电子邮件。目前,我们将其作为内部工具保留。如果你想帮助为你的业务构建类似的东西,联系我们——我们已经帮助一些客户设置了类似的系统,作为我们无头 CMS 开发工作的一部分。