How the Nigeria business income tax calculator is verified

Inputs

InputFieldType
Business or professional income for the year (₦)annualTurnovernumber
Deductible expenses and capital allowances (₦)annualExpensesnumber
Rent you pay for your home (₦ / year)annualRentnumber
Your pension contributions under the Pension Reform Act (₦ / year)pensionContributionsnumber
Contributing 2.5% of income to the National Housing FundnhfMemberboolean

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 valueFieldFormula (JSONata)
Assessable profitassessableProfit$round($max([0, $n(annualTurnover) - $n(annualExpenses)]), 2)
National Housing Fund 2.5%nhfAnnualnhfMember ? $round(assessableProfit * $const.nhfRate, 2) : 0
Rent reliefrentRelief$round($min([$n(annualRent) * $const.rentReliefRate, $const.rentReliefCap]), 2)
Chargeable incomechargeableIncome$round($max([0, assessableProfit - $n(pensionContributions) - nhfAnnual - rentRelief]), 2)
Income taxincomeTax$round($bandedCharge(chargeableIncome, [{"upTo": $const.band1, "rate": $const.rate0}, {"upTo": $const.band2, "rate": $const.rate1}, {"upTo": $const.band3, "rate": $const.rate2}, {"upTo": $const.band4, "rate": $const.rate3}, {"upTo": $const.band5, "rate": $const.rate4}, {"upTo": null, "rate": $const.rate5}]), 2)
Income after taxnetIncome$round($max([0, assessableProfit - incomeTax - nhfAnnual - $n(pensionContributions)]), 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.

ConstantValue
band1800000
band23000000
band312000000
band425000000
band550000000
rate00
rate10.15
rate20.18
rate30.21
rate40.23
rate50.25
rentReliefRate0.2
rentReliefCap500000
nhfRate0.025

Test vectors (5)

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 — S1 ₦8,000,000 of profit, ₦1.5m rent, NHF: ₦7,500,000 chargeable, tax ₦330,000 + 18% of ₦4,500,000

given annualTurnover12000000
given annualExpenses4000000
given annualRent1500000
given pensionContributions0
given nhfMemberyes
expect assessableProfit8000000
expect chargeableIncome7500000
expect incomeTax1140000
expect netIncome6660000

Case 2 — S1b the same profit: NHF ₦200,000 and rent relief ₦300,000

given annualTurnover12000000
given annualExpenses4000000
given annualRent1500000
given pensionContributions0
given nhfMemberyes
expect nhfAnnual200000
expect rentRelief300000

Case 3 — S2 ₦800,000 of profit, no NHF or rent: nothing to pay

given annualTurnover1000000
given annualExpenses200000
given annualRent0
given pensionContributions0
given nhfMemberno
expect chargeableIncome800000
expect incomeTax0
expect netIncome800000

Case 4 — S3 ₦60,000,000 of profit with ₦2m pension: ₦10,430,000 + 25% of ₦6,000,000

given annualTurnover80000000
given annualExpenses20000000
given annualRent0
given pensionContributions2000000
given nhfMemberno
expect chargeableIncome58000000
expect incomeTax12430000

Case 5 — S4 ₦12,000,000 chargeable: ₦1,950,000 at the top of the 18% band

given annualTurnover12000000
given annualExpenses0
given annualRent0
given pensionContributions0
given nhfMemberno
expect incomeTax1950000

Sources

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 Nigeria business income tax calculator

Built with Valem — a live, verifiable calculator you can fork and embed.