NZ Payroll: PAYE, ACC, KiwiSaver
A ready New Zealand salary structure that computes PAYE on progressive marginal brackets, the ACC earner levy, and the KiwiSaver employer contribution on the EH payroll engine.
Why this module
NZ Payroll: PAYE, ACC, KiwiSaver
PAYE the way IRD computes it
PAYE annualises the period gross, taxes it slice by slice across the marginal bands, then divides back to the pay period. The marginal method is the fixed part; the thresholds and rates live in editable data you keep current per tax year.
PAYE, ACC and KiwiSaver in one pass
A single seeded New Zealand structure runs basic, gross, KiwiSaver employer contribution, PAYE, ACC earner levy and net in sequence, so a payslip carries every NZ line without you wiring rules by hand.
Cross-checked against a published IRD figure
Annual income of 70,000 reproduces the IRD income tax figure of 13,220.50 off the seeded bands. The bundled tests assert that published number, the band edge and the full payslip, so the engine matches IRD rather than a rate the test invents.
Day in the life
Run a New Zealand pay period
Assign the New Zealand standard structure to an employee, set the pay period, and compute. The engine annualises the period gross, taxes it across the marginal PAYE bands and divides back, applies the ACC earner levy on liable earnings up to the cap, and adds the KiwiSaver employer contribution at your rate. PAYE and ACC reduce net pay while KiwiSaver sits on the employer side. When IRD or ACC publish new figures for the tax year, you edit the bracket list and the company settings and the next run uses them, with no code change.
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.
Pay periods per year are inferred from the period span (260 daily, 52 weekly, 26 fortnightly, 12 monthly, 1 annual), so PAYE and ACC annualise and divide back correctly for whichever pay frequency the period covers.
The ACC earner levy applies only to liable earnings up to the maximum liable income. Annualised earnings above the cap are clamped before the levy is taken, so high earners are levied on the capped amount, not their full pay.
The KiwiSaver employer contribution is an employer cost, not a deduction from the employee. Net pay subtracts PAYE and ACC only, so the contribution never reduces take-home, which the bundled full-payslip test asserts.
PAYE and ACC short-circuit to zero on non-positive gross or a missing period count, so empty or zero-wage periods produce clean zero lines instead of negative tax or a divide-by-zero.
The top bracket carries a very large upper bound so all income above the last threshold falls into the highest marginal rate, with no gap at the ceiling of the published bands.
The paye, acc and kiwisaver_rate helpers are injected into the engine's closed safe_eval namespace, which exposes read-only proxies and refuses underscore-prefixed names, so salary rules can call them without reaching the raw recordset.
Each compute unlinks the prior lines and rebuilds from the structure rules in sequence, so re-running a payslip after editing a bracket or a rate replaces the figures rather than stacking duplicates.
The PAYE bracket table is editable by HR admin, read and update for officers without delete, and read-only for self-serve, and its menu is gated to the HR admin group, so rate tables are not changed by ordinary users.
What is inside
Built to do the job, end to end.
- Progressive PAYE brackets (eh.hr.paye.bracket). Five seeded marginal bands sourced from the IRD income tax rates, each with an annual upper bound and a marginal rate. compute_annual_paye taxes each income slice at its band rate; compute_period_paye annualises, taxes, divides back. The list view is editable so you maintain the table per tax year.
- ACC earner levy and KiwiSaver settings. Company settings hold the ACC earner levy rate, the ACC maximum liable income and the KiwiSaver employer rate, each as an editable percentage or cap with sensible template defaults you verify against the current ACC and IRD figures.
- New Zealand standard salary structure. A seeded structure (code NZ_STANDARD) with rules for basic, gross, KiwiSaver employer contribution, PAYE, ACC earner levy and net, ordered so PAYE and ACC reduce net while the KiwiSaver contribution stays on the employer side.
- Engine helper seam (paye, acc, kiwisaver_rate). An override of the payroll engine's rule-helper hook exposes paye(gross), acc(gross) and kiwisaver_rate to salary rules inside the engine's safe evaluation sandbox, so the NZ rules stay short, readable expressions.
- Bundled IRD cross-check tests. Tests assert the published IRD income tax figure for a known annual income, the exact band edge, the period scaling and a full payslip across PAYE, ACC, KiwiSaver and net, so the seeded bands reproduce the IRD figures rather than test-set rates.
Honest about the edges
What this does not do, so nothing surprises you.
- The seeded PAYE thresholds and rates, the ACC levy rate and cap, and the KiwiSaver rate are a verified template for the 2025-26 tax year. IRD and ACC revise these figures, so you must confirm them against the current official tables before each tax year. The calculation method is fixed; the rate tables are yours to keep current.
- This module does not generate Inland Revenue payday filing, EI returns or any IR file export. It computes the payroll lines; it does not submit to IRD.
- It does not model ESCT on the KiwiSaver employer contribution, KiwiSaver employee deductions, student loan repayments, secondary tax codes, the independent earner tax credit or other tax-code-specific adjustments. PAYE is computed on the progressive marginal bands only.
- It depends on the EH HR payroll engine and uses its salary-rule structure, pay-period inference and compute workflow. It is not a standalone payroll and does not replace the base engine.
- Multi-company behaviour follows standard Odoo company scoping on payslips and company settings; this module adds no cross-company consolidation of its own.
NZ payroll Odoo, New Zealand payroll module, Inland Revenue PAYE Odoo, IRD tax brackets payroll, progressive marginal PAYE, ACC earner levy Odoo, KiwiSaver employer contribution, New Zealand salary structure, NZ payslip Odoo 19, marginal income tax payroll, Odoo 16 17 18 19 payroll, weekly fortnightly monthly PAYE
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 19 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