《独立开发者的商业指南·合同、应收与风险》5.2 争议解决:管辖、仲裁与调解

争议解决不是选一个更解气的程序,而是选一组成本:时间、固定费用、内部工时和执行难度。本节用 Nord 的 11,264 美元应收,把调解、仲裁和诉讼的期望净得算成一张表,并给出「争议金额 × 程序成本」的决策矩阵,说明为什么小额争议走仲裁可能越打越亏。

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

合同里写「争议提交某某法院」或「提交某某仲裁机构」时,多数人只把它当成一句格式条款。等到真的发生争议,这句话会决定三件事:你要飞到哪里、要请哪个地方的律师、以及多久之后才可能拿到钱。调解、仲裁和诉讼不是三种态度,而是三组成本结构。选错的代价,往往比争议本身还大。

三种程序的三组成本

把每种程序看成一个项目,它的输入是争议金额,输出是期望净得。成本分三块:内部工时(按机会成本算)、固定费用( mediator、仲裁机构、法院和律师)、以及时间(影响折现和执行)。

程序典型周期内部工时固定费用(教学假设)回收概率(教学假设)执行特点
调解1–2 个月6 小时1,00065%和解靠自愿履行,无强制力
仲裁12–18 个月12 小时8,50070%跨境承认与执行通常更便利
诉讼18–36 个月20 小时21,20075%本地法院执行,跨境更麻烦

固定费用的拆分也要说清楚。调解的 1,000 是调解员费用;仲裁的 8,500 是机构受理费 2,500 加律师与准备 6,000;诉讼的 21,200 是法院费用 1,200 加律师 20,000。内部工时按 Nord 的 85 美元/小时计:调解 510、仲裁 1,020、诉讼 1,700。所有金额、周期和概率都是教学假设,不是报价,也不是统计结果。

回收概率为什么递增?调解没有强制力,但双方还愿意谈;仲裁有裁决,跨境执行通常比法院判决便利;诉讼有法院强制执行,但周期最长。递增不是无限的:70% 和 75% 都已经包含「胜诉但执行不到」的情形,不能当成胜诉率。

管辖条款:差旅和本地律师费要提前进表

「管辖」在财务上不是法律概念,而是一笔额外固定费用。如果合同约定在客户所在地解决争议,你就要把差旅、当地律师和语言成本加进固定费用。教学假设下,这笔增量在 5,000 到 15,000 之间。

以仲裁为例,原本固定费用 8,500;如果必须去对方所在地,加 6,000 的当地律师与差旅,固定费用变成 14,500。盈亏平衡点从:

(8,500 + 1,020) ÷ 70% = 13,600

变成:

(14,500 + 1,020) ÷ 70% = 22,171

也就是说,一笔 20,000 的争议,在本地仲裁是正的(20,000 × 70% − 9,520 = 4,480),在对方所在地仲裁就变成负的(14,000 − 15,520 = −1,520)。同一份合同、同一笔钱,只因为管辖地不同,结论反转。签约时把管辖地当成价格条款看,而不是当成法律条款看,这个差别就会提前暴露。

仲裁地、调解地和诉讼地可以不同。仲裁地决定程序法和裁决的承认执行,调解地通常只影响会议成本,诉讼地决定法院和律师。三者不要混为一谈;财务上要加的是「你实际要去哪里、要请哪里的律师」,而不是条款里出现了几个地名。

用 11,264 算三种程序的期望净得

Nord 的应收是 11,264 美元。把三种程序代进同一个公式:

期望回收 = 争议金额 × 回收概率
期望净得 = 期望回收 − 内部工时成本 − 固定费用
程序期望回收内部成本固定费用期望净得盈亏平衡争议额
调解7,321.605101,0005,811.602,323
仲裁7,884.801,0208,500−1,635.2013,600
诉讼8,448.001,70021,200−14,452.0030,533

这张表最重要的不是「调解最好」,而是「同一个金额在不同程序下的符号不同」。11,264 的争议,调解净得 5,811.60,仲裁净得 −1,635.20,诉讼净得 −14,452。仲裁和诉讼不是「更正式所以更好」,它们在这个金额上只是更贵。

盈亏平衡点的公式是:

盈亏平衡争议额 = (内部成本 + 固定费用) ÷ 回收概率

调解是 (510 + 1,000) ÷ 65% = 2,323;仲裁是 (1,020 + 8,500) ÷ 70% = 13,600;诉讼是 (1,700 + 21,200) ÷ 75% = 30,533。低于平衡点的争议,程序本身的成本就超过了概率加权后的回收,和对方有没有理无关。

时间价值会让表更难看的。按 10% 折现率,仲裁 18 个月后的 7,884.80 只值 6,834.42,净得 −2,685.58;诉讼 30 个月后的 8,448 只值 6,656.90,净得 −16,243.10;调解 2 个月后的 7,321.60 值 7,206.22,净得 5,696.22。周期越长,折现吃掉的钱越多,而固定费用是现在就要付的。

这也解释了为什么争议金额稍大时,仲裁会突然变得可行。同样 70% 的回收概率、同样 9,520 的总成本,争议额 20,000 时净得 4,480,争议额 13,600 时净得 0。仲裁的固定成本高,但它不随争议金额线性增长;金额越大,固定成本被摊得越薄。

决策矩阵:争议金额 × 程序成本

把上面的平衡点拼成一张矩阵,就可以在争议发生时不靠情绪选程序。下表的分档以本节的教学假设为准,换辖区、换律师报价后要重算。

争议金额调解仲裁诉讼建议路径
低于 2,323负负负提醒、和解或核销,不进入正式程序
2,323–13,600正负负先调解;调解不成再评估是否止损
13,600–30,533正正负调解优先;证据强且对方有资产时可选仲裁
高于 30,533正正正比较执行难度和周期,仲裁或诉讼都可能可行

这张矩阵的读法是「先看符号,再看大小」。符号为负的格子,不需要再讨论对方是否违约;正负号只由金额、成本、概率决定。符号为正的格子,再比较期望净得和回收周期。

小额争议走仲裁不经济,原因就在第一行和第二行。2,323 以下,连调解的固定成本都收不回来;2,323 到 13,600 之间,调解是唯一为正的程序,仲裁的 8,500 固定费用把期望回收吃光了。很多独立开发者觉得「仲裁比诉讼便宜」,这个印象只在跨境执行和保密性上有优势;在 11,264 这个金额上,仲裁比调解的总成本高 8,010,期望净得反而低 7,446.80。

LedgerLite 的单客户年费是 924,12 个月费用的责任上限也是 924;这个金额低于调解 2,323 的平衡点,连调解都不经济。订阅争议的正确路径是提醒、抵扣或核销,而不是仲裁;260 家客户的结构也决定了逐笔打官司会吞掉支持产能。

调解也不是无条件好。调解的 65% 回收概率包含「达成和解但对方不履行」的情形;如果对方已经失联或没有可执行资产,调解协议只是一张纸。这时要考虑的是保全和止损,而不是继续换程序。对方破产或失联的回收顺序见 4.3 对方破产或失联:能拿回多少 。

写成代码:dispute.ts

下面的 dispute.ts 把每种程序写成 ProcedureCost,用 evaluateProcedure 算期望回收、内部成本、固定费用、期望净得、折现后净得和盈亏平衡争议额,用 compareProcedures 一次算完三种程序,用 bestProcedure 选出期望净得最高的一种。

// file: src/contract/dispute.ts
// tier: L1
// verify: node --test test/contract/dispute.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 Procedure = "mediation" | "arbitration" | "litigation";

export type ProcedureCost = {
  procedure: Procedure;
  internalHours: number;
  hourlyCostCents: Cents;
  fixedCostCents: Cents;
  durationMonths: number;
  recoveryBps: Bps;
};

export type ProcedureResult = {
  procedure: Procedure;
  claimCents: Cents;
  expectedRecoveryCents: Cents;
  internalCostCents: Cents;
  totalCostCents: Cents;
  expectedNetCents: Cents;
  discountedNetCents: Cents;
  breakEvenClaimCents: Cents;
  durationMonths: number;
};

function checkAmount(value: Cents, label: string): Result<true> {
  if (!Number.isInteger(value) || value < 0) {
    return fail(`${label} must be a non-negative integer amount in cents`);
  }
  return ok(true);
}

function checkRate(value: Bps, label: string): Result<true> {
  if (!Number.isInteger(value) || value < 0 || value > 10000) {
    return fail(`${label} must be between 0 and 10000 bps`);
  }
  return ok(true);
}

/**
 * A procedure is a project: expected recovery is probability-weighted cash,
 * while internal hours and fixed fees are paid whether or not the claim wins.
 * The break-even claim is the amount at which expected net is zero, so a
 * small invoice can be routed away from an expensive forum without arguing
 * about the merits. Discounting puts the recovery at its present value
 * because the cash arrives months after the cost.
 */
export function evaluateProcedure(
  claimCents: Cents,
  cost: ProcedureCost,
  discountRateBps: Bps = 1000,
): Result<ProcedureResult> {
  if (!Number.isInteger(claimCents) || claimCents <= 0) {
    return fail("claim must be a positive integer amount in cents");
  }
  if (!Number.isInteger(cost.internalHours) || cost.internalHours < 0) {
    return fail("internal hours must be a non-negative integer");
  }
  const hourly = checkAmount(cost.hourlyCostCents, "hourly cost");
  if (!hourly.ok) {
    return hourly;
  }
  const fixed = checkAmount(cost.fixedCostCents, "fixed cost");
  if (!fixed.ok) {
    return fixed;
  }
  if (!Number.isFinite(cost.durationMonths) || cost.durationMonths <= 0) {
    return fail("duration months must be greater than zero");
  }
  const recovery = checkRate(cost.recoveryBps, "recovery rate");
  if (!recovery.ok) {
    return recovery;
  }
  if (cost.recoveryBps === 0) {
    return fail("recovery probability must be greater than zero");
  }
  const discount = checkRate(discountRateBps, "discount rate");
  if (!discount.ok) {
    return discount;
  }

  const internalCostCents = Math.round(cost.internalHours * cost.hourlyCostCents);
  const totalCostCents = internalCostCents + cost.fixedCostCents;
  const expectedRecoveryCents = applyRate(claimCents, cost.recoveryBps);
  const years = cost.durationMonths / 12;
  const discountedRecoveryCents = Math.round(
    expectedRecoveryCents / Math.pow(1 + discountRateBps / 10000, years),
  );
  return ok({
    procedure: cost.procedure,
    claimCents,
    expectedRecoveryCents,
    internalCostCents,
    totalCostCents,
    expectedNetCents: expectedRecoveryCents - totalCostCents,
    discountedNetCents: discountedRecoveryCents - totalCostCents,
    breakEvenClaimCents: Math.ceil(
      (totalCostCents * 10000) / cost.recoveryBps,
    ),
    durationMonths: cost.durationMonths,
  });
}

/**
 * Each procedure is evaluated as a standalone path. Summing them would add
 * the same claim three times, once per forum.
 */
export function compareProcedures(
  claimCents: Cents,
  costs: ProcedureCost[],
  discountRateBps: Bps = 1000,
): Result<ProcedureResult[]> {
  if (costs.length === 0) {
    return fail("at least one procedure is required");
  }
  const results: ProcedureResult[] = [];
  for (const cost of costs) {
    const evaluated = evaluateProcedure(claimCents, cost, discountRateBps);
    if (!evaluated.ok) {
      return evaluated;
    }
    results.push(evaluated.value);
  }
  return ok(results);
}

/**
 * Pick the highest expected net. A tie keeps the earlier, cheaper procedure
 * so the model never escalates without a positive gain.
 */
export function bestProcedure(
  results: ProcedureResult[],
): ProcedureResult | null {
  if (results.length === 0) {
    return null;
  }
  let best = results[0];
  for (const result of results) {
    if (result.expectedNetCents > best.expectedNetCents) {
      best = result;
    }
  }
  return best;
}

把 Nord 的 1,126,400 美分代进去:调解返回期望回收 732,160、总成本 151,000、净得 581,160、平衡点 232,308;仲裁返回期望回收 788,480、总成本 952,000、净得 −163,520、平衡点 1,360,000;诉讼返回期望回收 844,800、总成本 2,290,000、净得 −1,445,200、平衡点 3,053,334。bestProcedure 在三种里选调解。

代码不处理执行风险、对方资产状况和管辖地带来的额外差旅;这些都会改变固定费用或回收概率,调用前手工调整输入即可。折现率默认 10%,是一个教学假设,不是资金成本的真实估计;换成自己的资金成本,比较结论可能变,但公式不变。

小结

  • 程序选择是三组成本:内部工时、固定费用、时间;回收概率只是其中一半。
  • 11,264 的争议:调解净得 5,811.60,仲裁 −1,635.20,诉讼 −14,452;只有调解为正。
  • 盈亏平衡点:调解 2,323、仲裁 13,600、诉讼 30,533;低于平衡点的争议不应进入该程序。
  • 管辖地会改变固定费用:加 6,000 的当地律师与差旅,仲裁平衡点从 13,600 升到 22,171。
  • 按 10% 折现,仲裁净得降到 −2,685.58,诉讼降到 −16,243.10;时间越长越不利。
  • 小额争议走仲裁不经济:8,500 的固定费用在 11,264 的金额上收不回来。
  • 调解不是无条件好;对方失联或没有可执行资产时,和解协议也只是一张纸。
  • 矩阵先看符号,再看大小;符号由金额、成本、概率决定,不由对方是否有理决定。

阅读导航:上一节:5.1 违约的四种形态 · 下一节:5.3 证据链与止损 。

常见错误与边界

  1. 把仲裁当成「更便宜的诉讼」。 仲裁的固定费用 8,500 在 11,264 的争议上远高于调解的 1,000;便宜与否取决于金额。
  2. 只比律师费,不比内部工时。 20 小时的诉讼准备按 85 美元/小时是 1,700,这笔机会成本经常被漏掉。
  3. 忽略管辖地的差旅成本。 对方所在地仲裁要多 5,000–15,000;20,000 的争议可能因此从正变负。
  4. 把回收概率当胜诉率。 70% 和 75% 已包含执行不到的情形;胜诉不等于拿到钱。
  5. 不做盈亏平衡。 13,600 是仲裁的门槛;低于门槛的争议,程序成本已经超过期望回收。
  6. 忽略时间价值。 18 个月后的 7,884.80 按 10% 折现只值 6,834.42;固定费用却是现在付。
  7. 把三种程序的期望值相加。 它们是同一笔争议的三条路径,相加会把同一笔钱算三次。
  8. 调解不成就立刻升级。 升级前要重算新程序的平衡点;金额没变,成本变了,结论可能反转。
  9. 在对方失联时继续选程序。 没有可执行资产时,裁决只是纸;应先保全和止损,而不是换一个更贵的程序。
  10. 把教学费率当报价。 调解员、仲裁机构和律师的收费因辖区和复杂度差异很大;表里的数字只用于比较结构。

本节的边界是「程序成本的期望值比较」:只覆盖调解、仲裁、诉讼三种路径的工时、固定费用、周期和概率,不展开证据规则、保全措施、裁决承认执行的具体条件和跨境法律适用。所有费用、周期与概率均为教学假设;具体程序选择因司法辖区而异,本节不构成法律意见。违约形态如何量化见 5.1 违约的四种形态 ,证据如何影响能否主张见 5.3 证据链与止损 。

继续阅读

探索更多技术文章

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

全部文章 返回首页

「books」更多文章

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