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:
- Y = tax year (currently 2025)
- P = province or territory of residence for tax purposes
- E = employment income
- S = self-employment (business) income
- O = other income (e.g., interest, rental, pension not modeled elsewhere)
- Delig = eligible Canadian dividends (cash amount)
- Dne = non-eligible Canadian dividends (cash amount)
- gelig = gross-up rate for eligible dividends (e.g., 1.38)
- gne = gross-up rate for non-eligible dividends (e.g., 1.15)
- Delig,gross = grossed-up eligible dividends
- Dne,gross = grossed-up non-eligible dividends
- G = capital gains (cash amount)
- rcg = capital gains inclusion rate (0.50 for 2025)
- Gtaxable = taxable capital gains
- RRRSP = RRSP deduction claimed this year
- RFHSA = FHSA contribution deduction claimed this year
- Dest = other estimated deductions (user-entered)
- Tpaid = income tax already paid / withheld
- CPP = Canada Pension Plan contributions (employee)
- EI = Employment Insurance premiums (employee)
- YMPE = Year’s Maximum Pensionable Earnings (base CPP)
- YAMPE = Year’s Additional Maximum Pensionable Earnings (upper bound for CPP2)
- BasicExemption = CPP basic exemption amount
- rCPP = base CPP contribution rate
- MaxCPP1 = maximum base CPP contribution
- rCPP2 = additional CPP (CPP2) contribution rate
- MaxCPP2 = maximum additional CPP contribution
- MaxInsurableEarnings = maximum EI insurable earnings
- rEI = EI contribution rate
- MaxEI = maximum EI premium
- TI = taxable income
- BPAfed = federal Basic Personal Amount
- CEA = federal Canada Employment Amount
- cfed = federal non-refundable credit rate (lowest federal bracket rate)
- rCPP/EI,cred = CPP/EI credit rate (lowest federal tax bracket rate; 15% for 2025)
- DTCelig,fed, DTCne,fed = federal dividend tax credits for eligible and non-eligible dividends
- DTCfed = total federal dividend tax credit
- BPAprov = provincial/territorial Basic Personal Amount
- cprov = provincial non-refundable credit rate (configured or lowest provincial bracket rate)
- DTCprov = provincial dividend tax credit
- Surtaxprov = provincial/territorial surtax
- Premiumsprov = additional provincial premiums (if any)
- Taxfed = net federal income tax
- Taxprov = net provincial/territorial income tax
- Taxtotal = total income tax (federal + provincial)
- Burdentotal = Taxtotal + CPP + EI (total tax burden)
- Incomegross = total cash income before tax
- ATI = after-tax income (take-home pay after income tax + CPP + EI)
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):
- Basic Personal Amount: BPAfed × cfed
- Canada Employment Amount (if E > 0): CEA × cfed
- CPP/EI credit: (CPP + EI) × rCPP/EI,cred
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:
- Compute base bracket tax on TI using province-specific brackets and rates.
- Subtract non-refundable credits (e.g., provincial Basic Personal Amount, using the configured credit rate or the lowest bracket rate).
- Apply surtaxes, if any, to tax after credits.
- Apply provincial dividend tax credit.
- 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:
- Compute base bracket tax on TI.
- Subtract Ontario non-refundable credits (Basic Personal Amount, etc.).
- Compute surtax on tax after credits (with two tiers).
- Add surtax.
- Subtract Ontario dividend tax credit.
- 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:
- Compute baseline: Taxbaseline = Taxtotal(inputs).
- Choose an active income type (employment, then dividends, other income, or capital gains) based on which fields are non-zero.
- 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
- Tax year is fixed at 2025; only provinces and territories supported by the underlying data files are available.
- RRSP and FHSA inputs are treated strictly as deductions; contribution room, over-contribution penalties, and carry-forward rules are out of scope.
- Only common non-refundable credits are modeled (federal BPA, Canada Employment Amount, CPP/EI credit, provincial BPAs, selected credits encoded in data files).
- 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.
- 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.
- Capital gains use a fixed 50% inclusion rate for 2025 across all provinces.
- CPP and EI are modeled from the employee perspective only, using official maximums and rates for 2025; employer contributions are not included.
- All amounts are in Canadian dollars; inflation, indexation beyond the configured year, and time value of money are not modeled in this calculator.
- 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
- Federal, provincial, payroll, and dividend parameters are loaded from JSON data files and can be overridden for testing.
- Federal and provincial calculations follow the ordering and arithmetic of CRA Schedule 1 and provincial tax forms (e.g., ON428).
- Known-answer tests validate outputs against hand-computed or AI-assisted form calculations for representative scenarios.
- The “Show the Math” section on the calculator page surfaces bracket breakdowns, dividend gross-up details, and CPP/EI inputs using the same engine outputs described here.
If any discrepancy is identified between this documentation and the calculator output, the arithmetic here governs.