Inspectable Arithmetic for the Canada Personal Income Tax Calculator

Version 1.0
Last updated: March 2026

Transparent arithmetic is the operating system of this calculator.

This document publishes the formulae, computational structure, and assumptions used to generate the outputs displayed on the calculator page.

No opinions. No hidden assumptions. Just arithmetic.

Purpose

This calculator estimates combined federal and provincial/territorial personal income tax for the 2025 tax year in Canada. It models regular income, common investment income types, registered-account deductions, and payroll contributions, then reports total income tax, CPP/EI, average and marginal tax rates, and take-home pay by province or territory.

Definitions

Let:

Core Equations

1. Taxable Income

Dividend gross-up uses CRA-style rates from the internal dividends.json data file. Grossed-up dividends:

Delig,gross = Delig × gelig
Dne,gross = Dne × gne

Taxable capital gains:

Gtaxable = G × rcg

Taxable income TI:

TI = max(0, E + S + O + Delig,gross + Dne,gross + Gtaxable − RRRSP − RFHSA − Dest)

RRSP and FHSA are treated purely as deductions against income for the current year; contribution room, over-contribution penalties, and carry-forward rules are not modeled.

2. Federal Tax

Federal tax is computed using a standard bracket-and-credit structure derived from CRA parameters for 2025 (stored in federal.json).

Step 1 — bracket tax on TI:

BaseTaxfed = Σbrackets (income in bracket × rate)
(rounded to the nearest dollar per bracket)

Step 2 — non-refundable credits (Schedule 1 style):

Creditsfed = BPAfed × cfed + [CEA × cfed if E > 0] + (CPP + EI) × rCPP/EI,cred
TaxAfterCreditsfed = max(0, BaseTaxfed − Creditsfed)

Step 3 — federal dividend tax credit (DTC):

For each dividend type (eligible, non-eligible), the calculator computes a dividend tax credit using an explicit schema (base and rate) from dividends.json. The arithmetic is:

DTCelig,fed = Delig,gross × rDTC,elig,fed
DTCne,fed = Dne,gross × rDTC,ne,fed
DTCfed = DTCelig,fed + DTCne,fed
TaxAfterDTCfed = max(0, TaxAfterCreditsfed − DTCfed)

Step 4 — minimum tax adjustments (not modeled in 2025 engine):

Taxfed = TaxAfterDTCfed

3. Provincial / Territorial Tax

Provincial / territorial tax uses the same taxable income TI but parameters from the selected province or territory in provinces.json. Two flows exist: a generic flow for most provinces and an Ontario-specific flow that mirrors ON428 ordering and arithmetic.

3.1 Generic provinces

For provinces and territories other than Ontario:

  1. Compute base bracket tax on TI using province-specific brackets and rates.
  2. Subtract non-refundable credits (e.g., provincial Basic Personal Amount, using the configured credit rate or the lowest bracket rate).
  3. Apply surtaxes, if any, to tax after credits.
  4. Apply provincial dividend tax credit.
  5. Apply provincial reductions or premiums (if configured).
BaseTaxprov = Σ(income in bracket × rate)
Creditsprov = BPAprov × cprov (and other credits, if configured)
TaxAfterCreditsprov = max(0, BaseTaxprov − Creditsprov)
TaxAfterSurtaxprov = TaxAfterCreditsprov + Surtaxprov
TaxAfterDTCprov = max(0, TaxAfterSurtaxprov − DTCprov)
Taxprov = TaxAfterDTCprov + Premiumsprov

3.2 Ontario-specific flow

Ontario follows ON428 ordering exactly:

  1. Compute base bracket tax on TI.
  2. Subtract Ontario non-refundable credits (Basic Personal Amount, etc.).
  3. Compute surtax on tax after credits (with two tiers).
  4. Add surtax.
  5. Subtract Ontario dividend tax credit.
  6. Add Ontario Health Premium based on TI.
TaxON = max(0, TaxAfterCreditsON + SurtaxON − DTCON) + OHP

4. CPP and EI

CPP is split into base CPP (CPP1) and additional CPP (CPP2) for 2025.

CPP1 (base CPP):

Pensionable = max(0, min(E, YMPE) − BasicExemption)
CPP1 = min(Pensionable × rCPP, MaxCPP1)

CPP2 (additional CPP on earnings above YMPE):

AdditionalEarnings = max(0, min(E, YAMPE) − YMPE)
CPP2 = min(AdditionalEarnings × rCPP2, MaxCPP2)

Total CPP:

CPP = CPP1 + CPP2

EI:

Insurable = min(E, MaxInsurableEarnings)
EI = min(Insurable × rEI, MaxEI)

5. Total Tax, Burden, and Take-Home Pay

Total income tax (before withholdings):

Taxtotal = Taxfed + Taxprov

Total tax burden including payroll contributions:

Burdentotal = Taxtotal + CPP + EI

Total income before tax (cash income, including full capital gains amounts before inclusion):

Incomegross = E + S + O + Delig + Dne + G

Take-home pay after income tax and payroll:

ATI = Incomegross − Taxtotal − CPP − EI

Balance owing or refund (simplified):

Balance = Taxtotal − Tpaid

6. Average and Marginal Tax Rates

Average tax rate (displayed as a percentage):

AvgRate = Taxtotal ÷ Incomegross

Incomegross reflects cash income (including the full capital gain amount before inclusion), not taxable income TI, so the displayed average rate may differ from CRA-style average rates that use taxable income as the denominator.

Marginal tax rate is computed using a $1 perturbation:

  1. Compute baseline: Taxbaseline = Taxtotal(inputs).
  2. Choose an active income type (employment, then dividends, other income, or capital gains) based on which fields are non-zero.
  3. Add $1 to that income type and recompute tax.
MarginalRate = Taxtotal(inputs with +$1 of chosen income) − Taxbaseline

The engine uses unrounded bracket tax (no per-bracket rounding) for the marginal-rate perturbation, so the $1 change is not lost to rounding. If the combined marginal rate falls outside 0–100%, the calculator falls back to the first in-bounds marginal rate for an active income type.

Assumptions and Limitations

  1. Tax year is fixed at 2025; only provinces and territories supported by the underlying data files are available.
  2. RRSP and FHSA inputs are treated strictly as deductions; contribution room, over-contribution penalties, and carry-forward rules are out of scope.
  3. Only common non-refundable credits are modeled (federal BPA, Canada Employment Amount, CPP/EI credit, provincial BPAs, selected credits encoded in data files).
  4. Additional credits and deductions (medical expenses, tuition, donations, prior-year loss carryforwards, etc.) are not modeled individually; they can be approximated via the “Estimated Additional Deductions” field.
  5. Dividend gross-up and tax credit rates come from federal and provincial data tables for 2025; province-specific nuances beyond the encoded schema are not modeled.
  6. Capital gains use a fixed 50% inclusion rate for 2025 across all provinces.
  7. CPP and EI are modeled from the employee perspective only, using official maximums and rates for 2025; employer contributions are not included.
  8. All amounts are in Canadian dollars; inflation, indexation beyond the configured year, and time value of money are not modeled in this calculator.
  9. All calculations use full floating-point precision internally; rounding occurs only where required to mirror CRA per-bracket rounding and at the display layer.

Implementation Notes

If any discrepancy is identified between this documentation and the calculator output, the arithmetic here governs.