DEV Community

Engage HRMS
Engage HRMS

Posted on Originally published at engagehrms.hashnode.dev

Why TDS stays high after a bonus: how Indian payroll engines recalculate salary tax

After a large bonus, payroll gets the same ticket every year: "My bonus was paid last month. Why is TDS still high this month?" The engine is almost always right. Indian payroll systems project tax for the whole year, subtract what has already been deducted, and spread the balance over the months that are left. A bonus raises the projection, so the deduction stays higher for the rest of the year, bonus or no bonus. The example below walks through the numbers so engineers and payroll ops can debug these tickets from the formula itself.

How payroll engines calculate monthly TDS on salary

Most Indian payroll systems use the same three steps every month. First, estimate the employee's tax for the full tax year from salary paid so far, salary still expected, and any one-time income. Second, subtract the TDS already deducted this year. Third, divide what is left by the number of payroll months remaining, counting the current month.

A bonus changes step one. The annual estimate goes up, so the residual goes up, and because the residual is spread over the remaining months, the monthly deduction stays higher long after the bonus payslip. The form names changed from tax year 2026-27 (Form 138 for the quarterly statement, Form 130 for the annual certificate), but the projection works the same way.

Inputs the engine needs

  • The employee's tax regime (old or new), and whether your policy lets them change it mid-year
  • Monthly taxable salary components after the exemptions you support, such as HRA where claimed
  • Declared deductions you accept mid-year (investments, housing loan interest), each with an effective date
  • Bonus, arrears, leave encashment and other one-time taxable amounts, with the month each one is paid
  • TDS already deducted from April up to last month
  • The number of payroll months left in the tax year, counting the current run

If any of these is stale, the jump looks mysterious even when the formula is correct.

Worked example: a bonus that crosses the rebate line

These numbers illustrate the method and are not advice for a real employee.

  • Tax year 2026-27 (April 2026 to March 2027), new regime
  • Gross salary: Rs 1,00,000 a month, Rs 12,00,000 for the year
  • Standard deduction: Rs 75,000
  • Taxable income before the bonus: Rs 11,25,000

At Rs 11,25,000 the rebate brings tax down to zero, because taxable income is under Rs 12,00,000. Monthly TDS from April to September is therefore Rs 0.

In October the employee gets a taxable bonus of Rs 3,00,000.

  • New gross for the year: Rs 15,00,000
  • Taxable income: Rs 15,00,000 minus Rs 75,000 = Rs 14,25,000
  • The rebate no longer applies, so tax runs through the slabs: nil on the first Rs 4,00,000, Rs 20,000 at 5% on the next Rs 4,00,000, Rs 40,000 at 10% on the next Rs 4,00,000, and Rs 33,750 at 15% on the last Rs 2,25,000
  • Tax before cess: Rs 93,750. With 4% cess: Rs 97,500
  • Already deducted: Rs 0
  • Months left, counting October: 6
  • New monthly TDS: Rs 97,500 / 6 = Rs 16,250

So an employee who paid no TDS for six months now loses Rs 16,250 every month until March, and that includes November, when no bonus is paid. That is the ticket. The engine is collecting the year's tax on income that crossed the rebate line. It is not taxing October's bonus twice.

Some payroll teams deduct more of the extra tax in the bonus month itself, so the later months stay closer to normal. Both approaches collect the same total by March. Pick one, write it down, and make the payslip show which one you use.

If the employee later submits a valid deduction, the projection drops and so does the monthly cut. If the engine leaves the bonus out of the projection, November looks fine, and the shortfall shows up in March or in the employee's return. It is better to take the uncomfortable deduction every month than to spring a large one at year end.

Edge cases that break naive TDS code

Mid-year joiners. A joiner in August has eight projection months, not twelve. Spreading the annual estimate over twelve months under-deducts early and over-corrects later. Annualising their salary as if they had worked from April gives the opposite error.

Mid-year leavers. The full and final settlement should bring projected tax in line with actual taxable income for the months worked. If the engine still spreads a residual over months the person will never be paid for, someone ends up chasing a recovery or a refund.

Regime changes. If your policy allows a switch mid-year, recompute the annual estimate under the new regime. Applying old-regime slabs to new-regime income is a common bug.

Previous employment. When a new employee declares income earned and TDS deducted by a previous employer, both belong in the projection. Skip them and March brings a surprise.

Reversals and recoveries. A bonus paid and then clawed back needs a signed adjustment that triggers a tax recompute. A blind negative earning with no recompute leaves Form 138 and the employee's Form 130 out of step.

Rounding. Decide whether monthly TDS rounds to the nearest rupee and where the leftover paise go (usually March). Write the rule down, or two developers will implement two different ones.

A validation checklist for engineers

  1. Store the annual tax estimate and the residual after every run, not only the TDS figure on the payslip.
  2. Log a hash of the inputs: regime, annual taxable income, TDS to date, months remaining, bonus to date.
  3. When bonus-to-date changes, force a full recompute before the payslip is locked.
  4. Check that March TDS plus TDS to date matches the final projected tax within your rounding tolerance.
  5. Reconcile the quarterly Form 138 export against the taxable income and TDS totals your engine used each month.

What payroll should tell the employee

A short, plain reply works better than a tax lecture:

"Your bonus raised your estimated tax for the full year. Your income for the year is now above the level where the rebate applies, so tax that was zero before is now due. We spread the balance over the months left in the tax year, which is why TDS stays higher even in months with no bonus. In June 2027 you will receive Form 130 (it replaced Form 16 from tax year 2026-27). Any remaining difference is settled when you file your income-tax return."

If your process allows it, attach the annual projection sheet. That one PDF closes most of these tickets.

What to store in the engine

When TDS jumps after a bonus, the annual projection is usually working as designed. Payroll engines that store the projection, the residual and the remaining month count make support and compliance easier, because every number on the payslip can be traced back. We build this into Engage HRMS (https://hrengage.ai): the projection ledger is a stored record that survives the payroll run, not a temporary variable inside the payslip job.

Disclaimer

The example uses rounded figures to show the method. Real TDS depends on the employee's regime, declared deductions, and the rates in force for the tax year. Check current Income Tax Department guidance before coding production rates.

Sources

Top comments (0)