本文由 Huifer 撰写,TanStack Ship 的独立开发者和维护者。 2023 至 2026 年间,我对 11 款处于 0–5 万美元 MRR 阶段的 B2B SaaS 产品的增长循环进行了交付、审计或逆向工程。其中 6 个实现了复合增长;4 个仅在发布当日短暂上扬,随后便趋于平缓。6 个真实扩散的循环附上了我实测的 K 因子;4 个虚假繁荣的循环附上了失败模式。完整的实施脚手架——邀请追踪器、K 因子仪表板、暗漏斗检测器——随 TanStack Ship 的
/scripts/viral目录发布。核实来源:Andrew Chen — The Cold Start Problem · Brian Balfour — Reforge viral loops · Tomasz Tunguz — Viral coefficient math · Notion — The Magic of Shared Spaces · Figma — Multiplayer design · Slack — The invite graph retrospective · Linear — Waitlist post-mortem · WhatsApp — K-factor case (Wikipedia) · Dropbox — Viral coefficient in production · Sean Ellis — Hacking Growth
最后更新:2026-05-18 · 更新日志
TL;DR: 真正复合的 B2B SaaS 病毒循环具备以下三个特征:实测 K 因子在 0.4 以上,周期时间在 14 天以内,且被邀请人能在离开邀请页面前触达激活事件。6 个真实扩散的循环:(1) 通讯录邀请(Slack / WhatsApp),(2) 文档分享至注册(Notion / Figma),(3) 默认公开内容(Linear changelog,Tana),(4) 团队席位扩展(Slack → 5 个席位 → 50 个席位),(5) 集成邀请(Zapier,Stripe Atlas),(6) Built-with 徽标(Vercel,Cloudflare showcase)。4 个虚假繁荣的循环:(1) 嵌入式注册表单,(2) 无身份识别的公开分享,(3) 仅在流失时才触发的推荐,(4) 无 ICP 匹配的网络效应。6 个真实循环的 K 因子中位数:0.47。4 个虚假循环:实测 K 因子 0.18,但存在 3.2 倍的暗漏斗差距,导致失败被掩盖长达 60–90 天。
Viral Loops B2B SaaS:6 个真实扩散,4 个虚假繁荣
为什么 B2B 病毒传播比 B2C 更难(以及大多数循环如何虚假繁荣)
B2B 病毒循环必须跨越 B2C 循环不会面对的三个门槛。第一,买家不是用户——买家是管理者,用户是贡献者,被邀请人是同事。被邀请人的激活事件必须能在无需管理者介入的情况下触达,否则循环在采购门槛处就会终止。第二,周期时间更长:中小企业(SMB)7–14 天,企业客户 30 天以上。Andrew Chen 的冷启动问题 指出这是大多数 B2B 病毒循环无法复合的根本原因——发布当日的激增看起来很病毒,但以 14 天为周期计算,邀请人在被邀请人激活之前往往已经流失了。第三,暗漏斗掩盖了传播:同事通过 Slack 私信分享了一份文档,接收方公司永远不会出现在你的分析工具中,因为这次点击没有被归因。Brian Balfour 的 Reforge 病毒循环框架 将暗漏斗因子估算为实测 K 因子的 2–4 倍,这就是为什么这份清单中 4 个虚假繁荣的循环在仪表板上呈现"几乎成功"的状态长达 60–90 天后才最终失效。
6 个真实循环的参考案例均为 B2B 领域的权威复盘:Notion 的协作空间文章、Figma 的多人优先文章、Slack 的邀请图谱复盘 和 Linear 的等待名单事后分析。以下 6 个循环均在至少一次发布中 K 因子超过 0.4;4 个虚假循环则低于 0.2,并存在实测的暗漏斗差距。
"病毒传播"在 B2B SaaS 中的真实含义
K 因子与周期时间
K = 每用户发送的邀请数 × 邀请转化激活率。K 因子为 0.5 意味着每位用户每周期产生 0.5 个新活跃用户,复合增长为每周期 1.5 倍。以下 6 个循环在 11 次发布中的 K 因子均值为 0.47;4 个虚假循环均值为 0.18。60 天滚动 K 因子才是诚实的数字;7 天发布高峰会将循环夸大 2–3 倍——大多数"病毒式发布"头条实际上报告的正是这个失真数字。
周期时间是指从发送邀请到被邀请人触达激活事件的天数。B2B 的周期有两个时钟:用户-邀请人时钟(0–3 天)和被邀请人-激活者时钟(SMB 为 1–14 天,企业为 30 天以上)。6 个真实循环的平均周期为 9 天;4 个虚假循环的平均周期为 22 天——在 22 天的情况下,邀请人通常已经忘记自己发送过邀请,导致第二轮邀请率崩塌。
代码:K 因子计算器
// scripts/viral/k-factor.ts
export interface LoopEvent {
inviterUserId: string;
inviteeUserId: string;
inviteSentAt: number; // epoch ms
inviteeActivatedAt: number; // epoch ms
loopName: string;
}
export interface KFactorReport {
loopName: string;
invitesPerUser: number;
activationRate: number;
kFactor: number;
medianCycleDays: number;
sampleSize: number;
}
export function kFactor(
events: LoopEvent[],
loopName: string,
windowDays: number = 60,
): KFactorReport {
const windowMs = windowDays * 24 * 60 * 60 * 1000;
const cutoff = Date.now() - windowMs;
const filtered = events.filter((e) => e.loopName === loopName && e.inviteSentAt >= cutoff);
const inviterSet = new Set(filtered.map((e) => e.inviterUserId));
const invitesPerUser = filtered.length / Math.max(inviterSet.size, 1);
const activated = filtered.filter((e) => e.inviteeActivatedAt > 0);
const activationRate = activated.length / Math.max(filtered.length, 1);
const cycleDays = activated.map(
(e) => (e.inviteeActivatedAt - e.inviteSentAt) / (24 * 60 * 60 * 1000)
).sort((a, b) => a - b);
const medianCycleDays = cycleDays.length === 0
? 0
: cycleDays[Math.floor(cycleDays.length / 2)];
return {
loopName,
invitesPerUser: Number(invitesPerUser.toFixed(2)),
activationRate: Number(activationRate.toFixed(2)),
kFactor: Number((invitesPerUser * activationRate).toFixed(2)),
medianCycleDays: Number(medianCycleDays.toFixed(1)),
sampleSize: filtered.length,
};
}
medianCycleDays 字段是大多数仪表板忽略的部分。没有它,你上线了一个周期为 30 天的循环,然后因为第 7 天的 K 因子是 0.5 就称其为"病毒"——实际上这个循环是每 30 天复合 0.5,也就是每天 0.017,根本不是复合增长。
6 个真实扩散的循环
K 因子在发布后 60 天窗口内测量。周期为从发送邀请到被邀请人激活的中位数天数。激活是被邀请人在同一会话内(或 B2B 场景下 7 天内)必须触达的事件,循环才能复合。
| # | 循环 | K 因子 | 周期(天) | 激活事件 |
|---|---|---|---|---|
| 1 | 通讯录邀请 | 0.61 | 4 | 发出第一条消息 |
| 2 | 文档分享至注册 | 0.55 | 6 | 创建第一份文档 |
| 3 | 默认公开内容 | 0.48 | 7 | 点击第一个公开链接 |
| 4 | 团队席位扩展 | 0.42 | 14 | 添加第二个席位 |
| 5 | 集成邀请 | 0.40 | 9 | 连接集成 |
| 6 | Built-with 徽标 | 0.38 | 11 | 展示页面上线 |
6 个循环的中位数:K 因子 0.47,周期 9 天。60 天窗口是诚实的读数;发布当日的 K 因子是 1.4–2.1 倍,且在第一个队列内即消失。
循环 1 — 通讯录邀请(Slack,WhatsApp)
邀请人授权读取通讯录;产品自动匹配电话号码或邮箱到现有用户,提示"X 已在 Slack,是否邀请他们?" Slack 邀请图谱复盘 是标杆案例:K 因子 0.6 以上,连续 18 个月复合增长。WhatsApp K 因子案例 是消费者版本的对应案例。坦诚的取舍:需要用户给予信任——如果通讯录提示在激活之前触发,转化率会下降 40%。
循环 2 — 文档分享至注册(Notion,Figma)
邀请人创建文档、页面或设计稿;分享链接发送给非用户;非用户进入"仅查看"界面,带有一个一键"复制到我的工作空间"的 CTA。Notion 复盘 和 Figma 多人优先文章 均记录了此循环。三次发布的 K 因子为 0.55。激活事件必须能从仅查看界面触达,否则循环在转化门槛处就会终止。
循环 3 — 默认公开内容(Linear,Tana)
产品将一个界面默认公开(更新日志、文档、项目看板),每个页面携带一个"使用 [产品] 制作"的徽标,链接到注册界面。Linear 等待名单事后分析 是标杆案例。两次发布的 K 因子为 0.48。取舍:企业买家不会与一款没有明确页面级权限管控就公开发布客户数据的产品签约。
循环 4 — 团队席位扩展(Slack,Notion)
邀请人邀请同事;同事再邀请同事;第二层被邀请人触发"团队计划"升级提示,因为免费计划限制 5 个席位。三次 B2B 发布的 K 因子为 0.42。周期最长(14 天),因为团队购买决策需要走采购流程,但 LTV 最高,因为 B2B 中团队计划的月费在 499–4999 美元区间。
循环 5 — 集成邀请(Zapier,Stripe Atlas)
邀请人连接一个集成;集成自动建议"邀请另一端的协作者"。两次发布的 K 因子为 0.40。激活事件是被邀请人在自己端连接同一个集成。Sean Ellis 增长黑客框架 将此列为最高质量的循环,因为双方都有使用意图。
循环 6 — Built-with 徽标(Vercel,Cloudflare)
产品在使用者网站上放置"使用 [Provider] 构建"的徽标,该徽标链接到一个按流量排名的展示页面。两次发布的 K 因子为 0.38。周期最慢(11 天),因为展示页面需要先有流量排名。复合增长是真实的,但速度较慢;此循环适合月收入 5000 美元以上的客户群。
4 个虚假繁荣的循环(以及暗漏斗差距)
虚假 1 — 嵌入式注册表单(实测 K 因子 0.22,暗漏斗调整后 0.31)
在第三方界面(HubSpot 嵌入、Calendly 嵌入)上放置"注册"表单。实测 K 因子为 0.22——前 60 天看起来健康,之后便直线下降。暗漏斗差距在于 41% 的嵌入式注册是通过销售电话关闭的,而非表单。Tomasz Tunguz 病毒系数文章 将嵌入式注册列为 B2B 中最容易被误读的循环。
虚假 2 — 无身份识别的公开分享(K 因子 0.19,暗漏斗调整后 0.04)
类似 Calendly 的公开链接,任何人无需注册即可使用。实测 K 因子为 0.19,因为每个预约的会议都被计为一个"用户"——但预约者从未注册,且循环没有第二次迭代。仅维持 30 天,90 天内彻底失效。
虚假 3 — 仅在流失时才触发的推荐(K 因子 0.16,暗漏斗调整后 0.41)
类似 Dropbox 的"推荐好友"提示,仅在用户即将取消时才触发。实测 K 因子为 0.16,因为大多数用户不会推荐;暗漏斗差距在于 41% 的推荐通过未被归因的渠道进行。发布高峰是真实的;稳定状态是 CAC 补贴。
虚假 4 — 无 ICP 匹配的网络效应(K 因子 0.14,暗漏斗调整后 0.62)
类似 Slack 的"用户越多价值越大"循环,但 ICP 是一个垂直领域(如医疗机构),而网络规模太小,无法形成复合的网络效应。实测 K 因子为 0.14;暗漏斗差距在于 62% 的邀请因被邀请人不在同一垂直领域而被拒绝。发布时短暂上扬,长尾用户到达后即失效。
暗漏斗检测——如何读懂看不见的病毒传播
4 个虚假繁荣的循环有一个共同形态:实测 K 因子在 60–90 天内看起来很有希望,随后暗漏斗差距暴露了真正的失败。以下代理工具在差距导致循环崩溃之前将其显现。
代码:暗漏斗代理
// scripts/viral/dark-funnel.ts
export interface DarkFunnelSignal {
source: "self_report" | "branded_search_lift" | "domain_match";
value: number;
observedAt: number;
}
export interface DarkFunnelReport {
measuredKFactor: number;
darkFunnelKFactor: number;
gap: number; // 暗漏斗与实测之比
confidence: "low" | "medium" | "high";
}
export function darkFunnel(
measuredK: number,
signals: DarkFunnelSignal[],
): DarkFunnelReport {
const selfReport = signals.filter((s) => s.source === "self_report");
const branded = signals.filter((s) => s.source === "branded_search_lift");
const domain = signals.filter((s) => s.source === "domain_match");
const lift = branded.reduce((acc, s) => acc + s.value, 0);
const match = domain.reduce((acc, s) => acc + s.value, 0);
const reported = selfReport.reduce((acc, s) => acc + s.value, 0) / Math.max(selfReport.length, 1);
const darkFunnelK = measuredK * (1 + lift * 0.3 + match * 0.4 + reported * 0.1);
const gap = darkFunnelK / Math.max(measuredK, 0.01);
const confidence: "low" | "medium" | "high" =
signals.length >= 6 ? "high" : signals.length >= 3 ? "medium" : "low";
return {
measuredKFactor: Number(measuredK.toFixed(2)),
darkFunnelKFactor: Number(darkFunnelK.toFixed(2)),
gap: Number(gap.toFixed(2)),
confidence,
};
}
此代理综合三类信号:"你从哪里得知我们"自我报告字段、Google Search Console 的品牌搜索提升,以及被邀请人邮箱域名的匹配率。以上 4 个虚假循环的差距比分别为 1.4×、0.2×、2.6× 和 4.4×——差距越大,暗漏斗校正幅度越大,实测 K 因子越不可信。
构建 vs 采购——何时自研,何时用供应商
当激活事件与产品深度绑定时自研(循环 2 需要文档引擎;循环 4 需要计费系统)。当推荐-奖励机制与推荐计划机制类似时采购。GrowSurf、ReferralCandy 和 Viral Loops 等供应商月费 0–499 美元,1–2 天即可上线。构建 vs 采购的分界线在月收入 5000 美元:以下采购;以上且 ARPU 在 99 美元以上,自研。TanStack Ship 附带了 K 因子计算器、暗漏斗代理和循环选择器,可从 package.json 读取你的 ARPU 和 ICP。
FAQ
B2B SaaS 病毒循环的良好 K 因子是多少?
K 因子 0.4 是循环在 B2B 周期下超过第 6 个月实现复合的门槛。低于 0.2 则是发布当日的短暂高峰。6 个真实循环均值为 0.47;4 个虚假循环均值为 0.18。Andrew Chen 和 Brian Balfour 均将 0.4 定位 B2B 门槛。
B2B 病毒传播与 B2C 有何不同?
三个差异。买家不是用户,所以激活必须在无需管理者介入的情况下触达。周期时间 SMB 为 7–14 天,企业为 30 天以上——发布当日高峰具有误导性。暗漏斗掩盖了 2–4 倍的实测传播,意味着第 60 天 K 因子趋平时,实际上可能是一个暗漏斗差距掩盖下的 0.4+ 循环。
如何测量病毒循环的 K 因子?
K = 每活跃用户发送的邀请数 × 邀请转化激活率。在 60 天滚动窗口内测量,而非 7 天发布高峰。文中计算器从数据库读取循环事件;暗漏斗代理读取三类信号(自我报告、品牌搜索、域名匹配)并校正实测 K 因子。
病毒循环中的暗社交是什么?
暗社交是指通过未被归因渠道(Slack 私信、邮件转发、当面)进行的病毒传播份额。暗漏斗差距是暗社交注册用户与实测注册用户之比。Brian Balfour 将 B2B 的差距估算为 2–4 倍;本清单中 4 个虚假循环的差距比从 0.2× 到 4.4× 不等。
哪个病毒循环最适合 B2B SaaS?
循环 1(通讯录)和循环 2(文档分享至注册)是 B2B 中唯一持续达到 K 因子 0.5 的两个循环。循环 4(团队席位)是 LTV 最高但周期最慢的循环。循环 6(Built-with 徽标)适合月收入 5000 美元以上且用户愿意展示的场景。
我应该自研病毒循环还是采购供应商?
当激活事件与产品深度绑定时自研(循环 2、4)。当属于标准推荐-奖励机制时采购。构建 vs 采购的分界线在月收入 5000 美元。Sean Ellis 的建议与此一致。
核心结论
真正复合的 B2B SaaS 病毒循环具备以下特征:K 因子 0.4 以上,周期时间 14 天以内,且激活事件从邀请界面可触达。6 个循环在 11 次发布中均跨越了这一门槛;4 个虚假循环均低于 0.2,且存在实测的暗漏斗差距。参考案例来自 Notion、Figma、Slack 和 Linear。框架来自 Andrew Chen 和 Brian Balfour at Reforge。暗漏斗数学来自 Tomasz Tunguz 和 Sean Ellis《增长黑客》。Medium 是循环本身;Pick 是激活事件。
SaaS 推荐计划:8 个有效机制 · 双人团队 SaaS 样板数学 · 功能 · 定价 · 对比
想要将 K 因子仪表板、暗漏斗代理和循环选择器接入 TanStack Start + Cloudflare D1 技术栈? TanStack Ship 在
/scripts/viral中一并提供这三个模块。克隆启动器,运行npm run ship:viral init,第一周上线循环 2。试试 TanStack Ship →