DEV Community

hammadrasool2000-svg
hammadrasool2000-svg

Posted on AI-assisted

How Salary Income Tax Is Calculated in Pakistan for 2026-27 (With Code)

If you build payroll, HR or fintech software for Pakistan, or you just want to check your own salary slip, you need to know how salary tax is calculated. The good news: once you understand the slab formula, it's a few lines of code.

This post covers tax year 2027, which runs from 1 July 2026 to 30 June 2027 (commonly called "2026-27"), under the Finance Act 2026.

Source note: The slab figures below are taken from the ToolStash Pakistan Salary Tax Calculator page, which states that its slabs come from the Finance Act 2026 as reported in PwC Pakistan's Tax Memorandum and The Express Tribune. This is an explainer, not tax advice. Check the Federal Board of Revenue (FBR) or a tax adviser for your exact liability.

Who these slabs apply to

These rates apply to salaried individuals, meaning people whose salary is more than 75% of their taxable income. Business and other non-salaried income uses a different table.

The 2026-27 salary tax slabs

Annual taxable income (Rs) Tax
Up to 600,000 0%
600,001 – 1,200,000 1% of amount above 600,000
1,200,001 – 2,200,000 6,000 + 11% of amount above 1,200,000
2,200,001 – 3,200,000 116,000 + 20% of amount above 2,200,000
3,200,001 – 4,100,000 316,000 + 25% of amount above 3,200,000
4,100,001 – 5,600,000 541,000 + 29% of amount above 4,100,000
5,600,001 – 7,000,000 976,000 + 32% of amount above 5,600,000
Above 7,000,000 1,424,000 + 35% of amount above 7,000,000

What changed from 2025-26

According to the same source:

  • Rs 2.2–3.2 million: 23% → 20%
  • Rs 3.2–4.1 million: 30% → 25%
  • Rs 4.1–5.6 million: 35% → 29% (new slab)
  • Rs 5.6–7 million: 35% → 32% (new slab)
  • Above Rs 7 million: 35% (rate unchanged)
  • The 9% surcharge on salaried taxable income above Rs 10 million was abolished.

The tax-free threshold (Rs 600,000) and the 1% and 11% slabs did not change, so anyone earning up to Rs 2.2 million a year (about Rs 183,000 a month) pays the same as last year.

How the formula works

Each slab is a fixed amount plus a percentage of the income above the slab's lower limit. The fixed amount is simply the total tax on all the slabs below it. You can check this yourself:

  • Top of the 1% slab: 1% × (1,200,000 − 600,000) = 6,000
  • Top of the 11% slab: 6,000 + 11% × 1,000,000 = 116,000
  • Top of the 20% slab: 116,000 + 20% × 1,000,000 = 316,000
  • Top of the 25% slab: 316,000 + 25% × 900,000 = 541,000

…and so on. That's why it's a marginal system: moving into a higher slab only taxes the extra rupees at the higher rate, not your whole salary.

The steps:

  1. Monthly taxable salary × 12 = annual taxable income.
  2. Find the slab and apply its formula to get the annual tax.
  3. Annual tax ÷ 12 = monthly deduction (your employer withholds it in 12 instalments).
  4. Salary − tax = take-home pay.

Worked examples

Rs 100,000 a month → Rs 1,200,000 a year
1% × (1,200,000 − 600,000) = Rs 6,000 a year → Rs 500 a month.

Rs 300,000 a month → Rs 3,600,000 a year
316,000 + 25% × (3,600,000 − 3,200,000) = Rs 416,000 a year → ≈ Rs 34,667 a month.

Rs 500,000 a month → Rs 6,000,000 a year
976,000 + 32% × (6,000,000 − 5,600,000) = Rs 1,104,000 a year → Rs 92,000 a month.

Rs 1,000,000 a month → Rs 12,000,000 a year
1,424,000 + 35% × (12,000,000 − 7,000,000) = Rs 3,174,000 a year → Rs 264,500 a month.

These match the example table on the calculator page.

The code

Because each slab carries its own fixed amount, the implementation is a lookup, not a loop:

// Pakistan salary tax slabs, tax year 2027 (2026-27)
const SLABS_2026_27 = [
  { from: 0,         fixed: 0,         rate: 0.00 },
  { from: 600_000,   fixed: 0,         rate: 0.01 },
  { from: 1_200_000, fixed: 6_000,     rate: 0.11 },
  { from: 2_200_000, fixed: 116_000,   rate: 0.20 },
  { from: 3_200_000, fixed: 316_000,   rate: 0.25 },
  { from: 4_100_000, fixed: 541_000,   rate: 0.29 },
  { from: 5_600_000, fixed: 976_000,   rate: 0.32 },
  { from: 7_000_000, fixed: 1_424_000, rate: 0.35 },
];

function annualSalaryTax(annualIncome, slabs = SLABS_2026_27) {
  // find the highest slab whose lower limit is below the income
  const slab = [...slabs].reverse().find(s => annualIncome > s.from) ?? slabs[0];
  return slab.fixed + (annualIncome - slab.from) * slab.rate;
}

function monthlyBreakdown(monthlySalary) {
  const annualTax = annualSalaryTax(monthlySalary * 12);
  const monthlyTax = annualTax / 12;
  return {
    annualTax: Math.round(annualTax),
    monthlyTax: Math.round(monthlyTax),
    takeHome: Math.round(monthlySalary - monthlyTax),
  };
}

console.log(monthlyBreakdown(100_000));   // { annualTax: 6000, monthlyTax: 500, takeHome: 99500 }
console.log(monthlyBreakdown(300_000));   // { annualTax: 416000, monthlyTax: 34667, takeHome: 265333 }
console.log(monthlyBreakdown(1_000_000)); // { annualTax: 3174000, monthlyTax: 264500, takeHome: 735500 }
Enter fullscreen mode Exit fullscreen mode

A few implementation tips:

  • Keep slabs as data, keyed by tax year. Budgets change every June, and you'll want to support the previous year for arrears and corrections.
  • Use the fixed amounts as a self-check. Write a unit test asserting that each slab's fixed equals the tax at the previous slab's upper limit. It catches typos instantly.
  • Round only at the end. Rounding the monthly figure before multiplying can drift by a few rupees over a year.
  • Use the taxable salary. Some allowances are exempt under the Second Schedule of the Income Tax Ordinance, so taxable salary can be lower than gross pay.

What this simple model leaves out

The slab formula is the core, but real payroll may also need to handle tax credits, zakat, exempt allowances, pension, and other income sources. Treat the output as an estimate and reconcile it against the employer's tax certificate.

If you just want to check a number without writing code, the salary tax calculator shows monthly tax, take-home pay and the change from 2025-26. It runs in the browser, so nothing you type is sent anywhere.

Top comments (0)