Statutory rates that never need a software update
PAYE bands, personal relief, SHIF, NSSF tiers and the Housing Levy are stored as effective-dated rate sets. A new gazette notice is a data entry with a start date, not a wait for a developer. The payroll engine refuses to run if no applicable rate set exists, so a run can never silently use the wrong rates.
When a run is finalised, the rate set it used is stored with it, so past payslips never change when rates are updated later.
A payroll run in four steps
- Pick the month.
- Preview each staff member’s gross pay, deductions, advances and net pay.
- Finalise — the server recomputes everything so the figures cannot be tampered with in the browser.
- Download payslips, the bank file and the NSSF file, or pay net salaries by M-Pesa.
Salary advances with proper controls
Staff advances go through request and approval, and the person who records an advance can never approve it themselves. Approved advances are recovered automatically from the next payroll run, capped at net pay, and appear on both the preview and the payslip.
Paying staff by M-Pesa
From a finalised run, the bursar can push each staff member’s net pay to their phone through M-Pesa B2C. Each payslip shows its status — queued, sent or failed — driven by Safaricom’s own result, and the system guarantees no salary is paid twice even if a request is retried.