Blog
How to Configure BPJS and PPh 21 in Odoo Payroll
A practical guide to configuring BPJS and PPh 21 in Odoo Payroll — salary rules, contribution rates and caps, PTKP, and testing payroll against known-correct figures.
- mid
- odoo
BPJS and PPh 21 are the heart of Indonesian payroll, and getting them right in Odoo is the difference between a payroll system you can trust and a compliance liability. Odoo’s salary-rule engine can model both correctly — but it must be configured deliberately and tested rigorously. Here is how to approach it. (Treat this as a practical orientation, not a substitute for current regulatory advice — rates and rules change.)
Understand before you configure
Before touching Odoo, be clear on the rules you are encoding:
- BPJS Kesehatan has employer and employee contribution percentages applied to salary, with a salary cap above which contributions do not increase.
- BPJS Ketenagakerjaan covers several programmes — JHT, JKK, JKM, and JP — each with its own rate and its own employer/employee split, and JP has its own cap.
- PPh 21 is income tax withheld monthly, calculated on taxable income after deducting permitted items and the PTKP (the non-taxable income threshold, which varies by marital status and dependents), then applying the progressive tax brackets.
You cannot configure correctly what you do not understand, so start with the current official rates and methods.
Build BPJS as salary rules
In Odoo, each BPJS component becomes a salary rule. Set up rules for:
- Employer and employee BPJS Kesehatan, at the correct percentages, respecting the salary cap.
- Each BPJS Ketenagakerjaan programme (JHT, JKK, JKM, JP) with its rate and split, and the JP cap.
Configure which are employer-borne (a company cost) versus employee-deducted (reduced from take-home pay), because they post differently to your accounts. Getting the employer/employee split right matters for both the payslip and the books.
Build PPh 21 carefully
PPh 21 is the trickiest part because of its structure: taxable income, deductions, PTKP, and progressive brackets. Configure salary rules that:
- Determine taxable income from gross pay and applicable deductions.
- Apply the correct PTKP based on the employee’s tax status (this is per-employee data — capture marital status and dependents on the employee record).
- Apply the progressive brackets to compute the withholding.
This is where most errors hide, so it deserves the most care and testing. Consider how you handle the annual reconciliation and any irregular income (bonuses, THR) which affect the calculation.
Capture per-employee tax data
PPh 21 depends on each employee’s PTKP status. Make sure the employee records hold marital status and number of dependents, because the calculation is wrong without them. Build this into your employee data so payroll has what it needs.
Test against known-correct figures
This is the non-negotiable step. Before trusting Odoo payroll for real, run it for a sample of employees and compare every figure — BPJS contributions, PPh 21 withholding, net pay — against a manually calculated or previously-correct result. They must match exactly. Test edge cases: someone at the BPJS salary cap, different PTKP statuses, someone receiving THR. Payroll errors are visible and damaging, so the time to catch a misconfigured rate is in testing, not on a real payslip.
Run in parallel for a month
Beyond spot-testing, run Odoo payroll in parallel with your existing process for at least one full cycle. Compare the complete output. A parallel run catches the subtle errors that sample-testing misses, while you still have the old process as the source of truth. Only switch over once a full parallel cycle matches.
Keep it current
BPJS rates, PTKP values, and PPh 21 rules change. Build a habit (or a relationship with someone) to update the salary rules when regulations change. A payroll configuration that was correct two years ago can quietly become non-compliant.
Configuring BPJS and PPh 21 correctly in Odoo is exacting work where accuracy is everything, and it genuinely benefits from someone who knows both Odoo and current Indonesian payroll rules. If you want help setting this up and validating it against correct figures before you rely on it, we are glad to work through it with you in a free, one-hour conversation.