AI Summary - 20-sec read - Reviewed by experts
- Odoo Payroll can produce a fully compliant Indian payslip - PF, ESI, professional tax and TDS - but only after you build the salary structure and statutory rules. Out of the box it does not know your state's PT slab or your PF wage ceiling.
- Four statutory deductions, four different rules: EPF at 12 percent of basic up to the 15,000 wage ceiling, ESI for employees earning up to 21,000 a month, professional tax on a state-wise slab, and TDS under section 192 spread across the year on projected income.
- Most first-payslip errors come from a wrong basic-to-gross split, ignoring the PF wage ceiling, applying the wrong state's professional tax, or computing TDS on one month instead of annual projected income.
- Build the structure once, run a parallel payslip against your current payroll for a full month, and reconcile to the rupee before you retire the old system.
- Short on time? Book a free call.
Short on time? Book a free call.
Indian payroll is where a clean Odoo go-live quietly goes wrong. The accounting reconciles, stock moves, sales orders flow - and then the first payslip run shows a PF figure that does not match last month, an ESI deduction on an employee who should be exempt, and a TDS number nobody can explain. None of that is an Odoo bug. It is the salary structure and the four statutory rules that were never configured for how India actually runs payroll.
This is the setup guide. How to build an Indian salary structure in Odoo, configure EPF, ESI, professional tax and TDS so each one calculates the way the law expects, and prove the result with a parallel run before you trust a single payslip. It is written for the India SME moving off a spreadsheet or a standalone payroll tool onto Odoo, mid-year, with employees who already have a contribution history that has to stay consistent.
Start with the salary structure, not the deductions
Every Indian statutory calculation keys off one number: basic pay. PF is a percentage of basic, HRA exemption depends on basic, gratuity is computed on basic. If your salary structure splits gross the wrong way - say a thin basic to suppress PF - every downstream figure is off, and the deduction rules you layer on top inherit that error. So the structure comes first. In Odoo you define salary rules for basic, HRA, conveyance and special allowance, and you set basic as a sensible share of gross (commonly 40 to 50 percent) so PF and gratuity land where they should. Get this split right once and the four deductions below compute cleanly. Get it wrong and you will be re-running payslips every month.
The four statutory deductions, configured correctly
1. EPF - mind the wage ceiling
Provident fund is 12 percent of basic from the employee, matched by the employer, but the contribution is capped at a basic wage ceiling of 15,000 a month unless you have opted to contribute on actual basic above it. The single most common Odoo mistake is a PF rule that computes 12 percent of full basic for every employee, ignoring the ceiling - which over-deducts for anyone earning above it and breaks the match with your EPFO ECR file. Configure the PF salary rule to cap the contribution base at the ceiling (or on actual, consistently, if that is your registered policy), and confirm the employer split between EPF and EPS is set, because that split is what the ECR upload expects.
First payslip run not matching your old payroll?
Get a free audit. We rebuild your Odoo salary structure and the PF, ESI, PT and TDS rules to match Indian statute, then run a parallel payslip against your current payroll until it ties to the rupee. No pitch, reply in 2 hrs, no card needed, NDA on request.
Get a free audit2. ESI - it is conditional, not universal
Employees' State Insurance applies only to employees drawing gross wages up to 21,000 a month, at 0.75 percent from the employee and 3.25 percent from the employer. Two errors show up here. The first is deducting ESI for everyone, including staff above the threshold who are exempt. The second is dropping an employee out of ESI mid-contribution-period the moment a raise pushes them over 21,000 - the rules require them to stay in until the half-yearly contribution period ends. Configure the ESI rule with the 21,000 eligibility condition and handle the contribution-period continuation, so the deduction starts and stops on the correct dates rather than flickering month to month.
3. Professional tax - it is state-specific
There is no single professional tax in India. It is a state levy, so the slab depends on where the employee works - Gujarat, Maharashtra, Karnataka and West Bengal all publish different monthly slabs, and a handful of states do not charge it at all. Odoo has no way to guess this, so a default PT rule will quietly apply the wrong amount. Set the professional tax salary rule against the correct state slab for each work location, and if you employ across states, you need a rule per state, not one flat figure. This is exactly the kind of multi-jurisdiction rule that also trips up groups running UAE corporate tax configured inside Odoo - the principle is the same: the tax rule has to follow the location, not a global default.
4. TDS on salary - project the year, do not tax the month
TDS under section 192 is not a flat monthly cut. The employer estimates the employee's total annual income, applies the chosen tax regime and eligible deductions, computes the full-year tax, and spreads it across the remaining months of the financial year. The classic first-run error is configuring TDS as a fixed percentage of one month's salary - which over- or under-deducts and leaves you unable to issue a correct Form 16. The TDS rule needs annual projected income and the employee's regime declaration as inputs, recalculated when a salary or declaration changes, so the deduction trues up across the year.
Takeaways
- Fix the basic-to-gross split first - PF, gratuity and HRA all key off basic, so a wrong split breaks everything downstream.
- Cap EPF at the 15,000 wage ceiling (or on actual, consistently), and apply ESI only up to 21,000 gross with correct contribution-period handling.
- Professional tax is state-wise - one rule per work-state, never a single flat figure.
- Compute TDS on projected annual income spread across the year, not as a percentage of one month - or Form 16 will not reconcile.
- Run a parallel payslip for one full month and reconcile to the rupee before retiring the old payroll.
Prove it with a parallel run before you switch over
The setup is only trustworthy when it matches a known-good baseline. For the first month, run payroll in both systems - your existing payroll and Odoo - and put the two payslips side by side, employee by employee. Gross should match exactly. PF, ESI, PT and net pay should each tie to the rupee. Where a figure differs, the cause is almost always one of the four rules above: a ceiling not applied, a wrong state slab, an ESI eligibility flag, or a TDS base computed on the month instead of the year. Only when every employee reconciles do you generate the EPFO ECR and ESIC files from Odoo and file from there. This parallel-run discipline is the same control that catches an accounting opening-balance mismatch at go-live - reconcile against the old system before you trust the new one.
Want your Indian payroll live in Odoo and reconciled this cycle?
We configure the salary structure and the PF, ESI, PT and TDS rules, run the parallel payslip, and hand you ECR and ESIC files that file cleanly. No pitch, reply in 2 hrs.
Book a free callWhere payroll fits the wider Odoo build
Payroll is not a standalone island - it posts to your accounting as salary, contribution and TDS-payable journal entries, and it draws on the same employee master that runs leave, attendance and reimbursements. Configuring it cleanly is part of a sound HR management setup and of the broader Odoo implementation that ties HR, finance and operations into one system. When the salary structure and statutory rules are right from the first run, every month after is a one-click payslip batch instead of a reconciliation exercise.
FAQ
Does Odoo handle Indian PF, ESI and TDS out of the box?
Odoo gives you the payroll engine and rule framework, but the Indian statutory specifics - the PF wage ceiling, the 21,000 ESI threshold, your state's professional tax slab, and section 192 TDS on projected income - have to be configured as salary rules. They are not pre-set to Indian law by default, which is why a fresh install needs a deliberate setup before the first payslip.
Why is my Odoo PF deduction higher than last month's?
Almost always because the PF rule computes 12 percent of full basic without applying the 15,000 wage ceiling, so anyone earning above it is over-deducted. Cap the contribution base at the ceiling - or contribute on actual basic consistently if that is your registered policy - and confirm the EPF and EPS split matches what your ECR upload expects.
How should TDS on salary be calculated in Odoo?
Estimate the employee's total annual income, apply their declared tax regime and eligible deductions, compute the full-year tax, and spread it across the remaining months of the financial year. Configuring TDS as a flat percentage of one month's pay is the common error - it breaks Form 16 reconciliation. The rule needs annual projected income and the regime declaration as inputs.
Do I need different professional tax settings for each state?
Yes. Professional tax is a state levy with different slabs in Gujarat, Maharashtra, Karnataka, West Bengal and others, and some states do not charge it. Set a PT rule per work-state rather than one flat amount, so each employee is deducted against the slab for their location.
The bottom line: a wrong first payslip in Odoo is not a software fault - it is a configuration gap. Split basic correctly, cap PF at the ceiling, gate ESI at 21,000, apply the right state's professional tax, and project TDS across the year. Then run payroll in parallel for one month and reconcile to the rupee. Do that and your Indian payroll runs clean from the first cycle - and every cycle after is a single batch you can trust.
Founder and CEO of Braincuber. Has scoped and shipped 500+ Odoo, AI, and cloud projects for US mid-market and global brands. Takes every founder call personally — no SDR layer between buyers and the people building the system.
