How the Bangladesh বেতনের আয়কর (income tax on salary) calculator is verified
Inputs
| Input | Field | Type |
|---|---|---|
| Gross monthly salary (BDT) | grossMonthly | number |
| Festival and other bonuses for the year (BDT) | bonusAnnual | number |
| Your provident fund contribution (BDT / month) | providentFundMonthly | number |
| Other eligible investment for the year (BDT) | otherInvestmentAnnual | number |
| Your tax-free threshold group | taxpayerCategory | string |
| Children or dependants with a disability | disabledChildren | number |
| First return (new taxpayer: minimum tax ৳1,000) | newTaxpayer | boolean |
The formula
Each derived value below is computed by the Valem engine from the expression shown, in this order. Nothing else runs — there is no hidden code path.
| Derived value | Field | Formula (JSONata) |
|---|---|---|
| Salary for the year | grossAnnual | $round($n(grossMonthly) * 12 + $n(bonusAnnual), 2) |
| Exempt: 1/3, at most ৳5,00,000 | salaryExemption | $round($min([grossAnnual / $const.salaryExemptionDivisor, $const.salaryExemptionCap]), 2) |
| Taxable income | taxableIncome | $round($max([0, grossAnnual - salaryExemption]), 2) |
| Tax-free threshold | taxFreeThreshold | ($c := taxpayerCategory; $c = 'womanOrSenior' ? $const.taxFreeWomanSenior : ($c = 'disabledOrThirdGender' ? $const.taxFreeDisabledThirdGender : ($c = 'warWounded' ? $const.taxFreeWarWounded : $const.taxFreeGeneral))) + $n(disabledChildren) * $const.disabledChildAddOn |
| Tax at the Schedule 2 rates | slabTax | ($t := taxFreeThreshold; $w1 := $t + $const.bandWidth1; $w2 := $w1 + $const.bandWidth2; $w3 := $w2 + $const.bandWidth3; $w4 := $w3 + $const.bandWidth4; $round($bandedCharge(taxableIncome, [{"upTo": $t, "rate": $const.rate0}, {"upTo": $w1, "rate": $const.rate1}, {"upTo": $w2, "rate": $const.rate2}, {"upTo": $w3, "rate": $const.rate3}, {"upTo": $w4, "rate": $const.rate4}, {"upTo": null, "rate": $const.rate5}]), 2)) |
| Eligible Investment | eligibleInvestment | $round($n(providentFundMonthly) * 12 + $n(otherInvestmentAnnual), 2) |
| Investment rebate (s.78) | investmentRebate | $round($min([taxableIncome * $const.rebateIncomeRate, eligibleInvestment * $const.rebateInvestmentRate, $const.rebateCap, slabTax]), 2) |
| Income tax for the year | incomeTaxAnnual | taxableIncome > taxFreeThreshold ? $round($max([slabTax - investmentRebate, newTaxpayer ? $const.minimumTaxNewTaxpayer : $const.minimumTax]), 2) : 0 |
| Income tax / month | incomeTaxMonthly | $round(incomeTaxAnnual / 12, 2) |
| Take-home for the year | netAnnual | $round($max([0, grossAnnual - incomeTaxAnnual - $n(providentFundMonthly) * 12]), 2) |
| Net / month | netMonthly | $round(netAnnual / 12, 2) |
Rates and thresholds
The expressions above read these as $const. They are the figures the annual refresh replaces, so they live as data rather than being written into the formulas — which is what makes a year-on-year change a one-line diff instead of an edit to arithmetic.
| Constant | Value |
|---|---|
salaryExemptionDivisor | 3 |
salaryExemptionCap | 500000 |
taxFreeGeneral | 400000 |
taxFreeWomanSenior | 450000 |
taxFreeDisabledThirdGender | 525000 |
taxFreeWarWounded | 550000 |
bandWidth1 | 300000 |
bandWidth2 | 400000 |
bandWidth3 | 500000 |
bandWidth4 | 2000000 |
rate0 | 0 |
rate1 | 0.1 |
rate2 | 0.15 |
rate3 | 0.2 |
rate4 | 0.25 |
rate5 | 0.3 |
minimumTax | 5000 |
minimumTaxNewTaxpayer | 1000 |
disabledChildAddOn | 50000 |
rebateIncomeRate | 0.03 |
rebateInvestmentRate | 0.1 |
rebateCap | 750000 |
Test vectors (12)
Every case is executed against this model on each build, by the Java engine and independently by a JavaScript one. A mismatch of a single cent fails the build, so the page cannot ship advertising a figure the model no longer produces.
Case 1 — N1 ৳1,00,000 a month, ৳5,000 PF and ৳40,000 other investment: tax ৳45,000 less the ৳10,000 rebate
given grossMonthly | 100000 |
|---|---|
given bonusAnnual | 0 |
given providentFundMonthly | 5000 |
given otherInvestmentAnnual | 40000 |
given taxpayerCategory | general |
given disabledChildren | 0 |
given newTaxpayer | no |
expect taxableIncome | 800000 |
expect slabTax | 45000 |
expect investmentRebate | 10000 |
expect incomeTaxAnnual | 35000 |
expect netMonthly | 92083.33 |
Case 2 — N1b same: exemption, eligible investment, year totals
given grossMonthly | 100000 |
|---|---|
given bonusAnnual | 0 |
given providentFundMonthly | 5000 |
given otherInvestmentAnnual | 40000 |
given taxpayerCategory | general |
given disabledChildren | 0 |
given newTaxpayer | no |
expect grossAnnual | 1200000 |
expect salaryExemption | 400000 |
expect eligibleInvestment | 100000 |
expect netAnnual | 1105000 |
expect incomeTaxMonthly | 2916.67 |
Case 3 — N2 ৳1,00,000 a month, no investment: ৳30,000 + ৳15,000
given grossMonthly | 100000 |
|---|---|
given bonusAnnual | 0 |
given providentFundMonthly | 0 |
given otherInvestmentAnnual | 0 |
given taxpayerCategory | general |
given disabledChildren | 0 |
given newTaxpayer | no |
expect incomeTaxAnnual | 45000 |
expect netMonthly | 96250 |
Case 4 — N3 ৳50,000 a month: ৳4,00,000 taxable does not exceed the threshold
given grossMonthly | 50000 |
|---|---|
given bonusAnnual | 0 |
given providentFundMonthly | 0 |
given otherInvestmentAnnual | 0 |
given taxpayerCategory | general |
given disabledChildren | 0 |
given newTaxpayer | no |
expect taxableIncome | 400000 |
expect incomeTaxAnnual | 0 |
expect netMonthly | 50000 |
Case 5 — N4 ৳52,000 a month: ৳1,600 at 10% is lifted to the ৳5,000 minimum
given grossMonthly | 52000 |
|---|---|
given bonusAnnual | 0 |
given providentFundMonthly | 0 |
given otherInvestmentAnnual | 0 |
given taxpayerCategory | general |
given disabledChildren | 0 |
given newTaxpayer | no |
expect taxableIncome | 416000 |
expect slabTax | 1600 |
expect incomeTaxAnnual | 5000 |
Case 6 — N5 same as a new taxpayer: minimum ৳1,000
given grossMonthly | 52000 |
|---|---|
given bonusAnnual | 0 |
given providentFundMonthly | 0 |
given otherInvestmentAnnual | 0 |
given taxpayerCategory | general |
given disabledChildren | 0 |
given newTaxpayer | yes |
expect incomeTaxAnnual | 1600 |
Case 7 — N5b new taxpayer at ৳51,000 a month: ৳400 lifted to ৳1,000
given grossMonthly | 51000 |
|---|---|
given bonusAnnual | 0 |
given providentFundMonthly | 0 |
given otherInvestmentAnnual | 0 |
given taxpayerCategory | general |
given disabledChildren | 0 |
given newTaxpayer | yes |
expect taxableIncome | 408000 |
expect slabTax | 800 |
expect incomeTaxAnnual | 1000 |
Case 8 — N6 woman or 65+: threshold ৳4,50,000, tax ৳30,000 + ৳7,500
given grossMonthly | 100000 |
|---|---|
given bonusAnnual | 0 |
given providentFundMonthly | 0 |
given otherInvestmentAnnual | 0 |
given taxpayerCategory | womanOrSenior |
given disabledChildren | 0 |
given newTaxpayer | no |
expect taxFreeThreshold | 450000 |
expect incomeTaxAnnual | 37500 |
Case 9 — N7 disability, two disabled children: threshold ৳6,25,000, 10% of ৳1,75,000
given grossMonthly | 100000 |
|---|---|
given bonusAnnual | 0 |
given providentFundMonthly | 0 |
given otherInvestmentAnnual | 0 |
given taxpayerCategory | disabledOrThirdGender |
given disabledChildren | 2 |
given newTaxpayer | no |
expect taxFreeThreshold | 625000 |
expect incomeTaxAnnual | 17500 |
Case 10 — N8 war-wounded freedom fighter: threshold ৳5,50,000, 10% of ৳2,50,000
given grossMonthly | 100000 |
|---|---|
given bonusAnnual | 0 |
given providentFundMonthly | 0 |
given otherInvestmentAnnual | 0 |
given taxpayerCategory | warWounded |
given disabledChildren | 0 |
given newTaxpayer | no |
expect taxFreeThreshold | 550000 |
expect incomeTaxAnnual | 25000 |
Case 11 — N9 ৳5,00,000 a month: exemption capped at ৳5 lakh, ৳6,90,000 + 30% of ৳19,00,000, rebate 3% of income
given grossMonthly | 500000 |
|---|---|
given bonusAnnual | 0 |
given providentFundMonthly | 0 |
given otherInvestmentAnnual | 2000000 |
given taxpayerCategory | general |
given disabledChildren | 0 |
given newTaxpayer | no |
expect salaryExemption | 500000 |
expect taxableIncome | 5500000 |
expect slabTax | 1260000 |
expect investmentRebate | 165000 |
expect incomeTaxAnnual | 1095000 |
Case 12 — N10 ৳30,00,000 a month: the rebate stops at ৳7,50,000
given grossMonthly | 3000000 |
|---|---|
given bonusAnnual | 0 |
given providentFundMonthly | 0 |
given otherInvestmentAnnual | 10000000 |
given taxpayerCategory | general |
given disabledChildren | 0 |
given newTaxpayer | no |
expect slabTax | 10260000 |
expect investmentRebate | 750000 |
expect incomeTaxAnnual | 9510000 |
Sources
- Finance Act 2026 (Act 96), s.160 and Schedule 2 Part 1 para (ক): 2026-27 and 2027-28 rates · checked 2026-11-01
- Income Tax Act 2023, Sixth Schedule Pt 1 para 27 (৳5 lakh by Act 89 of 2026, s.135) · checked 2026-11-01
- Income Tax Act 2023 s.78 investment rebate (as amended by the Finance Act 2026, s.61) · checked 2026-11-01
- Finance Act 2026, Bangladesh Gazette 30 June 2026 (NBR copy) · checked 2026-11-01
Check it yourself — and reuse it
The whole model as JSON — inputs, outputs, formulas, vectors and sources in one re-runnable document.
This model is published under CC BY 4.0: use it, adapt it, build on it, with attribution. The licence covers the model — the expression of each rule and the arrangement of the catalog. The rates and thresholds are law, and nobody licenses those; the sources above are where they come from.
← Back to the Bangladesh বেতনের আয়কর (income tax on salary) calculator
Built with Valem — a live, verifiable calculator you can fork and embed.