NG-Payroll — Process Flows
The operating lifecycle of the Nigerian payroll, phase by phase: one-time configuration, enrolling employees, the monthly pay cycle from draft to paid, the exception paths, monthly agency remittance, and year-end. Every flow cites the functional requirements that back it on the Modules tab.
Phase A · One-time Setup
Configure payroll foundations setup
HR and Finance stand up everything a run depends on. Statutory types and PAYE bands self-seed; the item catalogue, contribution-group rates, personal reliefs and GL accounts are operator work — including every statutory rate.
Flow
- 1SystemSeeds foundations at boot.Statutory type masters (paye, pension, nhf, nhis, nsitf) and a tax bracket per current + next year (Nigeria PAYE {year} with the default band scale). Personal reliefs seed as zero — they must be set by hand. Idempotent.
- 2HR AdminSets the year's relief values on the tax bracket — individual, spouse, per-child.The run reads reliefs from the bracket only; leaving them at zero over-withholds PAYE for everyone.
- 3HR AdminBuilds the item catalogue — Basic Salary, housing/transport and other allowances, deductions, tax reliefs (create or import).Each item carries taxability, statutory-base tags, GL account and frequency. Only one item may be basic salary. Nothing is pre-seeded.
- 4HR AdminDefines the statutory contribution group with the legal rates — pension 8%/10%, NHF 2.5% (tagged to basic), NSITF 1% employer, NHIS per policy.Rates are configuration: the engine applies whatever is entered and never validates against statute. Use percentage value types; the table type computes zero.
- 5HR AdminOptionally bundles standard packages as item groups (e.g. "Junior Staff Package").Groups bulk-apply into standing assignments later; editing a group never rewrites what was already applied.
- 6Finance AdminSets the payroll GL accounts in company configuration.Salary expense, PAYE payable, and net-salary liability accounts; per-scheme payables on the contribution group; per-deduction payables on the items.
Rules & gotchas
- A year with no tax bracket silently computes zero PAYE — verify brackets and reliefs each new year.
- Deduction items without GL accounts will later block journal posting.
- The employer-expense config account is currently unused — employer statutory costs are not journalled.
End state
Catalogue, statutory group with rates, brackets with reliefs, and accounts in place — employees can be enrolled.
Phase B · Onboarding
Enrol an employee into payroll enrol
A hired employee becomes payable: tax profile completed, statutory numbers recorded, contribution group linked, and standing items assigned — singly, by import, or by applying an item group.
Flow
- 1HR AdminCompletes the payroll profile — tax category, number of children, any manual relief top-up, join date, attendance group.These drive spouse/child reliefs, proration, and the working-day context for leave/overtime/absence.
- 2HR AdminLinks the employee to the statutory contribution group.No group → no pension/NHF/NSITF contributions at all.
- 3HR StaffRecords the employee's statutory numbers — TIN, pension PIN, NHF/NHIS/NSITF numbers.Identity only; blanks never block computation.
- 4HR StaffAssigns standing items — Basic Salary with the monthly amount plus allowances/deductions, dated from the join date — individually, via spreadsheet import, or by applying an item group to a batch of hires.Active window = pay date within [start, end]. No overlapping assignments of the same item; a group apply skips conflicts and reports them. Annual amounts smooth ÷12.
Rules & gotchas
- The basic-salary assignment is what the run pays; the employee's basic-salary field is only a fallback.
- Salary revisions: end-date the old assignment, start a new one — history stays intact.
- No bank details exist anywhere — disbursement happens outside the system.
End state
The employee is fully payable: profile, group, numbers and standing items in place.
Phase C · Monthly Cycle
Monthly pay run — draft to paid run
The core cycle: a run for the month, employees join with attendance inputs snapshotted, the engine calculates contributions and PAYE, approval locks figures, the journal posts the accrual, and the run is marked paid.
Flow
- 1HR AdminCreates the run — name, pay date, optional period window.Status DRAFT. The pay date's month anchors proration and the period default; its year selects the tax bracket.
- 2HR AdminAdds employees to the run.Per employee: snapshot basic salary; unpaid leave (approved unpaid days × gross ÷ working days); overtime (approved timesheet hours × hourly rate); absence (working days − present days × daily rate); and one contribution row per scheme at the group's configured rates — prorated and full-month amounts both stored.
- 3HR AdminReviews the draft — live estimates per line; adjusts assignments, overrides line inputs, or resyncs after changes.Items are read live at calculate, but contribution changes need a resync; resync overwrites manual overrides.
- 4HR AdminRuns the calculation.Per employee: prorate → gross → statutory sums → annualised PAYE (reliefs ÷12, ×12 band walk, ÷12) → net (floored at 0) → employer cost. All lines + totals written in one transaction; status → PENDING_APPROVAL; any journal link cleared.
- 5HR AdminApproves the run.Status → APPROVED; figures locked; in-app notification to creator and managers. (Reject → back to DRAFT with figures zeroed.)
- 6Finance AdminPreviews the journal, picks the net-salary liability account, posts.Preview surfaces unmapped items — posting refuses until every deduction/scheme has a GL account. Entry dated on the pay date, linked to the run.
- 7Finance AdminPays salaries through the bank (outside the system) and marks the run paid.Mark-as-paid requires the posted journal. Status → PAID (terminal). Settling the salary-payable liability is a separate manual finance entry.
- 8HR StaffShares payslips.Payslips render on-screen per line. No PDF/e-mail/self-service distribution exists — a known gap.
The journal (one balanced entry per run)
| Leg | Side | Account | Amount |
|---|---|---|---|
| Salary Expense | DR | Payroll expense (config) | Σ gross salary |
| Item deductions | CR | Each item's account | Per employee per item |
| Employee pension / NHF / NHIS | CR | Group's per-scheme account | Employee shares |
| PAYE | CR | Payroll tax (config) | Tax per employee |
| Net salary | CR | Salary liability (chosen) | Net per employee |
Employer statutory shares are deliberately excluded — tracked on the run, settled and accounted for outside the salary journal.
Rules & gotchas
- Approval is procedural — the same user can calculate and approve (no maker/checker).
- A one-off payment in the month annualises ×12 for PAYE with no later catch-up — expect over-withholding in bonus months.
- Loan instalments, advances and claim reimbursements must be entered as item assignments — nothing flows in automatically.
End state
A PAID run with locked figures, a balanced GL accrual, and per-line payslip data plus contribution summaries for remittance.
Phase D · Exceptions & Variations
Reject, re-run & special cases exceptions
Reject loop
- 1HR AdminRejects a pending run.Status → DRAFT; every line's calculated figures zeroed so stale numbers never display as final.
- 2HR AdminFixes assignments/inputs, resyncs, recalculates, re-approves.Audit captures every transition; manual line overrides must be re-applied after resync.
Special cases
| Case | Behaviour |
|---|---|
| Mid-month joiner / leaver | Base, allowances, deductions and the statutory base prorate by workedDays ÷ daysInMonth. OT/leave/absence stay per actual day. Join on the 1st is a full month. |
| One-off payment / 13th month | An ordinary item scoped to a single-month window. Taxed as ordinary pay annualised ×12 — over-withholds that month with no catch-up (known gap). |
| Re-run after approval | Allowed (only PAID/CANCELLED block). Status returns to PENDING_APPROVAL and the journal link clears — a posted journal entry is not deleted: remove it manually before re-posting or the GL doubles up. |
| Cancel | Any non-PAID run can be cancelled (terminal). Nothing is cleaned up — no journal reversal, no line reset. |
| Zero/negative net | Net pay floors at 0; the shortfall is absorbed silently into total deductions. |
End state
Corrected figures re-approved, or the run cancelled with a full audit trail.
Phase E · Statutory Remittance
Monthly agency payments remit
Paying the withheld and employer amounts to the agencies. The system supplies the figures; submissions and payments happen on the agency portals — no schedules or files are generated.
Flow
- 1Finance AdminReads the run's summaries — PAYE total and employee + employer amounts per scheme, with per-employee rows for schedules.Grouped per statutory type on the run; per-employee contribution rows support PFA schedule preparation.
- 2Finance AdminRemits to each body — PAYE to the State IRS, pension (employee 8% + employer 10%) to each employee's PFA, NHF to FMBN, NSITF/NHIS as applicable.Figures are re-keyed manually — the system produces no remittance schedules, upload files or receipts tracking.
- 3Finance AdminClears the payable accounts with manual journals as payments land.The salary journal accrued only employee-side liabilities; employer pension/NSITF were never journalled and need their own entries.
End state
All agency liabilities for the month settled; payable accounts cleared.
Phase F · Year-end
Annual compliance yearend
After the December run: the employer's annual PAYE returns to each State IRS (due 31 January), employee tax deduction summaries, and the new year's tax bracket verified — all prepared from run data, filed outside the system.
Flow
- 1HR AdminConfirms every run of the year is finalised and reconciles total PAYE withheld per employee.Because monthly PAYE is annualised with no true-up, the year's total withholding can differ from the true annual liability — reconcile before filing and handle differences per State IRS guidance.
- 2HR AdminPrepares and files the employer's annual return (Form H1 / state equivalent) with per-employee emoluments and PAYE.Compiled manually from run data — no annual return document is generated (known gap).
- 3HR AdminVerifies the new year's tax bracket against the current Finance Act — bands and relief values.The seed created the bracket with default bands and zero reliefs; set the relief values before the January run.
End state
Annual returns filed, the new year's parameters confirmed — the January run can proceed.