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 intends
Income is annualised, taxed bracket by bracket at each marginal rate, then divided back to the period. The test asserts the published Inland Revenue figure of 13,220.50 on a 70,000 annual income off the seeded brackets, so the engine reproduces the IRD result rather than a rate the test invents.
Tables stay current, method stays fixed
Brackets live on a model you can edit, and the ACC levy rate, ACC cap and KiwiSaver rate are company settings. When Inland Revenue or ACC revise their figures, you update the data for the new tax year without touching code or waiting on a release.
Salary rules in one transparent structure
BASIC, GROSS, KiwiSaver, PAYE, ACC and NET are ordinary salary rules in the NZ Standard structure. PAYE and ACC reduce net pay; KiwiSaver is computed employer-side and stays out of net. Every figure is a payslip line you can read and trace.
Day in the life
A monthly run in New Zealand
You assign the NZ Standard structure and compute a payslip. The engine annualises the period gross, runs it through the seeded IRD brackets to produce PAYE, applies the ACC earner levy on earnings up to the liable cap, and adds the KiwiSaver employer contribution at your configured rate. PAYE and ACC show as deductions and reduce net; KiwiSaver shows as an employer line outside net. Before a new tax year you open the PAYE Brackets menu, confirm the thresholds and rates against the current IRD tables, and adjust the ACC rate and cap in company settings.
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.
PAYE annualises the period gross, taxes it on the annual bands, then divides the annual tax back by the pay periods per year, so a monthly slice and the annual figure stay consistent. Pay periods are inferred from the period span (52 weekly, 26 fortnightly, 12 monthly).
The ACC earner levy applies only to liable earnings up to the configured maximum liable income. Annualised earnings above the cap are clamped to the cap before the levy is taken, then the result is divided back to the period.
The KiwiSaver line is computed as gross times the employer rate and sits in the employer category, so it does not reduce the employee net. Net is gross minus the deduction category only.
PAYE and ACC return zero when the period gross is not positive or the pay-period count is missing, and annual PAYE returns zero at or below zero income, so empty or unusual periods do not produce phantom tax.
The highest bracket uses a very large upper bound so all income above the last threshold is taxed at the top marginal rate, and the marginal loop stops once income is exhausted.
The ACC rate, ACC cap and KiwiSaver rate are stored per company on res.company, so each company in a multi-company database carries its own rates and the payslip reads them from the slip's company.
What is inside
Built to do the job, end to end.
- PAYE bracket model and seed. eh.hr.paye.bracket holds the marginal bands with an annual upper bound and a rate. Five brackets are seeded from the IRD 2025-26 tables (10.5, 17.5, 30, 33, 39 percent) as a template you verify and keep current. compute_annual_paye and compute_period_paye carry the marginal method.
- Company settings. res.company gains the ACC earner levy rate, the ACC maximum liable income and the KiwiSaver employer rate, each with a sensible default and a help note to verify against the current published figures for the tax year.
- Engine wiring. The NZ payslip overrides the engine helper seam to expose paye(), acc() and kiwisaver_rate to the salary rules, which run inside the engine's sandboxed safe_eval. No raw recordset reaches a rule.
- NZ Standard structure. A salary structure with BASIC, GROSS, KiwiSaver, PAYE, ACC and NET rules in sequence, mapped to the engine categories so deductions reduce net and the employer contribution does not.
- Brackets screen and access. An editable list view under the payroll menu lets HR admins maintain the brackets, with officer and self-service read scoping defined in the access rules.
- Tests. Tests assert PAYE against the published IRD figure, at the top of a band, across period scaling, and on a full payslip that checks PAYE, ACC with the cap, KiwiSaver and net together.
Honest about the edges
What this does not do, so nothing surprises you.
- Rate tables are a template, not advice: you must confirm the bracket thresholds, the marginal rates, the ACC levy rate and the ACC maximum liable income against the current Inland Revenue and ACC figures for the relevant tax year before you rely on them.
- This is a calculation localization, not a filing tool. It does not produce payday filing, employment information returns or any electronic submission to Inland Revenue.
- It applies a single PAYE bracket set. It does not model secondary tax codes, the M and ME tax codes, the independent earner tax credit, student loan repayments, child support deductions or ESCT on employer KiwiSaver.
- KiwiSaver is the employer contribution only at one rate. Employee KiwiSaver deductions, contribution rate options and the employer superannuation contribution tax are not modelled.
- It does not implement Holidays Act leave accrual or holiday pay, and it carries no payslip PDF or bank payment file of its own; those come from the underlying EH payroll engine and its companions.
- Requires the EH HR Payroll engine and the standard hr module; it is not a standalone payroll.
NZ payroll Odoo 18, New Zealand PAYE calculation, IRD tax brackets payroll, ACC earner levy, KiwiSaver employer contribution, New Zealand salary structure Odoo, progressive marginal tax payroll, Odoo NZ localization, NZ PAYE deduction, Odoo Community payroll New Zealand
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