以下情境为教学假设,人物与数字不代表经核实的真实案例。
流转税按交易收,所得税按利润收。两者最容易混淆的地方是基数:流转税的基数是销售额,所得税的基数是收入减去可扣除成本、费用和损失后的应税利润。一个高收入、低利润的生意可能几乎不缴所得税,却仍然要处理每一笔流转税;一个高利润、低收入的生意则相反。把两者混在一个「税率」里,预算和定价都会失真。
这一节只讨论财务口径:应税利润从哪里来、三种主体的税负落在谁身上、常设机构什么时候把纳税义务带到客户所在国、税后现金怎样影响 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 Ltd | 17% | 公司实体 | 通常可结转,按当地规则 | 分红规则与公司税衔接,分配时再看预提 |
| Wyoming LLC | 24% | 所有者个人 | 穿透到个人申报表 | 利润直接属于所有者,分配不产生公司层税 |
| 英国 Ltd | 25% | 公司实体 | 通常可结转,按当地规则 | 分红与工资的税负不同,需分别测算 |
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,299 | 24.3% |
| Tidecast | $29,081 | $2,423 | $92,090 | 66.7% |
| Nord Studio | $8,580 | $715 | $25,740 | 16.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 跨境预提、转让定价与资金回流 。
常见错误与边界
- 用收入乘税率。 收入 $240,240 乘 17% 得到 $40,841,既不是 LedgerLite 的所得税 $11,941,也不是任何真实税负。
- 把 SDE 当法定应税利润。 SDE 是管理口径,真实申报要调整折旧、摊销、业主福利、不可扣除项目和亏损结转。
- 对 LLC 重复扣税。 LLC 穿透时,公司层不缴所得税;再按 24% 扣一次公司税,会把税负算重。
- 把公司税后利润当创始人到手现金。 分红、工资、预提和股东层规则还会再影响一次。
- 忽略常设机构。 在客户所在国长期驻留、派员工或通过代理签约,可能把利润的征税权分给当地。
- 只按本国税率算,不做协定和抵免。 同一笔利润可能在两个辖区申报,抵免不足会抬高实际税负。
- 税负准备按年不按月。 预缴可能集中在特定月份,年底才留钱会把 runway 压到水位以下。
- 把教学税率当现行税率。 17%、24%、25% 都是示例,不能直接用于报价、预算或申报。
- 把税收抵免当自动全额。 抵免有上限、结转和时间差,来源国多征的部分不一定能全部拿回。
所得税之后,还有一层发生在跨境付款环节:预提税。下一节把毛额、净额、协定税率和收款走廊放在一起,回答「合同金额到底有多少能回到账上」。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。