EH HR Payroll Canada
Federal and provincial income tax, CPP and EI on the EH salary-rule engine, ready to run and yours to keep current.
Why this module
EH HR Payroll Canada
Tested math, editable tables
The marginal tax method, CPP exemption-and-cap logic and EI cap logic are fixed in code and covered by tests. Federal and provincial brackets are data records and CPP and EI rates, exemption and maximums are company settings, so you keep the figures current against CRA and provincial rates without touching code.
One payslip, one structure
Federal tax, provincial tax, CPP and EI are exposed to salary rules through the engine seam, so they run inside the same payslip computation as basic, gross, deductions and net. The CA_STANDARD structure wires all seven rules in sequence out of the box.
Templates flagged, not hidden
Seeded brackets and contribution defaults are clearly marked as a template to verify, and the provincial set is one representative schedule you replace for your province. The module never pretends to be a filing-ready CRA engine; it gives you the calculation spine and leaves the year-specific numbers in your hands.
Day in the life
From wage to net in one compute
An employee on the CA_STANDARD structure has a monthly slip computed. The engine annualises the period gross, runs it through the federal brackets and the provincial brackets, takes CPP on pensionable earnings between the basic exemption and the maximum pensionable amount, takes EI on insurable earnings up to the maximum insurable amount, divides each back to the period, and lands net pay. An HR admin who needs to update the new tax year opens Tax Brackets (CA) and edits the rows in the list, then adjusts the CPP and EI rates on the company. No code change, no redeploy.
Edge cases
The cases most modules quietly ignore.
In the shipped code today, each one a place where a cheaper module silently does the wrong thing.
Period gross is annualised by the inferred pay frequency (weekly 52, fortnightly 26, monthly 12, and so on), taxed or contributed on the annual figure, then divided back to the period and rounded to two decimals, so a weekly and a monthly slip on the same annual rate stay consistent.
CPP applies to pensionable earnings only: annual earnings are capped at the maximum pensionable amount, the basic exemption is removed, and the result is floored at zero so low or zero earnings never produce a negative contribution.
EI applies to insurable earnings capped at the maximum insurable amount; above the cap the contribution flattens. If the maximum is left at zero the full annualised earnings are treated as insurable rather than silently dropping the deduction.
All four helpers return zero on non-positive gross or a missing pay-period count, so empty or malformed slips compute cleanly instead of raising.
The marginal loop walks brackets in ascending order and stops once annual income is exhausted; the top band uses a very large upper bound so the highest marginal rate covers all remaining income.
Bracket records are read-write for HR admin, read-and-edit-but-not-delete for HR officers, and read-only for employee self-service, so rate tables cannot be removed by lower-privileged roles.
CPP and EI rate, exemption and maximum live on res.company and are read from the payslip company, so companies in one database can carry different contribution settings.
What is inside
Built to do the job, end to end.
- Marginal tax engine. eh.hr.ca.tax.bracket holds federal and provincial bracket sets selected by a jurisdiction field, with compute_annual_tax walking the slices and compute_period_tax annualising and dividing back. Five federal and four provincial template bands are seeded.
- CPP and EI helpers. The payslip extension adds tax_federal, tax_provincial, cpp and ei callables to the salary-rule sandbox. CPP nets the basic exemption off capped pensionable earnings; EI caps insurable earnings; both annualise then divide back to the period.
- Company settings. res.company gains CPP rate, CPP basic exemption, CPP maximum pensionable, EI rate and EI maximum insurable, each seeded with a template default you verify against current CRA figures.
- CA_STANDARD structure. A seeded salary structure with seven rules in sequence: basic, gross, federal tax, provincial tax, CPP, EI and net, mapped to the engine category ids so totals roll up correctly.
- Admin views and access. An editable Tax Brackets (CA) list under the payroll menu lets admins maintain bands in place, with three access tiers across HR admin, officer and employee-self roles.
- Tested calculations. A post-install test suite sets controlled brackets and rates and asserts the federal marginal split, provincial flat case, CPP, EI, total deductions and net on a full computed payslip, so the engine math is proven independent of the template figures.
Honest about the edges
What this does not do, so nothing surprises you.
- Seeded federal and provincial brackets and the CPP and EI defaults are a template only; you must confirm every figure against current CRA and provincial rates for the tax year before running real pay.
- The provincial schedule is one representative bracket set. There is no per-province table and no support for running multiple provinces inside a single company; replace the bands for the province you operate in.
- No TD1 personal tax credits, surtaxes, or non-refundable credit handling; income tax is computed straight on gross through the marginal brackets.
- No Quebec-specific QPP, QPIP, or separate Quebec provincial tax handling, and no second additional CPP tier (CPP2) modeling.
- Caps and exemptions are applied per period through annualisation, not as cumulative year-to-date tracking across multiple payslips, so a true annual-maximum cutoff across the year is not enforced.
- This is a calculation layer, not a filing system: no T4, ROE, or CRA remittance generation is included.
- Requires the EH HR payroll engine (eh_hr_payroll); it is not a standalone payroll product.
Canada payroll Odoo 18, Odoo Canada payroll localization, CRA payroll Odoo, federal income tax payroll, provincial income tax payroll, marginal tax brackets Odoo, CPP Canada Pension Plan Odoo, EI Employment Insurance payroll, pensionable earnings calculation, insurable earnings calculation, Canadian salary structure Odoo, payslip computation Canada, HR payroll Canada Community, CPP basic exemption, maximum pensionable earnings
Need this fitted to the way you work?
ERP Heritage delivers end to end Odoo work: Odoo Implementation, Customization and Development, Integration, Migration, Consultation, Support and Training. We help teams put this module into production, shape it to their process, and keep it running.
We work with businesses across Australia (Melbourne, Sydney, Brisbane, Perth, Adelaide, Canberra) and the Middle East (Dubai, Abu Dhabi, Riyadh, Jeddah, Doha, Kuwait City, Muscat). Start a conversation at erpheritage.com.au or email info@erpheritage.com.au.
Languages
Available in 19 languages
The interface ships translated out of the box. Switch language in Odoo and the fields, menus, and messages follow.
Modules teams pair with this one.
Premium ERP Heritage modules that extend the same stack, each built to the same engineering bar.
Inbound webhook receiver for the Employment Hero people and payroll platform on Odoo 18 Community
Real-time fiscalisation of customer invoices and credit notes with the Mauritius Revenue Authority e-Invoicing (E...
The Canada country pack for the ERP Heritage Employment Hero integration
Imports finalised pay run journals from the Employment Hero payroll platform (KeyPay) into Odoo Community account...
Please log in to comment on this module