《独立开发者的商业指南·收入与财务工程》9.2 所得税与常设机构

所得税作用在利润上,不作用在收入上。本节把 LedgerLite 的 $11,941、Nord 的 $8,580 和 Tidecast 的 $29,081 放回主体结构,比较 Pte Ltd、LLC 与 Ltd 的纳税落点、常设机构的触发方式,以及税后现金流与税负准备。

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

流转税按交易收,所得税按利润收。两者最容易混淆的地方是基数:流转税的基数是销售额,所得税的基数是收入减去可扣除成本、费用和损失后的应税利润。一个高收入、低利润的生意可能几乎不缴所得税,却仍然要处理每一笔流转税;一个高利润、低收入的生意则相反。把两者混在一个「税率」里,预算和定价都会失真。

这一节只讨论财务口径:应税利润从哪里来、三种主体的税负落在谁身上、常设机构什么时候把纳税义务带到客户所在国、税后现金怎样影响 runway。申报流程和具体表格不在本节展开,操作层见 税务的最低认知 与 主体选型矩阵 。

所得税的税基是利润,不是收入

LedgerLite 的年收入 $240,240,扣除变动成本 $38,000 得到毛利 $202,240,再扣除运营费用 $72,000 得到 SDE $130,240,最后扣除创始人薪酬 $60,000 得到税前利润 $70,240。按 17% 教学税率计算,所得税是 $11,941,净利润 $58,299。这条链条里的每一步都在 3.1 利润表 定义过,本节只把税放在最后一步。

Tidecast 的口径不同。它的 $138,171 是扣除退款、平台分成和支付费之后的净得,再扣营销 $12,000、服务器 $3,000、工具 $2,000,得到 SDE $121,171。Tidecast 是 Wyoming LLC,按案例设定为穿透实体,本身不缴公司所得税,利润落到所有者个人,按 24% 教学边际税率计算,税额 $29,081,可支配现金 $92,090。这里的「应税利润」用 SDE 作为教学口径,真实申报还要按当地规则调整折旧、摊销、业主福利和可扣除项目。

Nord Studio 的年收入 $154,320,扣除直接成本 $24,000 得到毛利 $130,320,再扣两位合伙人工资 $96,000 得到 SDE $34,320。英国 Ltd 按 25% 教学税率计算,所得税 $8,580,可支配现金 $25,740。两位合伙人的工资已经在税前扣除,所以这 $34,320 是「给完工资之后、缴税之前」的利润,不是他们的全部劳动回报。

案例收入或净得税前利润口径教学税率所得税税后现金
LedgerLite$240,240$70,240(SDE 减创始人薪酬)17%$11,941$58,299
Tidecast$138,171$121,171(SDE,穿透到所有者)24%$29,081$92,090
Nord Studio$154,320$34,320(SDE)25%$8,580$25,740

三个税率都是教学示例,不是现行税率,也不能直接套到其他辖区。表里真正可迁移的是结构:先确定应税利润的口径,再确定税落在实体还是所有者,最后才乘税率。顺序反了,就会把「收入乘税率」当成税负,得出一个既不是现金流也不是会计利润的数字。

还有一个经常被漏掉的调整:税前利润不等于现金利润。折旧、摊销、计提的坏账准备、未实现的汇兑损益和股权激励,都会让会计利润与应税利润、现金之间出现时间差。LedgerLite 的固定资产只有 $3,000,这个差异很小;但一旦开始资本化开发成本或计提大额坏账,税负准备就不能只按利润表最后一行乘税率。预算里要同时保留「会计利润」「应税利润」「现金」三个口径,任何一个被当成唯一真相,都会让税负预测失真。

三种主体的税负落点

主体类型改变的不是税率本身,而是「谁欠税、什么时候欠、亏损怎么用、利润怎么拿」。Pte Ltd 和 Ltd 是独立法人,公司利润先缴公司税,股东拿到的是税后分红或工资;LLC 在案例设定中穿透,公司层面不缴税,所有者按个人税率缴税。两种结构在低利润时差别不大,在高利润时差别会被分配规则放大。

主体教学税率纳税落点亏损处理分配影响
新加坡 Pte Ltd17%公司实体通常可结转,按当地规则分红规则与公司税衔接,分配时再看预提
Wyoming LLC24%所有者个人穿透到个人申报表利润直接属于所有者,分配不产生公司层税
英国 Ltd25%公司实体通常可结转,按当地规则分红与工资的税负不同,需分别测算

LedgerLite 的 $11,941 是公司层税,创始人薪酬 $60,000 已经在税前扣除;如果创始人把利润留在公司,公司税后还剩 $58,299,未来分配时可能还有股东层规则。Tidecast 的 $29,081 是所有者层税,LLC 本身没有公司税;如果所有者不分配、留在公司账户,税务上仍按穿透处理,现金留在账上不等于税没发生。Nord 的 $8,580 是公司层税,两位合伙人的工资 $96,000 已经扣除,剩余 $25,740 是公司可支配现金,不是合伙人个人的税后收入。

这就是为什么「税率低的主体」不一定「税后现金多」。LLC 的 24% 看起来比 Ltd 的 25% 低,但 LLC 的利润直接落到个人,个人还可能叠加其他税;Pte Ltd 的 17% 看起来最低,但利润分配时还有一层规则。比较主体必须比较「同一笔利润最终到创始人手里的现金」,而不是比较 headline rate。主体选择的责任、开户和年成本见 主体选型矩阵 ,本节只算税后现金。

主体结构还会影响亏损的使用。公司实体的亏损通常留在公司里结转,不能直接抵创始人的个人收入;穿透实体的亏损可能进入所有者个人申报,但可抵扣范围和上限按当地规则。对早期投入大、收入晚到的独立开发者,这个差异可能比税率差异更值钱:同样是一年亏损,放在公司里可能只能等未来利润,放在穿透实体里可能当年就能抵消其他收入。反过来,盈利年份公司实体可以把利润留在公司、延迟分配,穿透实体则按当年利润征税,即使现金没有取出。选择主体时要把「亏损年份」和「盈利年份」分开算,而不是只看一个稳态年份。

常设机构:把纳税义务带到客户所在国

所得税原则上按居民身份和来源地分配。一个新加坡公司向海外客户卖软件,利润通常先在新加坡纳税;但如果它在客户所在国构成了常设机构(permanent establishment,PE),客户所在国就可以对归属于该机构的利润征税。PE 的认定不看合同标题,而看实际活动:有没有固定场所、有没有习惯性签约的依赖代理人、有没有超过门槛的服务团队、有没有本地库存或项目工地。

触发形态典型事实财务后果
固定场所 PE在客户所在国拥有或长期使用办公室、共用工位的专属区域当地可对归属利润征税,需本地申报
依赖代理人 PE代理人习惯性代表你签约,且不独立代理活动可能被归因为你自己的活动
服务型 PE派员工或承包商在当地提供服务超过协定门槛服务利润可能在当地纳税
工程/项目 PE在当地实施项目超过协定期间项目利润按当地规则归属
本地库存在客户所在国持有存货或仓库可能同时触发流转税与所得税义务
数字业务 nexus用户、收入或数据达到当地规则的连接点规则差异大,需按当期法规逐国核对

门槛的天数、金额和例外都写在双边税收协定和国内法里,且会变。本节不写死任何天数,因为一个错误的数字比没有数字更危险。财务上要做的不是背门槛,而是把「可能触发 PE」的活动放进预算:本地办公室租金、员工差旅、当地申报成本、利润归属测算,以及双重征税抵免的时间差。

PE 风险有明显的活动特征。纯线上销售、没有当地员工、没有本地库存、合同由本国团队远程签约,触发概率通常较低;一旦在当地雇人做销售或支持、租用固定工位、让当地代理习惯性签约,风险就上升。外包不等于没有风险:如果外包团队长期以你的名义在客户所在国工作,也可能被认定为依赖代理人或服务型 PE。控制风险的方式不是把合同写成「独立承包人」就结束,而是让实际活动、合同条款、发票和人员安排保持一致;不一致的安排在税务检查里最先被质疑。

PE 一旦成立,利润不再只按「公司总利润乘本国税率」计算。税务机关会要求把归属于当地机构的利润单独计量,可能用功能风险分析、交易净利润法或其他转让定价方法。结果可能是同一笔利润在两个辖区都被申报,再用外国税收抵免避免双重征税;抵免有上限、有结转规则,也可能因为抵免不足而实际税负上升。LedgerLite 的客户如果集中在某个国家,且当地有常驻销售或支持人员,就必须把 PE 风险放进 8.2 情景模拟 的冲击场景,而不是等收到税务函才处理。

双重征税抵免也不是自动全额。抵免通常以「本国对该笔所得的应纳税额」为上限,超过部分可能结转若干年,也可能直接损失;如果两国对利润的归属口径不同,同一笔利润在来源国被多算、在居民国被少算,抵免就会出现缺口。PE 的财务测算因此不能只算「来源国税率乘归属利润」,还要算抵免上限、时间差和申报成本。对年利润只有几万美元的独立开发者,这些固定成本可能比税款本身更重。

税后现金流与税负准备

所得税不是每月自动扣走的,它通常按年度申报、按季度或分期预缴。这个时间差会让「账面利润」和「可用现金」在一年中反复偏离。按年度税额除以 12 做一个最粗的准备,LedgerLite 每月约 $995,Tidecast 约 $2,423,Nord 约 $715;实际预缴节奏可能更集中,尤其在 Q4 或财年结束前。

案例年所得税月均准备(年税 ÷ 12)税后现金税后现金占收入或净得
LedgerLite$11,941$995$58,29924.3%
Tidecast$29,081$2,423$92,09066.7%
Nord Studio$8,580$715$25,74016.7%

税后现金占收入的比例不能直接比较:LedgerLite 的收入要先扣成本、费用和创始人薪酬,Tidecast 的净得已经扣过渠道费用,Nord 的收入里包含两位合伙人的工资。但同一案例内部,这个比例可以用来检查税负准备是否足够。Nord 的 $25,740 可支配现金,在 8.3 runway 与最低现金水位 里已经低于自身水位,税负准备如果再被挪去发工资,现金安全垫会更薄。

税负准备的原则是「单独账户、按触发节奏、季度校准」。单独账户避免把税金和经营现金混在一起;按触发节奏是因为预缴可能集中在特定月份;季度校准是因为利润预测会变,年初按 $11,941 准备的钱,到了 Q3 可能不够,也可能过多。具体做法见 税费预提 ,本节只强调:所得税准备不是年底才做的事,它从第一笔利润开始就影响 runway。

币种也会改变税负准备的金额。收入以美元或欧元计价、成本以本币支付、税款以主体所在国货币缴纳时,汇率变动会让同一笔利润的应税金额和现金准备出现偏差。LedgerLite 的收入和成本都以美元计价,这个影响较小;跨境主体同时持有多种货币时,税负准备要按缴税币种留钱,而不是按收入币种留钱。

把所得税写成代码

下面的 income-tax.ts 把三种主体的教学税率、纳税落点和税后现金固化。profileFor 返回主体画像,incomeTax 按单一税率计算税额与有效税率,afterTaxCash 返回现金视角,compareEntities 把同一笔利润放到三种结构下横向比较。亏损时税额为 0,但税后结果仍为负,提醒你亏损也要用现金承担。

// file: src/tax/income-tax.ts
// tier: L1
// verify: node --test test/tax/income-tax.test.ts

import { type Cents, sub } from "../core/money.ts";
import { type Bps, applyRate, divide } from "../core/rate.ts";
import { type Result, fail, ok } from "../core/result.ts";

export type EntityKind = "pte-ltd" | "llc" | "ltd";

export type EntityProfile = {
  kind: EntityKind;
  label: string;
  rate: Bps;
  incidence: "entity" | "owner";
};

const PROFILES: Record<EntityKind, EntityProfile> = {
  "pte-ltd": {
    kind: "pte-ltd",
    label: "Singapore Pte Ltd",
    rate: 1700,
    incidence: "entity",
  },
  llc: {
    kind: "llc",
    label: "Wyoming LLC",
    rate: 2400,
    incidence: "owner",
  },
  ltd: {
    kind: "ltd",
    label: "UK Ltd",
    rate: 2500,
    incidence: "entity",
  },
};

export function profileFor(kind: EntityKind): Result<EntityProfile> {
  if (!Object.hasOwn(PROFILES, kind)) {
    return fail(`unknown entity kind: ${kind}`);
  }
  return ok({ ...PROFILES[kind] });
}

export type IncomeTax = {
  kind: EntityKind;
  taxableProfit: Cents;
  rate: Bps;
  tax: Cents;
  afterTax: Cents;
  effectiveRateBps: Bps;
  incidence: "entity" | "owner";
};

/**
 * Applies a single teaching rate to a taxable profit. A loss produces zero
 * tax but keeps the negative after-tax result, because the loss still has to
 * be funded and may be carried forward under local rules.
 */
export function incomeTax(taxableProfit: Cents, kind: EntityKind): Result<IncomeTax> {
  if (!Number.isInteger(taxableProfit)) {
    return fail("taxable profit must be an integer in cents");
  }
  const profile = profileFor(kind);
  if (!profile.ok) {
    return profile;
  }
  const tax = taxableProfit > 0 ? applyRate(taxableProfit, profile.value.rate) : 0;
  return ok({
    kind,
    taxableProfit,
    rate: profile.value.rate,
    tax,
    afterTax: sub(taxableProfit, tax),
    effectiveRateBps: taxableProfit > 0 ? divide(tax, taxableProfit) : 0,
    incidence: profile.value.incidence,
  });
}

export type AfterTaxCash = {
  tax: Cents;
  cash: Cents;
};

/**
 * The cash view of income tax: what remains for distribution, debt service or
 * reserve after the tax charge. For an LLC the charge is shown at owner level,
 * so the cash is the owner's after-tax amount rather than retained company cash.
 */
export function afterTaxCash(
  taxableProfit: Cents,
  kind: EntityKind,
): Result<AfterTaxCash> {
  const result = incomeTax(taxableProfit, kind);
  if (!result.ok) {
    return result;
  }
  return ok({ tax: result.value.tax, cash: result.value.afterTax });
}

export function compareEntities(taxableProfit: Cents): Result<IncomeTax[]> {
  if (!Number.isInteger(taxableProfit)) {
    return fail("taxable profit must be an integer in cents");
  }
  const rows: IncomeTax[] = [];
  for (const kind of ["pte-ltd", "llc", "ltd"] as EntityKind[]) {
    const row = incomeTax(taxableProfit, kind);
    if (!row.ok) {
      return row;
    }
    rows.push(row.value);
  }
  return ok(rows);
}

代码里有三个刻意保留的边界。第一,税率是常量表而不是函数参数,因为主体类型和税率的对应关系是本节的教学设定;真实使用时应该把税率做成可配置输入,并注明法规版本。第二,incomeTax 对亏损只把税额设为零,不模拟结转、弥补和减免,这些规则因辖区而异,代码不替法规做假设。第三,compareEntities 只比较同一笔应税利润在三种结构下的税额,不比较分红、工资、社保和预提,所以它回答的是「公司层或所有者层的初步税负」,不是「创始人最终到手多少」。

把三个案例代入:LedgerLite 的 $70,240 在 Pte Ltd 下得到 $11,941;Nord 的 $34,320 在 Ltd 下得到 $8,580;Tidecast 的 $121,171 在 LLC 下得到 $29,081。三个结果与事实表一致,差额来自税率和口径,不是四舍五入。

这套代码只覆盖单一税率,不处理分级税率、税收抵免、亏损结转和预缴节奏。真实使用时,最少要做三处扩展:把税率和级距做成带生效日期的配置;把「应税利润」和「会计利润」分开输入;把预提税、外国税收抵免和已缴税款作为抵扣项。没有这三处扩展,代码只能回答教学问题,不能直接用于申报。

小结

  • 所得税的基数是应税利润,不是收入;LedgerLite 的 $70,240、Nord 的 $34,320、Tidecast 的 $121,171 是三种不同的税前口径。
  • Pte Ltd 的 $11,941、Ltd 的 $8,580 是公司层税;LLC 的 $29,081 是所有者层税,穿透实体本身不缴公司税。
  • 三个税率都是教学示例,必须按当期法规核对;可迁移的是「先定利润口径、再定纳税落点、最后乘税率」的顺序。
  • 常设机构把所得税义务带到客户所在国;固定场所、依赖代理、服务团队、本地库存和数字业务连接点都可能触发。
  • PE 的财务后果不只是多缴一笔税,还包括本地申报成本、利润归属测算、转让定价和外国税收抵免的时间差。
  • 税后现金要单独做税负准备;LedgerLite 月均约 $995、Tidecast 约 $2,423、Nord 约 $715,实际预缴节奏可能更集中。
  • Nord 的 $25,740 可支配现金已经低于自身现金水位,税负准备不能再被经营现金挤占。

阅读导航:上一节:9.1 销售税/VAT/GST 的注册与代收 · 下一节:9.3 跨境预提、转让定价与资金回流 。

常见错误与边界

  1. 用收入乘税率。 收入 $240,240 乘 17% 得到 $40,841,既不是 LedgerLite 的所得税 $11,941,也不是任何真实税负。
  2. 把 SDE 当法定应税利润。 SDE 是管理口径,真实申报要调整折旧、摊销、业主福利、不可扣除项目和亏损结转。
  3. 对 LLC 重复扣税。 LLC 穿透时,公司层不缴所得税;再按 24% 扣一次公司税,会把税负算重。
  4. 把公司税后利润当创始人到手现金。 分红、工资、预提和股东层规则还会再影响一次。
  5. 忽略常设机构。 在客户所在国长期驻留、派员工或通过代理签约,可能把利润的征税权分给当地。
  6. 只按本国税率算,不做协定和抵免。 同一笔利润可能在两个辖区申报,抵免不足会抬高实际税负。
  7. 税负准备按年不按月。 预缴可能集中在特定月份,年底才留钱会把 runway 压到水位以下。
  8. 把教学税率当现行税率。 17%、24%、25% 都是示例,不能直接用于报价、预算或申报。
  9. 把税收抵免当自动全额。 抵免有上限、结转和时间差,来源国多征的部分不一定能全部拿回。

所得税之后,还有一层发生在跨境付款环节:预提税。下一节把毛额、净额、协定税率和收款走廊放在一起,回答「合同金额到底有多少能回到账上」。

继续阅读

探索更多技术文章

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

全部文章 返回首页

「books」更多文章

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