以下情境为教学假设,人物与数字不代表经核实的真实案例。
融资材料不是把公司介绍写得漂亮,而是用最小的信息量回答两个问题:值不值得见一面,值不值得做尽调。一页纸负责第一个问题,数据室负责第二个问题。两者面向的读者、更新频率和失败方式都不同,混在一起做,通常会在最贵的时点暴露最基础的问题。
这一节只讨论材料本身:一页纸放哪六个数、每个数的分母是什么;数据室分哪七类、每类最少放什么;准备这些材料要花多少创始人时间;材料不全时,尽调延期会怎样变成现金成本。融资结构、稀释和条款在别的章节,本节不重复。
一页纸只回答六个问题
一页纸不是公司简介的缩写版。它的任务是在对方还没有承诺时间之前,让对方判断「这门生意是否值得进入下一轮对话」。因此它只需要六个可以独立复算的数字:ARR、增长率、毛利率、流失率、CAC 回收周期、runway。六个数字对应六个问题:生意多大、长得多快、留下多少、漏得多快、获客多久回本、还能活多久。
| 数字 | LedgerLite 数值 | 公式与口径 | 投资人用它判断 |
|---|---|---|---|
| ARR | $240,240 | MRR $20,020 × 12 | 生意当前规模 |
| 增长率 | 月净增 3.8% | (20,020 − 19,280) ÷ 19,280 | 增长是趋势还是一次性 |
| 毛利率 | 84.2% | 毛利 202,240 ÷ 收入 240,240 | 每收一元留下多少 |
| 月流失 | 1.5% | 当月流失 MRR ÷ 期初 MRR | 存量漏得多快 |
| CAC 回收 | 2.2 个月 | CAC 140 ÷ 月毛利/客户 64.8 | 获客多久回本 |
| Runway | 8.6 个月 | 现金 95,000 ÷ 月固定成本 11,000 | 不融资还能撑多久 |
六个数必须来自同一套账。ARR 从 MRR 桥来,MRR 桥和利润表对得上,利润表又和银行流水对得上;任何一处对不上,一页纸就会在尽调时变成「先解释一下这个数」。这不是要求一页纸放三张表,而是要求六个数的分母都能在数据室里找到出处。
ARR 与增长率:分母比分子更容易出错
LedgerLite 的 MRR 是 260 家客户 × $77 = $20,020,ARR 是 20,020 × 12 = $240,240。这个定义看起来很基础,但常见分歧在「ARR 是否包含一次性收入」「年付客户是否按合同金额全额计入」「折扣是否从 MRR 里扣掉」。本案例的口径是订阅收入、按月折算、折扣已扣。口径写在一页纸的脚注里,比写在数据室深处更有用。
增长率用当月 MRR 桥:期初 19,280,新签 +780、扩张 +310、收缩 −60、流失 −290,期末 20,020,净增 740,增幅 3.8%。这只是一个月的数。把 3.8% 简单年化会得到约 56% 的增速,但那是数学外推,不是预测;一页纸上应该写「最近一个月 +3.8%」,并在旁边附上最近三个月的净增,避免把单月波动当成趋势。
月流失 1.5% 是收入口径,不是客户数口径。LedgerLite 的年流失约 16.6%,GRR 83%,NRR 102%。三个数一起看才完整:GRR 说明存量漏损,NRR 说明扩张补上了多少,月流失说明漏的速度。只放一个 1.5%,对方会追问「是收入还是客户」;放三个,又超过一页纸的容量。取舍是:一页纸放月流失 1.5%,脚注写「收入口径,GRR 83%、NRR 102% 见数据室」。
毛利、回收与 runway:三个「还能不能继续」
毛利率 84.2% 来自收入 240,240 减变动成本 38,000,毛利 202,240。变动成本拆开是云 18,000、支付 12,000、支持 8,000。一页纸上不必放这三项,但必须能回答「这 38,000 里有没有一次性项目」。如果某个月把一笔一次性迁移费用算进变动成本,毛利率会突然掉几个点,而一页纸如果只写结果,就会让对方误判趋势。
CAC 回收 2.2 个月 = CAC 140 ÷ 月毛利/客户 64.8。CAC 140 来自年营销 16,800 ÷ 年新签 120 家;月毛利/客户 64.8 = 77 × 84.2%。这个数比 LTV/CAC 更适合放在一页纸,因为它的分母是当月真实现金,不依赖流失假设。LTV/CAC 30.9 很漂亮,但它把 1.5% 的月流失假设放大了;回收周期 2.2 个月则不需要对方相信任何长期假设。
Runway 8.6 个月 = 现金 95,000 ÷ 月固定成本 11,000,是零收入口径:假设收入归零,只看现金能覆盖多久。它是保守下限,不是预测。一页纸上要写清「零收入口径」,否则对方会以为你在预测未来 8.6 个月不增长。LedgerLite 的月固定成本 11,000 是教学假设的简化值,真实报表要把创始人薪酬、外包和工具拆开;但一页纸只需要一个可复算的分母。
数据室分七类,不按部门分
数据室最常见的组织方式是「按文件夹」,财务一个、合同一个、技术一个,最后连创始人自己都找不到最新版本。更稳的方式是按买方的问题分七类:财务、客户、合同、IP、团队、合规、技术。每一类回答一个尽调问题,每一类都有「最少放什么」和「最常见的缺口」。
| 类别 | 最少文件 | 常见缺口 | 缺口后果 |
|---|---|---|---|
| 财务 | 三年利润表、资产负债表、现金流量表、月度 MRR 桥、预算与实际、税务申报 | 银行流水与账上收入对不上 | 收入真实性被质疑,尽调停摆 |
| 客户 | 脱敏客户清单、 cohort、流失记录、NRR/GRR、前五大客户占比 | 客户名单与收入明细对不上 | 集中度和流失被重新计算 |
| 合同 | 标准订阅协议、DPA、大客户合同、供应商合同 | 缺签字页、自动续约条款不清 | 合同承继和收入可持续性被打折 |
| IP | 商标、域名、代码归属、外包转让、开源清单 | 外包开发没有签 IP 转让 | 核心资产归属出现空洞 |
| 团队 | 组织图、劳动合同、外包协议、期权或激励安排 | 关键人没有书面安排 | 买方担心人一走产品就停 |
| 合规 | 隐私政策、数据处理记录、安全问卷、保险单 | 政策文本与实际做法不一致 | 交易后暴露合规整改成本 |
| 技术 | 架构图、可用性记录、备份恢复、依赖清单、事件记录 | 只有架构图,没有运行证据 | 技术尽调变成口头承诺 |
七类不是七座山。对一人 SaaS 来说,教学假设下的最小数据室大约 40–60 个文件;真正决定成败的不是文件数量,而是每一类都能回答「这个数从哪里来」。财务类的核心是「账、流水、申报三者一致」;客户类的核心是「名单、收入、流失三者一致」;合同类的核心是「签字、期限、责任上限三者一致」;IP 类的核心是「谁写的、归谁、能不能转」;团队类的核心是「谁在做、走了怎么办」;合规类的核心是「写的和做的一样」;技术类的核心是「架构和运行记录能互相印证」。
卷一已经给过数据室的目录与命名方法,这里只补融资场景下的两条规则:第一,文件名带类别前缀和日期,例如 financials/2026-10-mrr-bridge.xlsx,避免「最终版-最终版-2」;第二,同一路径只保留最高版本,旧版本移到归档区,买方看到两个版本会默认你在藏东西。需要具体的目录模板时,回到卷一的数据室一节
。
准备材料的时间成本
材料不是免费的。按教学假设,一页纸加最小数据室的首次准备约 60 个创始人工时,按 $100/小时的假设费率折算,是 $6,000。
| 工作 | 工时 | 说明 |
|---|---|---|
| 财务整理与对账 | 20 | 三张表、MRR 桥、预算与实际、税务申报 |
| 客户数据脱敏与核对 | 10 | 名单、收入、流失、集中度 |
| 合同归档与缺失条款标记 | 10 | 订阅协议、DPA、大客户、供应商 |
| IP 与外包归属梳理 | 8 | 商标、域名、代码、开源清单 |
| 团队与激励文件 | 4 | 劳动合同、外包协议、期权安排 |
| 合规与保险 | 4 | 隐私政策、数据处理记录、保险单 |
| 技术证据 | 4 | 架构图、可用性、备份恢复、事件记录 |
| 合计 | 60 | 约 $6,000 |
这 60 小时不是一次性投入。数据室每个季度要更新一次,教学假设每次 4 小时,一年 16 小时,折 $1,600;如果融资进程持续两个季度,维护成本要和首次准备一起算。很多创始人只算「做材料的时间」,不算「材料过期的返工时间」,后者往往更大:三月的客户名单到九月已经换了一批,买方一抽查就要求重做。
$6,000 听起来不少,但它是可以提前支付的确定性成本。下面这笔账说明为什么。
材料不全时,延期比准备更贵
教学假设:LedgerLite 的收购锚是 3.2× ARR = $768,768;如果因为数据室缺三类文件,尽调延期一个月,按 10% 的年折现率(教学假设)计算,晚到一个月的时间价值是 768,768 × 10% ÷ 12 = $6,406。这个数不是「损失」,而是同一笔钱晚一个月到账的现值差;如果交易本身因为延期而重新定价,影响会更大。
延期还会带来返工。教学假设每补一类缺口平均要 10 个创始人工时,三类就是 30 小时,按 $100/小时折 $3,000。把两项放在一起:一个月的延期成本约 $6,406 + $3,000 = $9,406,已经超过首次准备材料的 $6,000。换句话说,提前把数据室做完整,比在尽调中被追着补材料更便宜。
| 情形 | 现金或时间成本 | 说明 |
|---|---|---|
| 提前准备 | $6,000 | 60 工时 × $100,教学假设 |
| 延期一个月 | $6,406 | 768,768 × 10% ÷ 12,教学假设折现率 |
| 补三类缺口 | $3,000 | 30 工时 × $100,教学假设 |
| 延期合计 | $9,406 | 不含重新定价与信任损失 |
这张表的目的不是精确预测,而是把「材料不全」从感觉变成可比较的量。真实交易中,延期还可能触发排他期缩短、买方重新看别的标的、团队士气下降,这些无法用一个小表算完;但仅时间价值和返工两项,已经足够支持「先做完再开始」的顺序。
一页纸与数据室的分工
一页纸是快照,数据室是证据。快照可以每月更新,证据必须能追溯到原始文件。两者最重要的关系是「可对账」:一页纸上的每个数,都能在数据室里用不超过三步找到出处。
| 材料 | 读者 | 长度 | 更新频率 | 失败方式 |
|---|---|---|---|---|
| 一页纸 | 初次见面的投资人 | 1 页(教学假设) | 每月或每轮融资前 | 数字好看但对不上账 |
| 数据室 | 进入尽调的买方 | 40–60 个文件(教学假设) | 每季度 | 版本混乱、缺签字页、口径漂移 |
| 月报 | 已投资的投资人 | 1–2 页(教学假设) | 每月 | 字段缺失、口径变化 |
| 季报 | 董事会与主要投资人 | 5–10 页(教学假设) | 每季度 | 只报喜、风险栏空白 |
一个常见的顺序错误是先做一页纸、拿到意向后再补数据室。意向书不是免费选项,它通常附带排他期和尽调时限;在排他期内补材料,等于把准备成本压到最不能延期的窗口。更稳的顺序是:先用一页纸测试是否有兴趣,同时在后台把数据室做到「七类都有最小集」,再进入正式尽调。
另一个错误是把一页纸做成「数据室的目录」。一页纸的作用是让对方追问,不是替对方做完尽调。六个数字加一句「数据室已按七类整理,可在签署保密协议后开放」,比多页附录更有效。
下面的 metrics-brief.ts 把六个数字的输入、缺口检查与派生值固化成一次计算。它不生成文案,只保证六个数字要么全部可复算,要么明确报告缺哪一项;金额仍是整数美分,比率仍是基点,回收周期和 runway 保留一位小数。
// file: src/capital/metrics-brief.ts
// tier: L1
// verify: node --test test/capital/metrics-brief.test.ts
import { type Cents } from "../core/money.ts";
import { type Bps, divide } from "../core/rate.ts";
import { type Result, fail, ok } from "../core/result.ts";
export type BriefField =
| "arr"
| "growth"
| "grossMargin"
| "churn"
| "cacPayback"
| "runway";
export const BRIEF_FIELDS: BriefField[] = [
"arr",
"growth",
"grossMargin",
"churn",
"cacPayback",
"runway",
];
export type BriefInput = {
arrCents: Cents;
priorArrCents: Cents;
grossMarginBps: Bps;
monthlyChurnBps: Bps;
cacCents: Cents;
monthlyGrossProfitPerCustomerCents: Cents;
cashCents: Cents;
monthlyFixedCostsCents: Cents;
};
export type Brief = {
arrCents: Cents;
growthBps: Bps;
grossMarginBps: Bps;
monthlyChurnBps: Bps;
cacPaybackMonths: number;
runwayMonths: number;
missing: BriefField[];
};
function months(numerator: Cents, denominator: Cents): number {
return Math.round((numerator / denominator) * 10) / 10;
}
function isCount(value: number): boolean {
return Number.isInteger(value) && value >= 0;
}
/** An undefined field is a gap in the material, not a zero in the business. */
export function briefGaps(input: Partial<BriefInput>): BriefField[] {
const gaps: BriefField[] = [];
if (input.arrCents === undefined) gaps.push("arr");
if (input.priorArrCents === undefined) gaps.push("growth");
if (input.grossMarginBps === undefined) gaps.push("grossMargin");
if (input.monthlyChurnBps === undefined) gaps.push("churn");
if (
input.cacCents === undefined ||
input.monthlyGrossProfitPerCustomerCents === undefined
) {
gaps.push("cacPayback");
}
if (
input.cashCents === undefined ||
input.monthlyFixedCostsCents === undefined
) {
gaps.push("runway");
}
return gaps;
}
/**
* The one-pager is six numbers, each with its own denominator. Growth uses
* ARR on both sides so a changing MRR mix cannot move the ratio by itself.
*/
export function buildBrief(input: BriefInput): Result<Brief> {
const gaps = briefGaps(input);
if (gaps.length > 0) {
return fail(`missing: ${gaps.join(", ")}`);
}
if (!isCount(input.arrCents) || input.arrCents <= 0) {
return fail("ARR must be a positive integer amount");
}
if (!isCount(input.priorArrCents) || input.priorArrCents <= 0) {
return fail("prior ARR must be a positive integer amount");
}
if (!isCount(input.grossMarginBps) || input.grossMarginBps > 10000) {
return fail("gross margin must be between zero and 10000 bps");
}
if (!isCount(input.monthlyChurnBps) || input.monthlyChurnBps > 10000) {
return fail("monthly churn must be between zero and 10000 bps");
}
if (!isCount(input.cacCents)) {
return fail("CAC must be a non-negative integer amount");
}
if (
!isCount(input.monthlyGrossProfitPerCustomerCents) ||
input.monthlyGrossProfitPerCustomerCents === 0
) {
return fail("monthly gross profit per customer must be positive");
}
if (!isCount(input.cashCents)) {
return fail("cash must be a non-negative integer amount");
}
if (
!isCount(input.monthlyFixedCostsCents) ||
input.monthlyFixedCostsCents === 0
) {
return fail("monthly fixed costs must be positive");
}
return ok({
arrCents: input.arrCents,
growthBps: divide(
input.arrCents - input.priorArrCents,
input.priorArrCents,
),
grossMarginBps: input.grossMarginBps,
monthlyChurnBps: input.monthlyChurnBps,
cacPaybackMonths: months(
input.cacCents,
input.monthlyGrossProfitPerCustomerCents,
),
runwayMonths: months(input.cashCents, input.monthlyFixedCostsCents),
missing: [],
});
}
代码有四个细节。第一,briefGaps 把「没填」和「填了 0」分开:缺少上期 ARR 时,增长率是缺口,不是 0%;缺少现金时,runway 是缺口,不是无限。第二,增长率用 ARR 两端相除,不用 MRR 单月净增除以收入,避免分子分母不同期。第三,CAC 回收和 runway 都保留一位小数,因为一页纸上写 2.2 和 8.6 比写 2.16 和 8.64 更易读,也更诚实。第四,所有非法输入都返回 fail,不返回一个「看起来能算」的数;材料的第一原则是宁可空着,也不要编。
小结
- 一页纸只放六个数:ARR、增长率、毛利率、流失率、CAC 回收、runway;每个数都要有分母和口径。
- LedgerLite 的六个数是 ARR $240,240、月净增 3.8%、毛利 84.2%、月流失 1.5%、CAC 回收 2.2 个月、零收入 runway 8.6 个月。
- 增长率只写最近一个月,不把 3.8% 年化成 56% 当预测;流失要注明收入口径,并附 GRR 83%、NRR 102%。
- 数据室按七类组织:财务、客户、合同、IP、团队、合规、技术;每类的最小集要能回答「这个数从哪里来」。
- 首次准备约 60 工时,按 $100/小时教学假设是 $6,000;每季度维护约 16 小时,一年 $1,600。
- 材料不全导致一个月延期,按 10% 教学折现率是 $6,406,再加三类缺口返工 $3,000,合计约 $9,406,高于提前准备的成本。
- 一页纸是快照,数据室是证据;先让六个数字可对账,再谈包装。
阅读导航:上一节:2.3 合伙人协议与退出机制 · 下一节:3.2 月度/季度投资人报表 。
常见错误与边界
- 把一页纸写成公司简介。 对方想先看六个数字,不是先看愿景;六个数字说不清,愿景越长越像掩饰。
- ARR 口径不写清。 是否含一次性收入、年付是否全额计入、折扣是否扣除,三个问题不问清,尽调时一定重算。
- 把单月增长年化。 3.8% 的月净增简单年化约 56%,那是数学外推,不是预测;一页纸应写「最近一个月」并附三个月趋势。
- 流失率不注明口径。 收入流失 1.5% 和客户流失 1.5% 不是一回事;LedgerLite 的收入口径年流失约 16.6%,换口径会让历史序列断裂。
- CAC 回收只放 LTV/CAC。 LTV/CAC 30.9 依赖流失假设;回收周期 2.2 个月用当月真实现金,更难被质疑。
- runway 用乐观收入。 零收入口径是保守下限;把增长假设加进去,会把 8.6 个月说成 20 个月,一遇退款潮就穿帮。
- 数据室按部门而不是按问题分。 买方按问题找文件;按部门分,最后会在「技术」里翻合同,在「财务」里翻客户名单。
- 同一路径留多个版本。 两个「最终版」会让对方默认你在藏东西;同一路径只留最高版本,旧版本进归档区。
- 先拿意向书再补数据室。 意向书通常附带排他期和尽调时限;把准备压到排他期内,等于把 $6,000 的确定性成本换成 $9,406 的延期成本。
- 材料里的数和月报对不上。 一页纸、数据室、月报三套数只要有一套不同,投资人就会从头再问一遍;先统一口径,再谈更新频率。
本节边界是「材料准备」:它不讨论估值、条款、稀释,也不讨论买方如何定价;这些分别在估值、交易结构和尽调章节。材料不能替代生意本身,它只是把生意讲清楚的最低成本方式。若公司还没有稳定的 MRR 或现金流,先回到卷一把账做平,再谈一页纸;否则六个数字里至少有三个是猜的,而尽调最擅长的就是找出哪三个。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。