TL;DR: 首批 100 位付费客户决定了你的 SaaS 能否活下去。本框架将获客流程拆解为四个阶段——Define(定义)、Reach(触达)、Convert(转化)、Retain(留存)——每个阶段都有具体打法。你将学会如何通过内容营销、社区运营和产品驱动增长(PLG)构建客户获取管道——全部零付费广告。附赠完整的 UTM 追踪设置方案、落地页转化优化模式和将客户转化为销售力量的推荐系统架构。
The First 100 Problem(首批 100 客户难题)
每位 SaaS 创始人都面临同样的先有鸡还是先有蛋的困境:你需要客户来验证产品,但你需要一个已验证的产品来获取客户。数据令人警醒:
| 指标 | 数值 | 来源 |
|---|---|---|
| 首批 100 位客户前倒下的 SaaS 初创公司 | ~60% | CB Insights |
| 达成首批 100 位客户的平均耗时(自筹阶段) | 6-12 个月 | Baremetrics |
| 首批 100 位客户的获取成本(自筹阶段) | $50-500 | OpenView |
| 首批 100 位客户的主要渠道 | 创始人主导销售 & 内容 | SaaS Labs |
| 产品市场契合前就投付费广告的初创公司 | 70% 烧光退出 | Lenny Rachitsky |
以下框架假设零营销预算。每个打法消耗的是时间,不是钱——因为在拥有 100 位付费客户之前,你唯一可扩展的资源就是自己的努力。
Stage 1: Define — 首批 100 位客户是谁?
大多数创始人的网撒得太广。首批 100 位客户具有一些共同特征:
理想客户画像(ICP)工作表
// src/lib/marketing/icp.ts
interface ICP {
role: string
companySize: string
techStack: string[]
painPoint: string
budget: string
whereTheyHangOut: string[]
}
// Example ICP for TanStack Ship:
const icpTanStackShip: ICP = {
role: "Indie founder / Full-stack developer",
companySize: "1-10 employees",
techStack: ["React", "TypeScript", "Cloudflare", "Node.js"],
painPoint: "Building SaaS boilerplate from scratch takes 4-8 weeks",
budget: "$200-500 for tools per month",
whereTheyHangOut: [
"r/reactjs", "r/webdev", "r/SaaS",
"Hacker News", "X/Twitter #buildinpublic",
"Indie Hackers", "React Discord",
],
}
练习:写下 10 个会为你的产品付费的真实用户的名字。如果连 10 个都想不出来,说明你的 ICP 定义还不够具体。这 10 个人将成为你的首批外展目标。
100 人管道漏斗
目标 500 → 触达 200 → 演示 50 → 付费 100
(外展) (回复) (转化) (激活)
每个阶段都需要特定的转化策略:
| 管道阶段 | 目标 | 转化策略 | 工具 |
|---|---|---|---|
| 外展 | 500 个潜在客户 | 个性化冷邮件/DM | Clay + Apollo |
| 回复 | 200 条回复 | 价值优先的信息 | 你的收件箱 |
| 演示 | 50 场演示 | 问题感知型话术 | Calendly |
| 付费 | 100 位客户 | 限时创始人优惠 | Stripe |
Stage 2: Reach — 如何出现在对的人面前
战术 1:社区优先内容(技术型 SaaS 最高 ROI)
与其广播"买我的产品",不如在 ICP 活跃的社区中提供真正的价值:
// src/lib/marketing/content-strategy.ts
const contentPlan = [
{
platform: "r/reactjs",
format: "Tutorial",
topic: "How to implement file-based routing with TanStack Router",
callToAction: "Mention TanStack Ship as a complete starter",
frequency: "1x per week",
},
{
platform: "Hacker News",
format: "Show HN",
topic: "Show HN: I built a SaaS starter with TanStack Start + Cloudflare Workers",
callToAction: "Direct link to landing page",
frequency: "At launch + major updates",
},
{
platform: "X/Twitter",
format: "Build in public",
topic: "Daily progress on SaaS features, revenue, users",
callToAction: "Link in bio + profile",
frequency: "Daily",
},
{
platform: "Indie Hackers",
format: "Interview / Milestone",
topic: "How I reached $1k MRR with TanStack Ship",
callToAction: "Link to product",
frequency: "Monthly",
},
]
这份内容计划确保你持续出现在 ICP 常驻的平台。每条内容都承载双重使命:为社区提供真正的价值,同时在讨论相关问题时自然引出你的产品作为解决方案。
战术 2:创始人主导的冷外展
个性化冷邮件在方法正确的情况下依然有效:
// Template: High-value cold email
const coldEmailTemplate = `Subject: Quick question about ${prospect.tool}
Hey ${prospect.firstName},
I noticed you built ${prospect.project} with ${prospect.techStack}.
I am working on [Your Product] — a [one-line value prop]. Since you are already using ${sharedInterest}, I would love your feedback.
No pitch, just 10 minutes to show you what I am building and get your honest thoughts.
Are you open to a quick call this week?
Best,
${yourName}`
500 封冷邮件的行业基准数据:
- 打开率:45-60%
- 回复率:10-20%
- 预约演示:3-5%
- 转化为客户:1-2%
战术 3:带有 SEO 护城河的内容营销
创作能占领 ICP 搜索的长尾关键词内容。对于基于 TanStack 的 SaaS:
| 关键词 | 月搜索量 | 竞争度 | 内容类型 |
|---|---|---|---|
| "TanStack Start tutorial" | 2.4K/月 | 低 | 教程 |
| "Cloudflare Workers SSR" | 1.8K/月 | 低-中 | 指南 |
| "how to build a SaaS solo" | 3.2K/月 | 中 | 框架文章 |
| "SaaS boilerplate comparison" | 1.2K/月 | 中 | 对比 |
Stage 3: Convert — 将兴趣转化为收入
落地页转化架构
// src/components/marketing/HeroSection.tsx
export function HeroSection() {
return (
<section className="max-w-4xl mx-auto text-center py-20">
{/* 1. Problem-aware headline */}
<h1 className="text-5xl font-bold mb-4">
Ship Your SaaS in Weeks, Not Months
</h1>
{/* 2. Specific value proposition */}
<p className="text-xl text-gray-600 mb-8">
TanStack Ship gives you a production-ready SaaS starter with
authentication, billing, UTM tracking, and email campaigns —
so you can focus on your unique product logic.
</p>
{/* 3. Social proof */}
<div className="flex justify-center gap-8 mb-12">
<div className="text-center">
<div className="text-3xl font-bold">50+</div>
<div className="text-sm text-gray-500">Early adopters</div>
</div>
<div className="text-center">
<div className="text-3xl font-bold">4+</div>
<div className="text-sm text-gray-500">Weeks saved</div>
</div>
<div className="text-center">
<div className="text-3xl font-bold">100%</div>
<div className="text-sm text-gray-500">TypeScript</div>
</div>
</div>
{/* 4. Primary CTA */}
<div className="flex justify-center gap-4">
<Link
to="/pricing"
className="bg-blue-600 text-white px-8 py-3 rounded-lg text-lg font-semibold hover:bg-blue-700"
>
Start Building →
</Link>
<Link
to="/blog/tanstack-start-end-to-end-tutorial"
className="border border-gray-300 px-8 py-3 rounded-lg text-lg font-semibold hover:bg-gray-50"
>
Read the Tutorial
</Link>
</div>
</section>
)
}
这个英雄区遵循经过验证的转化模式:问题感知型标题 → 具体价值主张 → 社会证明(数字)→ 清晰的 CTA 并附上教育内容的次要链接。每个元素都建立在前一个元素之上,逐步消除用户顾虑。
转化优化的定价页
追踪潜在客户查看了哪些定价方案、以及他们从哪个 UTM 来源到来,有助于你理解哪些渠道带来了高意向流量。以下服务端函数记录每次定价页访问及其归因数据:
export const trackPricingView = createServerFn({ method: "POST" }).handler(
async ({ plan, utmSource }: { plan: string; utmSource?: string }) => {
await env.DB.prepare(
`INSERT INTO conversion_events
(event_type, plan, utm_source, page_url, timestamp)
VALUES ('pricing_view', ?, ?, ?, unixepoch())`
).bind(plan, utmSource ?? "direct", getCurrentUrl())
.run()
}
)
有了这些数据,你可以按渠道和按方案计算转化率,从而将营销精力集中在吸引愿意为高级方案付费客户的渠道上。
创始人折扣策略
对于首批 100 位客户,使用递进折扣来制造紧迫感,同时不贬低产品价值:
| 已获客数量 | 折扣幅度 | 理由 |
|---|---|---|
| 1-25 | 终身 40% off | 最大激励,换取早期反馈 |
| 26-50 | 年度 30% off | 仍有诚意,建立动能 |
| 51-75 | 年度 20% off | 验证增长中,折扣递减 |
| 76-100 | 年度 10% off | 接近原价 |
| 100+ | 全价 | 市场验证已完成 |
Stage 4: Retain — 留住并扩展首批 100 位客户
首批 100 位客户的流失是致命的——如果流失率为 20%,你需要 20 个新客户才能维持现状。重点应放在激活上,而不仅仅是获客。
激活指标仪表盘
-- Track activation events per user
CREATE TABLE activation_events (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
event_type TEXT NOT NULL CHECK (
event_type IN (
'signed_up', 'completed_onboarding',
'created_first_project', 'invited_team_member',
'connected_payment', 'deployed_to_production'
)
),
occurred_at INTEGER NOT NULL DEFAULT (unixepoch()),
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- Activation health view
CREATE VIEW user_activation_status AS
SELECT
u.id,
u.email,
u.created_at,
MAX(CASE WHEN ae.event_type = 'completed_onboarding' THEN 1 ELSE 0 END) as onboarded,
MAX(CASE WHEN ae.event_type = 'created_first_project' THEN 1 ELSE 0 END) as created_project,
MAX(CASE WHEN ae.event_type = 'deployed_to_production' THEN 1 ELSE 0 END) as deployed,
CASE
WHEN MAX(ae.event_type = 'deployed_to_production') THEN 'Fully Activated'
WHEN MAX(ae.event_type = 'created_first_project') THEN 'Exploring'
WHEN MAX(ae.event_type = 'completed_onboarding') THEN 'Onboarded'
ELSE 'Stuck'
END as activation_stage
FROM users u
LEFT JOIN activation_events ae ON ae.user_id = u.id
GROUP BY u.id;
每周留存邮件序列
// src/lib/email/retention.ts
const retentionSequence = [
{
day: 1,
subject: "Welcome to TanStack Ship — Your First Project",
content: "Step-by-step guide to deploying your first app",
cta: "Deploy Now",
},
{
day: 3,
subject: "Tip: Authentication is Already Set Up",
content: "How to customize the auth flow for your brand",
cta: "View Auth Docs",
},
{
day: 7,
subject: "35% of Users Miss This Feature (UTM Tracking)",
content: "How to track every customer acquisition channel",
cta: "Set Up UTM",
},
{
day: 14,
subject: "You Have Been Using TanStack Ship for 2 Weeks",
content: "Here is what you have built so far + what you might have missed",
cta: "See Progress",
},
{
day: 30,
subject: "One Month In — How Can We Help?",
content: "Personal check-in from the founder",
cta: "Book a Call",
},
]
这个结构化邮件序列引导新用户从注册到激活、再到全面使用产品。每条消息聚焦单一行动或功能,减少认知负担,提高用户完成每个步骤的概率。
NPS + 流失预防闭环
// Score-based intervention
export async function handleNpsResponse(
userId: string,
score: number,
feedback: string
) {
if (score >= 9) {
// Promoter → Ask for referral
await triggerReferralPrompt(userId)
} else if (score <= 6) {
// Detractor → Immediate founder outreach
await notifyFounder(userId, feedback)
await scheduleRecoveryCall(userId)
}
await env.DB.prepare(
`INSERT INTO nps_responses (user_id, score, feedback, responded_at)
VALUES (?, ?, ?, unixepoch())`
).bind(userId, score, feedback).run()
}
这个基于 NPS 评分的干预系统将推荐者(9-10 分)视为推荐机会,将贬低者(0-6 分)视为挽回机会。核心洞察是:一次及时的创始人电话可以将贬低者转化为忠诚客户——许多流失风险实际上只是未被回答的问题。
用 UTM 归因追踪一切
无法衡量就无法优化。从第一天起就建立 UTM 追踪:
// src/lib/marketing/utm.ts
import { useSearchParams } from "@tanstack/react-router"
export function useUtmCapture() {
const [searchParams] = useSearchParams()
const utmData = {
source: searchParams.get("utm_source") ?? "direct",
medium: searchParams.get("utm_medium") ?? "none",
campaign: searchParams.get("utm_campaign") ?? "none",
term: searchParams.get("utm_term") ?? "none",
content: searchParams.get("utm_content") ?? "none",
}
// Persist UTM parameters across the session
useEffect(() => {
if (utmData.source !== "direct") {
localStorage.setItem("utm_data", JSON.stringify(utmData))
trackUtmVisit(utmData) // Server-side tracking
}
}, [searchParams])
return utmData
}
归因表格:展示哪些渠道驱动了你的首批 100 位客户:
| 渠道 | 占首批 100 客户的 % | 成本 | 转化率 | 到首次付费的时间 |
|---|---|---|---|---|
| 内容营销(博客) | 30% | 仅时间 | 2-5% | 14-30 天 |
| 社区(Reddit/HN) | 25% | 仅时间 | 3-8% | 7-21 天 |
| 创始人冷外展 | 20% | 仅时间 | 1-3% | 3-14 天 |
| 产品驱动(病毒/推荐) | 15% | 内置 | 5-15% | 1-7 天 |
| 合作伙伴 | 10% | 收入分成 | 10-25% | 30-90 天 |
首批 100 客户仪表盘
构建一个简易仪表盘实时追踪进展:
CREATE VIEW first_100_dashboard AS
SELECT
COUNT(DISTINCT u.id) as total_users,
COUNT(DISTINCT CASE WHEN s.status = 'active' THEN u.id END) as paying_customers,
COUNT(DISTINCT CASE WHEN ae.event_type = 'deployed_to_production' THEN u.id END) as activated_users,
ROUND(AVG(CASE WHEN s.status = 'active' THEN s.mrr END), 2) as avg_mrr,
ROUND(SUM(CASE WHEN s.status = 'active' THEN s.mrr END), 2) as total_mrr,
ROUND(
100.0 * COUNT(DISTINCT CASE WHEN s.status = 'active' THEN u.id END) /
NULLIF(COUNT(DISTINCT u.id), 0), 1
) as conversion_rate,
ROUND(
100.0 - 100.0 * COUNT(DISTINCT CASE WHEN s.status = 'canceled' THEN u.id END) /
NULLIF(COUNT(DISTINCT CASE WHEN s.status IN ('active', 'canceled') THEN u.id END), 0), 1
) as retention_rate
FROM users u
LEFT JOIN subscriptions s ON s.user_id = u.id
LEFT JOIN activation_events ae ON ae.user_id = u.id;
这个仪表盘视图让你实时看到客户获取管道的快照:有多少用户注册、有多少在付费、有多少已激活(达到"啊哈时刻")、以及平均每位客户的收入。每周追踪这些指标,可以判断你的增长引擎是否在正常运转。
执行时间线:90 天获取 100 位客户
| 周次 | 重点 | 关键活动 | 目标客户数 |
|---|---|---|---|
| 1-2 | 定义 & 构建 | 定稿 ICP,准备 500 人外展名单,发布 2 篇 SEO 文章 | 0 |
| 3-4 | 触达(冷启动) | 发送 250 封个性化冷邮件,在 5 个社区发帖 | 5-10 |
| 5-6 | 触达(内容) | 再发布 2 篇文章、15 条社媒帖、5 条论坛回复 | 15-25 |
| 7-8 | 转化 | 20-30 场演示,上线创始人折扣,优化定价页 | 30-45 |
| 9-10 | 推荐 | 激活推荐系统,请求推荐者做介绍 | 50-70 |
| 11-12 | 规模化 | 加码最佳渠道,根据反馈迭代 | 80-100 |
结语
获取首批 100 位付费客户没有银弹——靠的是在增长框架四个阶段上的系统执行:
- 定义:在动手构建任何东西之前,精确知道你的首批 100 位客户是谁
- 触达:通过社区内容、个性化外展和 SEO 出现在他们面前,无需付费广告
- 转化:构建转化优化的落地页,策略性使用创始人折扣,用 UTM 追踪每个触点
- 留存:追踪激活(不仅仅是注册),自动化留存邮件,将推荐者转化为推荐引擎
成功的初创公司不是拥有最好产品或最多资金的那些——而是那些每天都与用户交流、不断迭代、并从第一天起追踪每个指标的那些。
你的首批 100 位客户就在那里。他们正在寻找你正在解决的问题的解决方案。去找到他们吧。完整的归因追踪设置方案,请参阅 UTM Attribution Complete Guide,了解如何将最满意的客户转化为增长引擎,请参阅 Referral Reward System。Email Marketing Automation 指南涵盖了从注册到付费客户的完整序列,Zero to MVP in 4 Weeks 蓝图帮助你在执行这个增长框架的同时构建产品。