DEV Community

zikarelhub
zikarelhub

Posted on

Building Nigerian Payroll Compliance Into an ERP — PAYE, Pension & NHF

Generic ERP platforms built for international markets rarely handle Nigerian payroll compliance correctly out of the box — PAYE tax bands, pension contribution rules, NHF deductions. Here's how to implement these correctly in a Nigerian ERP system.

Nigerian PAYE Calculation

Nigerian PAYE uses a Consolidated Relief Allowance (CRA) system before applying progressive tax bands:

function calculateNigerianPAYE(grossAnnualIncome) {
  // Consolidated Relief Allowance
  const cra = Math.max(200_000, grossAnnualIncome * 0.01)
    + (grossAnnualIncome * 0.20);

  // Pension relief (8% of basic — simplified here as % of gross)
  const pensionRelief = grossAnnualIncome * 0.08;

  const taxableIncome = Math.max(0, grossAnnualIncome - cra - pensionRelief);

  // Progressive bands
  const bands = [
    { limit: 300_000,   rate: 0.07 },
    { limit: 300_000,   rate: 0.11 },
    { limit: 500_000,   rate: 0.15 },
    { limit: 500_000,   rate: 0.19 },
    { limit: 1_600_000, rate: 0.21 },
    { limit: Infinity,  rate: 0.24 }
  ];

  let remaining = taxableIncome;
  let totalTax = 0;

  for (const band of bands) {
    if (remaining <= 0) break;
    const taxable = Math.min(remaining, band.limit);
    totalTax += taxable * band.rate;
    remaining -= taxable;
  }

  return {
    taxableIncome: Math.round(taxableIncome),
    annualPAYE: Math.round(totalTax),
    monthlyPAYE: Math.round(totalTax / 12)
  };
}
Enter fullscreen mode Exit fullscreen mode

Monthly Payslip with All Nigerian Deductions

function calculateNigerianPayslip(employee) {
  const gross = employee.basicSalary + employee.allowances;
  const paye = calculateNigerianPAYE(gross * 12);

  return {
    grossPay: gross,
    deductions: {
      paye: paye.monthlyPAYE,
      employeePension: Math.round(employee.basicSalary * 0.08), // PRA 2014
      nhf: Math.round(employee.basicSalary * 0.025),            // NHF Act
    },
    employerContributions: {
      pension: Math.round(employee.basicSalary * 0.10),
      nsitf: Math.round(gross * 0.01)
    },
    netPay: Math.round(
      gross - paye.monthlyPAYE
        - (employee.basicSalary * 0.08)
        - (employee.basicSalary * 0.025)
    )
  };
}
Enter fullscreen mode Exit fullscreen mode

Why This Matters

Every Nigerian employer running payroll through a generic international ERP has miscalculated PAYE at some point — because the CRA calculation and current Nigerian tax bands aren't standard international functionality. Building this correctly from the start avoids costly corrections and potential FIRS audit exposure.


ZikarelHub builds ERP systems for Nigerian businesses with Nigerian compliance built in from the foundation.

What's the most painful manual process in your Nigerian business operations? 👇

Top comments (0)