《独立开发者的商业指南·资本与退出》3.1 融资材料:一页纸与数据室

一页纸用六个数字回答值不值得见面,数据室用七类文件回答值不值得尽调。本节用 LedgerLite 的 ARR 240,240、月流失 1.5%、毛利 84.2% 演示两套材料的字段与口径,并计算 60 工时的准备成本和材料不全导致尽调延期的现金影响。

以下情境为教学假设,人物与数字不代表经核实的真实案例。

融资材料不是把公司介绍写得漂亮,而是用最小的信息量回答两个问题:值不值得见一面,值不值得做尽调。一页纸负责第一个问题,数据室负责第二个问题。两者面向的读者、更新频率和失败方式都不同,混在一起做,通常会在最贵的时点暴露最基础的问题。

这一节只讨论材料本身:一页纸放哪六个数、每个数的分母是什么;数据室分哪七类、每类最少放什么;准备这些材料要花多少创始人时间;材料不全时,尽调延期会怎样变成现金成本。融资结构、稀释和条款在别的章节,本节不重复。

一页纸只回答六个问题

一页纸不是公司简介的缩写版。它的任务是在对方还没有承诺时间之前,让对方判断「这门生意是否值得进入下一轮对话」。因此它只需要六个可以独立复算的数字:ARR、增长率、毛利率、流失率、CAC 回收周期、runway。六个数字对应六个问题:生意多大、长得多快、留下多少、漏得多快、获客多久回本、还能活多久。

数字LedgerLite 数值公式与口径投资人用它判断
ARR$240,240MRR $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获客多久回本
Runway8.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,00060 工时 × $100,教学假设
延期一个月$6,406768,768 × 10% ÷ 12,教学假设折现率
补三类缺口$3,00030 工时 × $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 月度/季度投资人报表 。

常见错误与边界

  1. 把一页纸写成公司简介。 对方想先看六个数字,不是先看愿景;六个数字说不清,愿景越长越像掩饰。
  2. ARR 口径不写清。 是否含一次性收入、年付是否全额计入、折扣是否扣除,三个问题不问清,尽调时一定重算。
  3. 把单月增长年化。 3.8% 的月净增简单年化约 56%,那是数学外推,不是预测;一页纸应写「最近一个月」并附三个月趋势。
  4. 流失率不注明口径。 收入流失 1.5% 和客户流失 1.5% 不是一回事;LedgerLite 的收入口径年流失约 16.6%,换口径会让历史序列断裂。
  5. CAC 回收只放 LTV/CAC。 LTV/CAC 30.9 依赖流失假设;回收周期 2.2 个月用当月真实现金,更难被质疑。
  6. runway 用乐观收入。 零收入口径是保守下限;把增长假设加进去,会把 8.6 个月说成 20 个月,一遇退款潮就穿帮。
  7. 数据室按部门而不是按问题分。 买方按问题找文件;按部门分,最后会在「技术」里翻合同,在「财务」里翻客户名单。
  8. 同一路径留多个版本。 两个「最终版」会让对方默认你在藏东西;同一路径只留最高版本,旧版本进归档区。
  9. 先拿意向书再补数据室。 意向书通常附带排他期和尽调时限;把准备压到排他期内,等于把 $6,000 的确定性成本换成 $9,406 的延期成本。
  10. 材料里的数和月报对不上。 一页纸、数据室、月报三套数只要有一套不同,投资人就会从头再问一遍;先统一口径,再谈更新频率。

本节边界是「材料准备」:它不讨论估值、条款、稀释,也不讨论买方如何定价;这些分别在估值、交易结构和尽调章节。材料不能替代生意本身,它只是把生意讲清楚的最低成本方式。若公司还没有稳定的 MRR 或现金流,先回到卷一把账做平,再谈一页纸;否则六个数字里至少有三个是猜的,而尽调最擅长的就是找出哪三个。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「books」更多文章

  1. 《移动游戏产品的架构·商业化与发行工程》附录 C 商业化与发行评审清单
  2. 《移动游戏产品的架构·商业化与发行工程》附录 B 双案例商业化事实表
  3. 《移动游戏产品的架构·商业化与发行工程》附录 A 商业化与发行术语速查