Dev.to WebDev πŸ›  Dev πŸ‘ 0 πŸ“– 3 min read

Total overtime pay 3: the shortcut behind the new overtime deduction, and where it breaks

The new federal deduction for overtime (from the 2025 budget law, claimed on Schedule 1-A) doesn't cover your overtime pay. It covers the premium part of it, the extra half in time-and-a-half. I'm building a free payroll

The new federal deduction for overtime (from the 2025 budget law, claimed on Schedule 1-A) doesn't cover your overtime pay. It covers the premium part of it, the extra half in time-and-a-half. I'm building a free payroll calculator site, and getting that one distinction right turned into most of the work on the overtime page.

Here's the part that's easy to code and easy to get wrong.

The math is one line

Say you earn $22 an hour and work 6 overtime hours a week for a full year, 312 hours.

// the "half" only
export function qualifiedOvertimeFromHours(rate: number, otHours: number) {
  return roundCurrency(0.5 * rate * otHours);
}
// 0.5 * 22 * 312 = 3,432

Your total overtime pay for those hours is 1.5 Γ— 22 Γ— 312 = $10,296. Only $3,432 of that is deduction-eligible. The other $6,864 is your regular rate for those hours, which was never "overtime premium" in the first place.

Plenty of people only have the total from a pay stub, so I added a second path:

export function qualifiedOvertimeFromTotalPay(totalOvertimePay: number) {
  return roundCurrency(totalOvertimePay / 3);
}
// 10,296 / 3 = 3,432

Time-and-a-half is 1.5x, the premium is 0.5x, and 0.5 / 1.5 is a third. Same answer both ways.

Where Γ·3 quietly breaks

It only works if every overtime hour was paid at exactly 1.5x. If you get double time, or your state has daily overtime (California does), the total is no longer 1.5x of anything, and dividing by three gives you a number that looks plausible and is wrong.

The eligible amount is the overtime the federal wage law (FLSA) requires, which is 1.5x past 40 hours in a week. Anything extra your state or your employer adds on top doesn't count. So ten hours paid at 2x on a $22 rate is $440, Γ·3 says $146.67, and the most that could qualify if all ten were past 40 in the week is 0.5 Γ— 22 Γ— 10 = $110. I labelled the total-pay path in the UI as assuming time-and-a-half, because that's the honest scope of the shortcut.

The cap and the phase-out

For 2026 the data file I'm working from says:

  • Cap: $12,500 single or head of household, $25,000 married filing jointly. Married filing separately can't claim it.
  • Phase-out starts at $150,000 MAGI (single) or $300,000 (joint). The cap drops by $100 for every $1,000 over.

The detail I almost got wrong is the rounding on that last line. The Schedule 1-A worksheet says to round the "per $1,000" figure down:

function phaseOutReduction(magi: number, threshold: number, ratePer1000: number) {
  const excess = Math.max(0, magi - threshold);
  if (excess === 0) return 0;
  return Math.floor(excess / 1000) * ratePer1000;
}

$6,001 over the threshold counts as 6, not 7. A single filer at $156,500 MAGI loses $600 of cap, so the cap becomes $11,900.

The car loan interest deduction, from the same law and the same form, rounds up and uses $200 per $1,000. If you build both and copy one function for the other, one of them will be off by a step near every boundary. There's a comment in my code about it now, because I will forget.

What a $3,432 deduction is worth

I run the deduction through the actual bracket math instead of multiplying by a marginal rate. For a single filer with $56,056 in wages (the $22 job above, plus the overtime), 2026 standard deduction of $16,100, the deduction saves $411.84 in federal income tax. That's 12% of $3,432, because it all lands in the 12% bracket. Someone straddling a bracket edge would see something different, which is why a flat "deduction Γ— your rate" shortcut is a bad idea.

Social Security and Medicare still come out of the full amount. On the $3,432 premium alone that's $262.54. The deduction doesn't touch payroll tax, and it's claimed on your return, so don't expect a bigger paycheck.

Last thing: the W-2

For 2026 the qualified overtime amount is meant to show up in Box 12 with code TT. Employers didn't have that for 2025 forms, so some of them stuffed the figure into Box 14 with their own label. If you're building anything that reads a W-2, don't assume one format.

The calculator is at paytimehub.com/no-tax-on-overtime-calculator if you want to poke at it. It's an Astro site, no backend, everything runs in the browser. If you spot a number that looks off, I'd rather hear about it.

πŸ“° Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes β€” full credit and traffic to the original publisher.