以下情境为教学假设,人物与数字不代表经核实的真实案例。
「关停」在很多人脑子里是一个动作:把服务器停掉、把域名指向一个静态页、发一封告别信。真正的关停是一组义务的清算:客户预付的钱要退,合同里的最低承诺要履行或买断,员工和承包商的通知期要付,债务要还,主体要注销,注销之后还有一段合规尾巴。网站只是最后关掉的那个页面。
这一节把关停拆成三张表:债务按什么顺序清偿、合同终止要付多少、主体注销要多久和多少钱。然后用 Nord Studio 的教学假设,把两位合伙人的个人担保和客户合同最低承诺放进同一张瀑布表,算出「关停遗留责任」——即使公司资产全部变现,每个人还要从口袋里掏出多少。所有金额、比例、期限都是教学假设,不构成法律意见。
关停不是把网站关掉
网站关掉只需要几分钟,义务清完要几个月。两者的差距来自四个「不会因为关站而消失」的东西:已收但未提供服务的钱、合同里的最低承诺、对员工和承包商的通知期义务、以及对债权人的偿还义务。这四类义务各有各的到期日,也各有各的优先级。
| 义务 | 触发条件 | 是否随关站消失 | 现金影响 |
|---|---|---|---|
| 客户退款 | 已收预付款、未提供完服务 | 否,反而更急 | 按未使用期退 |
| 合同最低承诺 | 合同约定最低采购/服务量 | 否,违约要赔 | 履行或买断 |
| 员工/承包商 | 劳动合同、外包合同 | 否,通知期或遣散 | 工资、通知期、遣散 |
| 债务 | 贷款、授信、租赁 | 否,担保可能追到个人 | 本金、利息、费用 |
| 主体注销 | 停止经营后的法定程序 | 是,但要先清完 | 申报、顾问、尾部合规 |
「关站」和「关公司」是两个不同的动作。关站是停止服务,关公司是消灭法律主体。前者可以今天做,后者要先把义务清完,再走注销程序。很多人把两者混在一起,结果网站关了、公司还在,年报、税务申报和债务利息继续产生;或者公司注销了、义务没清完,债权人追到合伙人个人。
关停的正确顺序是「先算清、再通知、后注销」。先算清,是知道总义务有多少、资产够不够;再通知,是给客户、承包商和债权人一个明确的时间表;后注销,是在义务清完、争议解决之后,再走法定程序。顺序反了,注销会被驳回,或者注销后又被追责。
债务清偿顺序:谁先拿钱
公司停止经营时,现金是有限的,义务是排队。排队的顺序决定了谁拿得到、谁拿不到。下面这张表是 Nord 的教学排序,按「客户先、员工次、担保债务再次、无担保应付最后」排列;它不是法定清偿顺序,实际顺位以适用法律和合同约定为准。
| 顺位 | 义务 | 金额 | 可用资金 | 实付 | 缺口 |
|---|---|---|---|---|---|
| 1 | 客户退款 | 7,020.00 | 58,137.60 → 51,117.60 | 7,020.00 | 0 |
| 2 | 合同最低承诺 | 18,518.40 | 51,117.60 → 32,599.20 | 18,518.40 | 0 |
| 3 | 终止违约金 | 6,000.00 | 32,599.20 → 26,599.20 | 6,000.00 | 0 |
| 4 | 员工遣散 | 0 | 26,599.20 | 0 | 0 |
| 5 | 担保债务 | 25,000.00 | 26,599.20 → 1,599.20 | 25,000.00 | 0 |
| 6 | 无担保应付 | 5,000.00 | 1,599.20 → 0 | 1,599.20 | 3,400.80 |
| 7 | 注销费用 | 3,600.00 | 0 | 0 | 3,600.00 |
| 8 | 尾部合规 | 3,600.00 | 0 | 0 | 3,600.00 |
| 合计 | 68,738.40 | 58,137.60 | 10,600.80 |
这张表有两个信息。第一,前五顺位都能全额支付,缺口集中在无担保应付、注销费用和尾部合规。第二,缺口 10,600.80 美元不是「公司少付了一点」,而是一个必须有人承担的数;如果债务有个人担保,承担者就是合伙人。
清偿顺序不是「谁先起诉谁先拿」。有担保的债务通常优先于无担保债务,有法定优先权的债权(如员工工资、税款)通常优先于普通债权;客户预付款在不同司法辖区的顺位不同,有的地区把它当普通债权,有的地区有专门保护。本节按「客户先、员工次、担保债务再次、无担保应付最后」排序,是因为这是创始人可以主动选择的商业顺序,不是法律规定的顺序。实际执行前,要让律师按适用法律核对。
现金不够时,最忌讳的是「先还亲近的、后还陌生的」。先还股东借款、先付合伙人自己的费用、先给关系好的供应商,都会在清算或注销时被质疑,甚至被要求退回。清偿顺序要事先写下来,按同一规则执行;谁先拿钱不是关系问题,是规则问题。
合同终止:最低承诺与违约金
合同终止的成本,主要来自两类条款:最低承诺和违约金。最低承诺是客户承诺在合同期内至少买多少、用多少;违约金是提前终止时按剩余期限或剩余金额算的赔偿。两类条款的触发条件不同,算法也不同。
Nord 的咨询合同里,前 3 家客户占收入 48%,年收入 74,073.60 美元,月均 6,172.80 美元。教学假设这三家客户各有 3 个月的剩余最低承诺,合计 18,518.40 美元。关停时,这笔承诺有两种处理方式:继续提供服务到承诺期满,或者按合同买断剩余部分。继续服务意味着保留两个合伙人和外包 3 个月,成本不低于承诺金额;买断意味着一次性支付,但可以提前释放时间。两种方式的现金影响接近,差别在时间和风险。
| 合同义务 | 计算 | 金额 |
|---|---|---|
| 前 3 家客户最低承诺 | 74,073.60 ÷ 12 × 3 | 18,518.40 |
| 承包商通知期 | 30 天 × 教学假设 | 1,500.00 |
| 办公室租约 | 3 个月 × 1,500 | 4,500.00 |
| 终止违约金合计 | 1,500 + 4,500 | 6,000.00 |
违约金不只是「赔钱」,还包括「什么时候赔、赔给谁、能不能谈」。有的合同允许以服务抵扣代替现金赔偿,有的合同允许分期支付,有的合同在不可抗力或主体注销时免除违约金。关停前要逐份读终止条款,把「必须现金支付」和「可以协商」分开;能协商的,用服务、数据或过渡支持抵扣,不能协商的,预留现金。
员工和承包商的处理与合同类似。Nord 没有正式员工,只有两位合伙人和外包;外包合同的通知期是 30 天,教学假设成本 1,500 美元。如果有关键外包人员,还要考虑交接成本:把代码、文档和客户关系转给谁、转多久、要不要付留任奖金。留任成本通常不在合同里,但它和违约金一样真实。
合伙人退出是另一条路径,不是关停义务。Nord 的合伙人退出报价是 50% × 4.5 × SDE = 77,220 美元,分 24 个月支付;这是「一个人走、公司继续」的方案,不是「公司关掉」的方案。关停时,合伙人之间要先分清「公司欠合伙人的」和「合伙人欠公司的」:未发的工资、未报销的费用、股东借款、个人担保,都要在瀑布表里单独列出来,不能和客户退款混在一起。
主体注销:时间、费用与尾部义务
主体注销不是「填一张表」。它是一段程序:停止经营、结清税务、通知债权人、公告、提交注销申请、等待异议期、拿到注销证明。不同司法辖区的步骤和时长不同,Nord 的英国 Ltd 教学假设是 6 个月、180 天。
| 阶段 | 时间 | 要做的事 | 成本 |
|---|---|---|---|
| 停止经营 | 第 0–1 月 | 停服务、停扣款、结清客户退款 | 已计入收尾成本 |
| 结清税务 | 第 1–2 月 | 最终账目、最终申报、结清税款 | 顾问费 2,400 |
| 通知与公告 | 第 2–4 月 | 通知债权人、公告、处理异议 | 申报费 1,200 |
| 提交注销 | 第 4–5 月 | 提交申请、等待异议期 | 已计入 |
| 注销完成 | 第 5–6 月 | 拿到注销证明、关闭银行账户 | 已计入 |
| 尾部合规 | 第 6 月起 | 保留记录、处理迟到索赔 | 600/月 |
注销的直接费用是申报 1,200 美元加顾问 2,400 美元,合计 3,600 美元;尾部合规按 600 美元/月、6 个月计,是 3,600 美元。两项合计 7,200 美元。这个数字不大,但时间不短:6 个月内公司还在,年报、银行账户、保险和合同可能继续产生费用;如果注销被异议,时间会更长。
注销前要关掉的东西,比注销表本身更多:银行账户、支付通道、云服务、域名、软件订阅、保险、电话、邮箱、办公租约。每一项都有各自的关闭流程和结算周期。支付通道要先确认最后一笔结算和退款都完成,再关账户;云服务要先导出日志和备份,再删资源;域名要不要保留、保留多久,要在注销前决定。注销后再想改,成本会高得多。
注销后还有「尾巴」。有些义务不会因为主体消失而消失:个人担保、未结的税务、未处理的客户争议、法定的记录保留义务。Nord 的个人担保就是典型:公司注销了,担保还在,债权人可以直接找合伙人。注销不是「一笔勾销」,而是「把公司的义务转成个人或留存在记录里的义务」。
Nord:两位合伙人的遗留责任
把前面的数字放进 Nord 的瀑布表。资产侧:现金 48,000 美元,应收 11,264 美元,按 90% 回收率算是 10,137.60 美元,可用资金合计 58,137.60 美元。义务侧:客户退款 7,020、最低承诺 18,518.40、终止违约金 6,000、员工遣散 0、担保债务 25,000、无担保应付 5,000、注销费用 3,600、尾部合规 3,600,合计 68,738.40 美元。
可用资金 = 48,000 + 11,264 × 90% = 58,137.60
总义务 = 7,020 + 18,518.40 + 6,000 + 0 + 25,000 + 5,000 + 3,600 + 3,600 = 68,738.40
缺口 = 58,137.60 − 68,738.40 = −10,600.80
缺口 10,600.80 美元,由两位合伙人的个人担保承担。担保上限是 25,000 美元,足够覆盖这个缺口;每人承担 5,300.40 美元。这个数字就是「关停遗留责任」:不是公司账上的亏损,而是公司注销后,合伙人从个人账户里掏出来的钱。
| 项目 | 公司口径 | 个人口径 |
|---|---|---|
| 可用资金 | 58,137.60 | — |
| 总义务 | 68,738.40 | — |
| 缺口 | −10,600.80 | — |
| 个人担保上限 | — | 25,000.00 |
| 担保追偿 | — | 10,600.80 |
| 每位合伙人 | — | 5,300.40 |
如果没有个人担保,缺口会留在公司里,公司无法注销,或者注销后被债权人追回;如果有担保但上限低于缺口,超出部分仍然由合伙人承担。Nord 的担保上限 25,000 美元高于缺口 10,600.80 美元,所以两位合伙人每人 5,300.40 美元就能结清。这个结果看起来不惨,但它建立在一个乐观假设上:应收能收回 90%、没有迟到索赔、注销一次通过、尾部合规不超 6 个月。任何一个假设变差,缺口都会扩大。
三种变化最敏感。第一,应收回收率从 90% 降到 50%,可用资金少 4,505.60 美元,缺口变成 15,106.40 美元,每人 7,553.20 美元。第二,客户最低承诺从 3 个月变成 6 个月,义务多 18,518.40 美元,缺口变成 29,119.20 美元,担保上限 25,000 被用完,还剩 4,119.20 美元由合伙人另行承担,每人 14,559.60 美元。第三,注销拖到 12 个月,尾部合规多 3,600 美元,缺口变成 14,200.80 美元,每人 7,100.40 美元。
| 情景 | 缺口 | 担保覆盖 | 每人承担 |
|---|---|---|---|
| 基准 | 10,600.80 | 10,600.80 | 5,300.40 |
| 应收回收 50% | 15,106.40 | 15,106.40 | 7,553.20 |
| 最低承诺 6 个月 | 29,119.20 | 25,000.00 | 14,559.60 |
| 注销拖到 12 个月 | 14,200.80 | 14,200.80 | 7,100.40 |
这就是为什么关停不是「把网站关掉」。网站关掉之后,义务还在排队;公司注销之后,担保还在个人身上。关停决策要比的三个现值(11.1),只是第一层;第二层是收尾的现金支出(11.2);第三层是注销后的遗留责任(本节)。三层都算完,才知道关停真正要花多少钱。
写成代码:entity-deregistration.ts
下面的 entity-deregistration.ts 把义务排成瀑布。obligations 按八类顺序列出,coreObligationsCents 是不含尾部合规的核心义务,totalObligationsCents 加上尾部合规;residualCents 是可用资金减总义务,负数表示缺口;guaranteeCallCents 是担保被追偿的金额,上限是担保额;guaranteeShortfallCents 是担保也覆盖不了的部分;shortfallPerPartnerCents 是每位合伙人按担保追偿额分摊的金额。
// file: src/capital/entity-deregistration.ts
// tier: L1
// verify: node --test test/capital/entity-deregistration.test.ts
import { type Cents } from "../core/money.ts";
import { type Bps, applyRate } from "../core/rate.ts";
import { type Result, fail, ok } from "../core/result.ts";
export type ObligationClass =
| "customer-refund"
| "customer-commitment"
| "termination"
| "employee"
| "secured-debt"
| "unsecured-payable"
| "deregistration"
| "tail-compliance";
export type ObligationRow = {
class: ObligationClass;
label: string;
amountCents: Cents;
};
export type DeregistrationInput = {
cashCents: Cents;
receivablesCents: Cents;
collectionRateBps: Bps;
refundCents: Cents;
minimumCommitmentCents: Cents;
terminationPenaltyCents: Cents;
severanceCents: Cents;
payablesCents: Cents;
debtCents: Cents;
filingCents: Cents;
advisorCents: Cents;
monthlyComplianceCents: Cents;
deregistrationMonths: number;
guaranteeCents: Cents;
partners: number;
};
export type DeregistrationOutcome = {
collectedReceivablesCents: Cents;
availableCents: Cents;
obligations: ObligationRow[];
coreObligationsCents: Cents;
tailComplianceCents: Cents;
totalObligationsCents: Cents;
residualCents: Cents;
guaranteeCallCents: Cents;
guaranteeShortfallCents: Cents;
shortfallPerPartnerCents: Cents;
deregistrationDays: number;
funded: boolean;
};
function checkAmount(value: Cents, label: string): string | null {
if (!Number.isInteger(value) || value < 0) {
return `${label} must be a non-negative integer amount in cents`;
}
return null;
}
/**
* Deregistration is a waterfall, not a switch. Cash and collected receivables
* pay the obligations in their contractual order: customer refunds and
* unfulfilled commitments first, then termination and employee costs, then
* secured debt, then unsecured payables, then the filing and advisor fees. The
* compliance tail continues after the last customer leaves, so it is added to
* the same total. A negative residual calls the personal guarantee; anything
* the guarantee cannot cover stays with the partners.
*/
export function entityDeregistration(
input: DeregistrationInput,
): Result<DeregistrationOutcome> {
for (const [value, label] of [
[input.cashCents, "cash"],
[input.receivablesCents, "receivables"],
[input.refundCents, "customer refund"],
[input.minimumCommitmentCents, "minimum commitment"],
[input.terminationPenaltyCents, "termination penalty"],
[input.severanceCents, "severance"],
[input.payablesCents, "payables"],
[input.debtCents, "debt"],
[input.filingCents, "filing fee"],
[input.advisorCents, "advisor fee"],
[input.monthlyComplianceCents, "monthly compliance"],
[input.guaranteeCents, "personal guarantee"],
] as Array<[Cents, string]>) {
const error = checkAmount(value, label);
if (error) {
return fail(error);
}
}
if (
!Number.isInteger(input.collectionRateBps) ||
input.collectionRateBps < 0 ||
input.collectionRateBps > 10000
) {
return fail("collection rate must be between 0 and 10000 bps");
}
if (
!Number.isInteger(input.deregistrationMonths) ||
input.deregistrationMonths < 1 ||
input.deregistrationMonths > 24
) {
return fail("deregistration months must be an integer between 1 and 24");
}
if (!Number.isInteger(input.partners) || input.partners < 1) {
return fail("partners must be a positive integer");
}
const collectedReceivablesCents = applyRate(
input.receivablesCents,
input.collectionRateBps,
);
const availableCents = input.cashCents + collectedReceivablesCents;
const tailComplianceCents =
input.monthlyComplianceCents * input.deregistrationMonths;
const obligations: ObligationRow[] = [
{
class: "customer-refund",
label: "unused subscription refunds",
amountCents: input.refundCents,
},
{
class: "customer-commitment",
label: "unfulfilled minimum commitments",
amountCents: input.minimumCommitmentCents,
},
{
class: "termination",
label: "contract termination penalties",
amountCents: input.terminationPenaltyCents,
},
{
class: "employee",
label: "severance and notice",
amountCents: input.severanceCents,
},
{
class: "secured-debt",
label: "secured or guaranteed debt",
amountCents: input.debtCents,
},
{
class: "unsecured-payable",
label: "unsecured payables",
amountCents: input.payablesCents,
},
{
class: "deregistration",
label: "filing and advisor fees",
amountCents: input.filingCents + input.advisorCents,
},
{
class: "tail-compliance",
label: "post-closure compliance",
amountCents: tailComplianceCents,
},
];
const coreObligationsCents = obligations
.filter((row) => row.class !== "tail-compliance")
.reduce((acc, row) => acc + row.amountCents, 0);
const totalObligationsCents = coreObligationsCents + tailComplianceCents;
const residualCents = availableCents - totalObligationsCents;
const guaranteeCallCents =
residualCents < 0 ? Math.min(-residualCents, input.guaranteeCents) : 0;
const guaranteeShortfallCents =
residualCents < 0
? Math.max(0, -residualCents - input.guaranteeCents)
: 0;
return ok({
collectedReceivablesCents,
availableCents,
obligations,
coreObligationsCents,
tailComplianceCents,
totalObligationsCents,
residualCents,
guaranteeCallCents,
guaranteeShortfallCents,
shortfallPerPartnerCents: Math.round(
guaranteeCallCents / input.partners,
),
deregistrationDays: input.deregistrationMonths * 30,
funded: residualCents >= 0,
});
}
把 Nord 的数字换成美分代进去:可用资金 5,813,760 美分(58,137.60 美元),核心义务 6,513,840 美分(65,138.40 美元),尾部合规 360,000 美分(3,600 美元),总义务 6,873,840 美分(68,738.40 美元),缺口 −1,060,080 美分(−10,600.80 美元);担保追偿 1,060,080 美分,担保不足 0,每位合伙人 530,040 美分(5,300.40 美元);注销周期 180 天,funded 返回 false。
代码里有三个刻意的选择。第一,义务按类别列出,而不是合成一个总数;这样能看出缺口落在哪一类,是客户、合同、债务还是注销费用。第二,担保追偿以「缺口」和「担保额」的较小值为上限;担保不足时,guaranteeShortfallCents 单独输出,避免把「担保覆盖」误当成「缺口消失」。第三,尾部合规单独成一类,不混进注销费用;注销完成后公司还在、记录还要保留,这笔钱不会因为拿到注销证明就停止。
小结
- 关停是义务清算,不是关网站;网站几分钟关掉,义务要几个月清完。
- 义务分四类:已收未服务的钱、合同最低承诺、员工/承包商通知期、债务;四类都不随关站消失。
- Nord 的总义务 68,738.40 美元:退款 7,020、最低承诺 18,518.40、违约金 6,000、担保债务 25,000、应付 5,000、注销 3,600、尾部合规 3,600。
- 可用资金 58,137.60 美元:现金 48,000 加 90% 回收的应收 10,137.60;缺口 10,600.80 美元。
- 缺口由两位合伙人的个人担保承担,每人 5,300.40 美元;担保上限 25,000 美元足够覆盖基准情景。
- 清偿顺序决定谁拿得到钱:前五顺位全额支付,缺口集中在无担保应付、注销费用和尾部合规。
- 合同终止的成本来自最低承诺和违约金:前 3 家客户 3 个月承诺 18,518.40,承包商通知期与租约违约金 6,000。
- 主体注销约 6 个月、180 天,直接费用 3,600 美元,尾部合规 3,600 美元;注销后担保和记录义务仍在。
- 三种敏感情景:应收回收 50% 使每人承担 7,553.20;最低承诺 6 个月使每人 14,559.60;注销拖到 12 个月使每人 7,100.40。
- 关停要算三层:三个选项的现值(11.1)、收尾现金支出(11.2)、注销后的遗留责任(本节);只算第一层会低估关停的真实代价。
阅读导航:上一节:11.2 用户、数据与订阅的收尾 · 下一节:12.1 持有型公司的治理 。
常见错误与边界
- 把关站当关公司。 网站关了,公司还在,年报、税务、债务利息继续产生;关站和注销是两个动作。
- 先注销、后清义务。 注销会被驳回,或者注销后被债权人追回;先算清、再通知、后注销。
- 忽略客户合同的最低承诺。 前 3 家客户 3 个月承诺就是 18,518.40 美元;只算退款会低估合同义务。
- 把违约金当成可以拖。 违约金有到期日,拖久了会加利息和诉讼成本;能协商的用服务抵扣,不能协商的预留现金。
- 先还关系好的债权人。 先还股东借款、先付合伙人费用,会在清算或注销时被质疑;清偿顺序要事先写下来。
- 以为注销就一笔勾销。 个人担保、未结税务、客户争议和记录保留义务不会随主体消失;注销只是把公司义务转成个人或记录义务。
- 只看注销费用,不看尾部合规。 申报和顾问 3,600 美元,尾部合规还要 3,600 美元;6 个月里公司还在产生费用。
- 忽略应收回收率。 应收 11,264 美元按 90% 回收是 10,137.60;回收率降到 50%,缺口多 4,505.60。
- 把担保上限当缺口上限。 担保 25,000 美元覆盖基准缺口 10,600.80,但最低承诺翻倍后缺口 29,119.20,超出部分仍由合伙人承担。
- 只算公司口径。 公司账上缺口 10,600.80,个人口袋每人 5,300.40;关停决策要看个人口径,不然会低估自己的风险。
本节的边界是「公司关停时的义务清算与主体注销」:覆盖债务顺序、合同终止、员工/承包商、注销时间与费用、个人担保,不展开具体司法辖区的公司法、破产法、税务申报和债权人公告程序。所有金额、回收率、承诺期限、注销时长和担保上限都是教学假设;实际清偿顺序、注销程序和担保责任以适用法律与合同为准,本节不构成法律意见。关停的三个选项见 11.1 关停决策:继续、出售、关停 ;客户与数据收尾见 11.2 用户、数据与订阅的收尾 ;合同责任上限见 2.1 责任上限 。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。