Inspect the Arithmetic — CCPC 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 CCPC calculator page.
No opinions. No hidden assumptions. Just arithmetic.
Purpose
This calculator estimates the combined tax burden for a Canadian Controlled Private Corporation (CCPC) and its shareholder(s) for the 2025 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 tax burden and an effective overall tax rate on gross corporate revenue.
Definitions
Let:
- Y = tax year (fixed at 2025 in this version)
- 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
- Icorp = corporate taxable income
- SBDLimit = federal small business deduction limit (typically $500,000), applied for the chosen province using 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
- 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
- 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
Icorp = max(0, R − X)
Negative results (where expenses exceed revenue) are clipped to 0 for this calculator. Salaries or bonuses paid to shareholders are assumed to already be included in deductible business expenses (X). The calculator does not deduct salary again when computing corporate taxable income. 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 based on the small business deduction limit SBDLimit:
If Icorp ≤ SBDLimit:
All income taxed at SBD rates.
Else:
Income up to SBDLimit taxed at SBD rates.
Income above SBDLimit taxed at general rates.
Federal side:
FedSBDIncome = min(Icorp, SBDLimit)
FedGenIncome = max(0, Icorp − SBDLimit)
Taxfed,corp = FedSBDIncome × rfed,SBD + FedGenIncome × rfed,gen
Provincial side (using province‑specific rates and SBD limit where applicable):
ProvSBDIncome = min(Icorp, SBDLimit)
ProvGenIncome = max(0, Icorp − SBDLimit)
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
For a single shareholder, the calculator treats the salary and dividends the shareholder receives as distributions out of
the corporate after‑tax cash:
Distsingle = S + Delig + Dne
RetEarn = max(0, Cashafter − Distsingle)
If modeled distributions exceed after‑tax corporate cash, retained earnings are clipped to zero rather than displaying negative corporate equity. The corporate side does not enforce balance‑sheet constraints beyond this max‑zero clipping; over‑distributions relative to Cashafter
are not flagged separately in this version.
4. Two‑Shareholder (Income Splitting) Scenario
When “income splitting” is enabled:
Distsplit = (S1 + Delig,1 + Dne,1) + (S2 + 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 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.
- RRSP and FHSA deductions = 0 in this CCPC calculator.
- Estimated deductions = Dpers, Dpers,1, or Dpers,2.
- Tax already paid = 0 (no modeled source deductions in this tool).
The personal engine then follows the methodology documented in the personal income tax 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 (implicitly included in the total burden in the personal engine).
- Take‑home income after income tax + CPP + EI.
The CCPC UI surfaces a simplified summary for each shareholder: total personal tax, total burden, and net take‑home pay.
Combined Burden 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)
Burdentotal = Taxcorp + Taxpers
Rateeff =
\[
\begin{cases}
0, & \text{if } R = 0 \\
\dfrac{Burden\_{total}}{R}, & \text{otherwise}
\end{cases}
\]
NetPersonalTakeHome = take‑home income from personal engine
The effective rate is expressed relative to gross corporate revenue (R), not corporate profit. This shows the combined corporate + personal tax burden relative to the total income generated by the business.
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
Burdentotal = Taxcorp + Taxpers,1 + Taxpers,2
Rateeff =
\[
\begin{cases}
0, & \text{if } R = 0 \\
\dfrac{Burden\_{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 is fixed at 2025; corporate and personal parameters are loaded from JSON data files for that year only.
- 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, FHSA, and other registered‑account interactions for shareholders are not modeled; the CCPC calculator passes zero for those fields into the personal engine.
- 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 and province, it returns tax and a full breakdown, including SBD limit 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 engine modules
(corporate.engine.js, tax.engine.js, and ccpc.bridge.js) are the source of truth. This page will be updated to match them.