ZyncDocs · NG-Payroll · Modules · PAYE (detailed)
Must Should Could
Detailed Functional Requirements

PAYE Income Tax — Detailed Requirements

The Nigerian Pay-As-You-Earn withholding as computed by the pay run: monthly gross less a monthly slice of the annual reliefs, annualised ×12, walked through the progressive PAYE bands, and divided back to a monthly deduction. No rebate applies, and the computation is stateless month to month — there is no year-to-date true-up.

6
Default bands
₦800k
Zero band
25%
Top rate

Annualised method

Monthly taxable ×12 → band walk → annual tax ÷12. Simple and deterministic.

Reliefs

Personal / spouse / child from the year's bracket, statutory contributions, item reliefs ×12.

Configurable bands

Per-year tax brackets seeded from the statutory default scale.

Stateless months

Each month taxes independently — no cumulative averaging or catch-up.

PAYE · Detailed

Computation method TAX-M

One formula, applied identically at estimate time and calculate time:

StepComputation
Monthly relief(annualStatutoryReliefs + itemMonthlyTaxRelief × 12 + annualPersonalRelief) ÷ 12
Monthly taxable incomemax(0, monthlyGross − monthlyRelief)
Annual taxable incomemonthlyTaxable × 12
Annual taxBand walk: baseTax + (annualTaxable − bandMin) × rate% in the band containing the amount
Monthly PAYEannualTax ÷ 12, rounded to 2 decimals
FR-TAX-M01Must
The system SHALL compute the monthly PAYE deduction by the annualisation method above, flooring taxable income at zero and applying no rebate.
Acceptance criteria
  • Gross for tax is the month's paid gross as assembled by the run.
  • The engine reports the monthly tax, the monthly relief applied, and the monthly/annual taxable income for display on the run line.
  • A month with gross below the monthly relief withholds zero.
FR-TAX-M02Must
The computation SHALL be stateless across months — each run taxes its own month independently, with no year-to-date accumulation or true-up.
Acceptance criteria
  • Recalculating any month never changes another month's figures.
  • Salary changes mid-year simply produce a different annualisation from that month on — no catch-up adjustment.

PAYE · Detailed

Reliefs TAX-R

Three relief sources reduce taxable income: the year's configured personal reliefs, the employee's statutory contributions, and tax-relief payroll items.

FR-TAX-R01Must
Annual personal relief SHALL be individualRelief + spouseRelief (only when the tax category is married-spouse-not-working) + numberOfChildren × perChildRelief + the employee's manual annual relief top-up, with the relief values coming from the pay year's tax bracket and the family data from the employee record.
Acceptance criteria
  • Tax categories: SINGLE / MARRIED_SPOUSE_WORKING / MARRIED_SPOUSE_NOT_WORKING.
  • All relief fields default to zero — an unconfigured bracket grants no personal relief.
FR-TAX-R02Must
Employee statutory contributions (pension, NHF, and other employee-paid schemes) SHALL reduce taxable income as annualised statutory reliefs derived from the unprorated full-month contribution amounts ×12, uncapped.
Acceptance criteria
  • Only the employee's share earns relief — employer contributions never do.
  • A mid-month joiner's relief uses the full-month contribution, so proration never understates the relief.
  • The tax bracket carries a per-scheme cap structure, but it is not consumed — reliefs apply uncapped (see Known gaps).
FR-TAX-R03Should
Payroll items of type tax relief (or non-taxable items) SHALL reduce taxable income, annualised ×12 — as a fixed amount or a capped percentage per the item definition.
Acceptance criteria
  • Relief type AMOUNT uses the item value; PERCENTAGE applies against the base up to the configured maximum.

PAYE · Detailed

Tax bands TAX-B

Progressive cumulative bands, configurable per tax year and seeded from the statutory default scale (Nigeria Tax Act individual rates).

Seeding: at boot the system creates a bracket named "Nigeria PAYE {year}" for the current and next year (idempotent) carrying these bands — but no personal relief values; individual/spouse/per-child reliefs ship as zero until an administrator sets them.

Default PAYE bands

Annual taxable income (₦)RateBase tax at lower bound (₦)
0 – 800,0000%0
800,000 – 3,000,00015%0
3,000,000 – 12,000,00018%330,000
12,000,000 – 25,000,00021%1,950,000
25,000,000 – 50,000,00023%4,680,000
50,000,000 +25%10,430,000
FR-TAX-B01Must
The system SHALL resolve annual tax by walking the bands configured for the pay year — tax = baseTax + (annualTaxable − bandMin) × rate% — selecting the bracket whose tax year matches the run's pay date.
Acceptance criteria
  • Administrators can maintain per-year brackets (bands + relief values) named "Nigeria PAYE {year}".
  • Annual taxable income of ₦800,000 or less withholds zero PAYE.

PAYE · Detailed

Business rules

  • All rounding is to 2 decimals (round-half) — there is no agency-specific rounding regime for PAYE.
  • The pay date's year selects the bracket; historic brackets stay untouched so re-runs reproduce their original tax.
  • Estimates equal final figures for unchanged inputs — the same annualised method runs at draft time and calculate time.
  • Employer contributions never affect PAYE — only employee shares earn relief.

PAYE · Detailed

Known gaps

No year-to-date true-up. Mid-year salary changes, bonuses or joiners annualise naively from that month — the total withheld across the year can drift from the true annual liability, with no December catch-up. Annual reconciliation happens outside the system.
No dedicated bonus treatment. A bonus month is annualised ×12 like ordinary pay, overstating that month's PAYE (and no later true-up corrects it).
No minimum-tax rule. The statutory minimum tax for low/zero-taxable earners is not implemented — below-threshold incomes simply withhold zero.
A missing year bracket computes zero PAYE. Only the seeded bracket's bands are consulted at run time (no error is raised); verify brackets exist each new year.
Statutory relief caps are dead configuration. The tax bracket's per-scheme annual-limit structure is stored but never read — statutory reliefs always apply uncapped.
Residency status is stored but unused. The employee's resident/non-resident flag never reaches the tax path — everyone is taxed on the resident bands.