ERPNext payroll TDS on salary is worked out by Frappe HR, the payroll module of ERPNext, in four steps. It projects the employee's taxable salary for the whole payroll period, applies the income tax slab of the regime they chose, subtracts the tax already deducted this year and divides the rest by the months left, including this one. Below we run that for one fictional employee in April and again in October after a raise, then show the one case where the default setup over-deducts.
I lead ERPNext and Frappe programmes at MithTech, a team of Frappe specialists in Bengaluru. This post answers one question: how the number on the salary slip is calculated. For PF, ESI, professional tax and the payroll setup as a whole, see ERPNext HR and payroll for India.
What does the law say, in one paragraph?
An employer paying salary deducts income tax at source when the salary is paid. The amount is the average rate of tax on the employee's estimated income for the tax year, after the deductions and exemptions the employee is entitled to and has declared. From 1 April 2026 this is section 392 of the Income-tax Act, 2025, and salary paid up to 31 March 2026 falls under section 192 of the 1961 Act. The new tax regime is the default unless the employee opts for the old one.
What does Frappe HR need before the first run?
- Payroll Period covering 1 April 2026 to 31 March 2027.
- Income Tax Slab for each regime, effective 1 April 2026. Each has slab rows, a standard tax exemption amount (the standard deduction), a tax relief limit (the rebate threshold) and cess under "Taxes and Charges on Income Tax".
- Salary Structure Assignment per employee, with the slab of their regime. The Tax Regime Selector in the India Payroll app compares both regimes for the employee and records the choice.
- An Income Tax deduction component with "Variable Based On Taxable Salary" ticked, and no amount, in the salary structure.
- Employee Tax Exemption Declaration during the year, and proofs before year-end. A declaration only counts if the slab allows exemptions. On the new regime, most don't.
Worked example A: April, new regime
A fictional employee, Asha, has a taxable gross salary of ₹1,50,000 a month, or ₹18,00,000 for the year. She has no other income, has declared nothing and is on the new regime. Every figure below uses the FY 2026-27 slabs your CA confirms.
9 rows · click a column to sort
| Step | |
|---|---|
| Projected annual salary (₹1,50,000 × 12) | ₹18,00,000 |
| Less standard deduction | ₹75,000 |
| Projected taxable income | ₹17,25,000 |
| Tax: 0–4 L nil · 4–8 L 5% (₹20,000) · 8–12 L 10% (₹40,000) · 12–16 L 15% (₹60,000) · 16–17.25 L 20% (₹25,000) | ₹1,45,000 |
| Plus 4% cess | ₹5,800 |
| Projected tax for the year | ₹1,50,800 |
| Already deducted this year | ₹0 |
| Remaining months, including April | 12 |
| April TDS (₹1,50,800 ÷ 12) | ₹12,567 |
In Frappe HR terms: previous_taxable_earnings is 0, current_structured_taxable_earnings is April's ₹1,50,000 and future_structured_taxable_earnings is ₹1,50,000 × 11. The slab's standard exemption is subtracted and the slab tax plus cess is computed. Then the code divides (tax − tax paid so far) by remaining_sub_periods, which is 12 in April.
Worked example B: October, after a raise
From October, Asha's salary goes up to ₹1,80,000 a month. April to September paid ₹9,00,000 and deducted ₹75,402 in TDS (six payslips at ₹12,567).
11 rows · click a column to sort
| Salary already paid (April–September) | ₹9,00,000 |
| October plus the five months after it at ₹1,80,000 | ₹10,80,000 |
| Projected annual salary | ₹19,80,000 |
| Less standard deduction | ₹75,000 |
| Projected taxable income | ₹19,05,000 |
| Tax: ₹1,20,000 up to 16 L + 20% on ₹3,05,000 (₹61,000) | ₹1,81,000 |
| Plus 4% cess | ₹7,240 |
| Projected tax for the year | ₹1,88,240 |
| Already deducted (April–September) | ₹75,402 |
| Remaining months, including October | 6 |
| October TDS ((₹1,88,240 − ₹75,402) ÷ 6) | ₹18,806 |
The jump from ₹12,567 to ₹18,806 is the raise and the higher slab, spread over six months instead of twelve. A bonus paid as Additional Salary works the same way unless the component is set to deduct full tax in the month it's paid.
What happens just above ₹12 lakh?
On the new regime, a resident individual's tax is nil when taxable income is up to ₹12 lakh, through the rebate. Just above that, marginal relief caps the tax at the amount by which income exceeds ₹12 lakh.
In Frappe HR, the slab's tax relief limit handles the first part: at or below the limit, tax is zero. The second part is not in core Frappe HR v16. The hook calculate_tax_with_marginal_relief in hrms/hr/utils.py returns nothing and is left for localisation. The India Payroll app overrides only surcharge marginal relief.
| Taxable income | Slab tax + cess (what the default setup computes) | With rebate marginal relief |
|---|---|---|
| ₹12,10,000 | ₹63,960 | ₹10,400 |
| ₹12,50,000 | ₹70,200 | ₹52,000 |
For an employee in this band, the default setup deducts far more than the final tax. The employee gets it back as a refund, but your payroll has over-deducted all year. Until your version handles it, flag these employees from the Income Tax Computation report and adjust their monthly TDS with your CA's figure.
What should you check before every payroll run?
- Income Tax Computation report: projected taxable income, exemptions and tax per employee. Read it before you submit the Payroll Entry.
- Last month of the period: Frappe HR deducts tax on unsubmitted exemption proofs and unclaimed benefits in the final payroll, so March TDS can jump. Collect proofs in January.
- Mid-year joiners: section 392(4) lets the employee give you the previous employer's salary and the TDS deducted on it, and you take both into account. Record that salary as Employee Other Income for the payroll period so the projection is right, and check with your CA how to carry the earlier TDS in your setup.
- Regime changes: if an employee changes regime during the year, update the slab on their Salary Structure Assignment and check the next slip.
Frequently asked questions
+Why did TDS jump in March?
In the last payroll of the period Frappe HR deducts tax as if unsubmitted exemption proofs and unclaimed benefits don't exist. Any declaration without proof stops reducing the tax. Collect proofs before the final run.
+Does switching regime mid-year change TDS?
In Frappe HR, yes. The new slab applies from the next salary slip and the remaining tax is re-spread over the months left. Whether an employee can switch, and when, is a tax question for your CA.
+Where does a previous employer's income go?
Record it as Employee Other Income for the payroll period so the projection includes it. Otherwise the slab is applied to only part of the year's income and the employee is under-deducted. Section 392(4) also lets the employee give you the TDS the previous employer deducted, so the year's tax is not deducted twice.
+Is the 4% cess part of the slab or a separate component?
On v16 put it in the slab's "Taxes and Charges on Income Tax" table, so it's added to the slab tax before the monthly split. Older setups used a separate formula component. Use one, not both.
What is the bottom line?
The salary slip's TDS is a projection, not a fixed number. It moves with every raise, bonus and declaration. Check the Income Tax Computation report before each run, collect proofs early, and watch employees just above the rebate limit.
Running payroll on ERPNext?
We set up Frappe HR payroll for Indian companies: slabs, regimes, declarations and the checks that keep TDS right, with your CA signing off the figures.
Comments & ratings
No comments yet. Start a new discussion.
Manoj · Published on 29 October 2026
Worked with us? Leave a Google review