Inspect the Arithmetic — CCPC Income Tax Calculator
Version 1.2
Last verified: August 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 CCPC calculator page.
No opinions. No hidden assumptions. Just arithmetic.
Purpose
This calculator estimates combined corporate and personal income tax for a Canadian-Controlled Private Corporation (CCPC) and its shareholder(s) for the 2025 or 2026 tax year.
It models:
- Corporate taxable income and corporate tax (federal and provincial) on active business income.
- After-tax cash inside the corporation and retained earnings after distributions.
- Personal income tax, CPP, and EI for one or two shareholders receiving salary and/or dividends.
- The combined corporate + personal income tax and an effective income-tax rate on gross corporate revenue. Employee CPP/EI and employer CPP are shown separately.
Definitions
Let:
- Y = tax year (2025 or 2026)
- Pcorp = province/territory of incorporation (for corporate tax)
- Ppers = province/territory of residence for shareholders (for personal tax; assumed equal to Pcorp unless overridden later)
- R = gross corporate revenue
- X = deductible business expenses (exclude shareholder salary; salary is entered separately)
- Ppre = max(0, R − X), corporate income before owner compensation (salary and employer CPP)
- CPPemp = employer CPP on T4 salary (matched to employee CPP in the payroll model, per employment)
- Icorp = corporate taxable income after salary and employer CPP
- FedSBDLimit = federal small business deduction limit (typically $500,000)
- ProvSBDLimit = provincial or territorial small business deduction limit from the corporate tax data files
- rfed,SBD, rfed,gen = federal SBD and general corporate tax rates
- rprov,SBD, rprov,gen = provincial SBD and general corporate tax rates
- Taxfed,corp = federal corporate tax
- Taxprov,corp = provincial corporate tax
- Taxcorp = total corporate tax
- Cashafter = after‑tax corporate cash (before distributions)
- For one shareholder:
- S = salary/bonus paid to the shareholder
- Delig = eligible dividends paid
- Dne = non‑eligible dividends paid
- Opers = other personal income
- G = capital gains (cash amount; 50% inclusion applied by the personal engine)
- RRRSP = RRSP contribution this year (treated as a current‑year deduction)
- RFHSA = FHSA contribution deduction claimed this year
- Dpers = personal deductions (user‑entered estimate)
- For two shareholders (income splitting):
- S1, S2 = salary/bonus paid to shareholder 1 and 2
- Delig,1, Delig,2 = eligible dividends to each shareholder
- Dne,1, Dne,2 = non‑eligible dividends to each shareholder
- Opers,1, Opers,2 = other personal income
- G1, G2 = capital gains for each shareholder
- RRRSP,1, RRRSP,2 = RRSP contribution this year for each shareholder (treated as a current‑year deduction)
- RFHSA,1, RFHSA,2 = FHSA deduction claimed this year for each shareholder
- Dpers,1, Dpers,2 = personal deductions
- CPP, EI = employee CPP contributions and EI premiums on salary (per shareholder)
- Taxpers = total personal income tax (federal + provincial) for a given shareholder
- Taxpers,1, Taxpers,2 = total personal tax for shareholders 1 and 2
- Burdentotal = combined corporate tax + personal income tax for all shareholders
- Rateeff = effective combined tax rate on gross revenue
- RetEarn = retained earnings after all modeled distributions
Corporate Tax Arithmetic
Corporate tax is computed by the pure engine function calculateCorporateTax(taxableIncome, province) in corporate.engine.js,
using corporate tax data from federal-corporate.json and provinces-corporate.json.
1. Corporate Taxable Income
Ppre = max(0, R − X)
Icorp = max(0, Ppre − S − CPPemp) (one shareholder; S = salary to that shareholder)
Icorp = max(0, Ppre − (S1 + S2) − (CPPemp,1 + CPPemp,2)) (two shareholders)
Negative results are clipped to 0. Salary and employer CPP are deductible corporate expenses and are modeled from the salary inputs (not from X). Employee CPP and EI remain on the personal side only. Loss carryforwards, loss carrybacks, and passive investment income rules are out of scope.
2. Federal and Provincial Corporate Tax
The engine applies a simple two‑tier structure. Federal tax uses the federal small business deduction limit, while provincial or territorial tax uses that jurisdiction's own limit where it differs from the federal limit:
If income is within the applicable SBD limit:
All income taxed at SBD rates.
Else:
Income up to the applicable SBD limit taxed at SBD rates.
Income above the applicable SBD limit taxed at general rates.
Federal side:
FedSBDIncome = min(Icorp, FedSBDLimit)
FedGenIncome = max(0, Icorp − FedSBDLimit)
Taxfed,corp = FedSBDIncome × rfed,SBD + FedGenIncome × rfed,gen
Provincial side (using province‑specific rates and SBD limit where applicable):
ProvSBDIncome = min(Icorp, ProvSBDLimit)
ProvGenIncome = max(0, Icorp − ProvSBDLimit)
Taxprov,corp = ProvSBDIncome × rprov,SBD + ProvGenIncome × rprov,gen
Total corporate tax and after‑tax cash:
Taxcorp = Taxfed,corp + Taxprov,corp
Cashafter = Icorp − Taxcorp
Distributions and Retained Earnings
3. Single‑Shareholder Scenario
Salary is already reflected in Icorp (and in Cashafter). Retained earnings compare after‑tax corporate cash only to dividends paid from post‑corporate‑tax funds:
Distsingle = Delig + Dne
RetEarn = max(0, Cashafter − Distsingle)
If modeled dividends exceed after‑tax corporate cash, retained earnings are clipped to zero rather than displaying negative corporate equity. Salary plus employer CPP that exceeds this year’s income before compensation likewise floors corporate taxable income at zero while still treating the salary as paid on the personal side. Those cases are allowed as tax illustrations; they imply funding from resources not modeled here (for example prior corporate cash). The UI flags them. The corporate side does not enforce a full balance sheet, opening cash, GRIP, or RDTOH.
4. Two‑Shareholder (Income Splitting) Scenario
When “income splitting” is enabled, the same rule applies using total dividends to both shareholders:
Distsplit = (Delig,1 + Dne,1) + (Delig,2 + Dne,2)
RetEarn = max(0, Cashafter − Distsplit)
Personal Tax Arithmetic
Personal tax for each shareholder is computed by the shared personal tax engine computePersonalTax() in /calculators/canada-income-tax/js/tax.engine.js,
using the same brackets, credits, CPP/EI logic, and dividend rules as the standalone Canada Personal Income Tax Calculator.
For each shareholder, the CCPC bridge module computeCCPCTax() constructs a personal tax input object:
- Employment income = salary from the corporation (S, S1, or S2).
- Eligible and non‑eligible dividends = dividends from the corporation.
- Other income = Opers, Opers,1, or Opers,2.
- Capital gains = G, G1, or G2 (cash amount; taxable capital gains use the personal engine’s 50% inclusion rate).
- RRSP contribution = RRRSP, RRRSP,1, or RRRSP,2 (user‑entered contribution this year; assumed claimed in full as a current‑year deduction).
- FHSA deduction = RFHSA, RFHSA,1, or RFHSA,2 (user‑entered amount claimed this year).
- Estimated deductions = Dpers, Dpers,1, or Dpers,2 (amounts that reduce taxable income, not tax credits such as medical expenses or charitable donations).
- Tax already paid = 0 (no modeled source deductions in this tool).
The personal engine then follows the methodology documented on the Canada Personal Income Tax Calculator methodology page:
it computes taxable income, federal and provincial tax, dividend gross‑up and DTC, CPP/EI, and marginal/average rates.
6. Personal Outputs Used by the CCPC Calculator
From each personal tax run, the bridge reads:
- Total income tax (federal + provincial) for each shareholder.
- CPP and EI contributions (employee amounts). These are shown separately and are subtracted in take‑home pay. They are not added into the headline total income tax.
- Take‑home income after income tax + CPP + EI.
The CCPC UI surfaces a simplified summary for each shareholder: personal income tax, employee CPP/EI, and net take‑home pay.
Combined Income Tax and Effective Rate
7. Single‑Shareholder Combined View
For a single shareholder, the bridge computes:
Taxpers = output of personal engine (total income tax)
Taxcorp = total corporate tax (federal + provincial)
IncomeTaxtotal = Taxcorp + Taxpers
Rateeff =
\[
\begin{cases}
0, & \text{if } R = 0 \\
\dfrac{IncomeTax\_{total}}{R}, & \text{otherwise}
\end{cases}
\]
NetPersonalTakeHome = take‑home income from personal engine
The headline combined figure is corporate plus personal income tax. Employee CPP and EI are payroll deductions, not income tax; they appear as their own result rows and in take‑home. Employer CPP is a deductible corporate expense and is also shown separately. The effective rate is income tax divided by gross corporate revenue (R), not corporate profit.
8. Two‑Shareholder Combined View
For two shareholders, the bridge computes:
Taxpers,1, Taxpers,2 = total income tax for each shareholder
Taxcorp = total corporate tax
IncomeTaxtotal = Taxcorp + Taxpers,1 + Taxpers,2
Rateeff =
\[
\begin{cases}
0, & \text{if } R = 0 \\
\dfrac{IncomeTax\_{total}}{R}, & \text{otherwise}
\end{cases}
\]
NetPersonalTakeHome = take‑home1 + take‑home2
The calculator displays corporate results (taxable income, tax, after‑tax cash, retained earnings), per‑shareholder results (personal tax and net take‑home),
and the combined totals and effective rate.
Assumptions and Limitations
- Tax year can be 2025 or 2026; corporate and personal parameters are loaded from year-specific JSON data files.
- For 2025 Nova Scotia and Prince Edward Island, the stored provincial corporate rates are the post-change rates applied to the entire tax year. The calculator does not prorate those mid-year changes by days. Corporate tax year start is used for Quebec-style effective-rate selection where encoded; it is not a day-count proration engine.
- Eligible vs non-eligible dividend treatment is a user assumption. GRIP and general-rate income capacity are not tracked.
- Salary and dividends are not constrained to this year’s modeled corporate cash. Amounts above current-year income or after-tax cash imply other resources (for example prior cash) and are flagged in the UI.
- The calculator models active business income only; investment income, passive income rules, and refundable taxes on investment income are not included.
- No associated‑corporation rules or grind‑downs of the SBD limit are modeled; the small business limit is applied as‑is from the data files.
- Loss carryforwards, loss carrybacks, and integration with previous or future years are out of scope.
- RRSP contribution is user‑entered and mapped to the personal engine as a current‑year RRSP deduction (full contribution claimed this year). FHSA deduction is user‑entered the same way. Contribution room, unused‑contribution carry‑forward, over‑contribution penalties, and first‑60‑days timing rules are not modeled. Capital gains are entered as the cash amount; the personal engine applies the 50% inclusion rate.
- Source deductions (withholding at source) and installments are not modeled; tax paid is treated as 0 and the focus is on the structural burden rather than balances owing or refunds.
- Shareholder province of residence is assumed to match the corporate province for personal tax purposes in this version.
- All amounts are in Canadian dollars, and bracket thresholds and rates are taken directly from the data files; any corrections to those data sources will flow through to this calculator.
- Rounding is applied at the display layer and in some bracket summaries; internal computations use full floating‑point precision.
Implementation Notes
- The corporate engine
calculateCorporateTax() is pure and deterministic: given taxable income, province, and corporate tax year start date, it returns tax and a full breakdown, including federal/provincial SBD limits and per‑tier amounts.
- The personal engine
computePersonalTax() is shared with the Canada Personal Income Tax Calculator and is validated separately via known‑answer tests.
- The bridge
computeCCPCTax() combines these outputs and is responsible only for mapping inputs, summing taxes, and computing combined metrics.
- The “Show the Math” section on the CCPC calculator page reads directly from these engine outputs to render bracket tables and summary lines; this methodology page describes the underlying steps.
If any discrepancy is identified between this documentation and the live CCPC calculator, the corporate engine, canonical personal tax engine,
and CCPC bridge (corporate.engine.js, /calculators/canada-income-tax/js/tax.engine.js, and ccpc.bridge.js) are the source of truth. This page will be updated to match them.
What This Calculator Does Not Include
- Part I / Part IV refundable tax on aggregate investment income and RDTOH pools.
- GRIP / eligible-dividend capacity ledgers.
- Opening corporate cash or a multi-year balance sheet.
- Day-count proration of mid-year provincial corporate rate changes (including 2025 Nova Scotia and Prince Edward Island).
- Associated corporations, SBD grind-downs, and complex corporate groups.
- Quebec-specific corporate tax schedules beyond the encoded provincial data.
- AMT, trust rules, and professional corporation governance nuances.
- Real-time CRA assessments, instalments, and interest or penalties.
Sources and References