AWRA OpsHub Search
Statutory & payout details

A certificate you can reprint in 2031 and get the same numbers.

Tax rates change. Finance Acts amend thresholds. A payroll system that recomputes history against today's rates will hand your employee a P9 that disagrees with the payslips it was built from. AWRA OpsHub rebuilds every certificate from frozen snapshots and the exact rule versions each payslip used — so a reprint is a reproduction, not a recalculation.

Versioned law data that freezes when used · P9A certificate and PDF · Encrypted payout details · Every decrypt audited

The law is not a setting

Statutory rules are versioned data, and you do not own them.

This is a deliberate separation. Your allowances and deductions are yours to configure. Tax bands, social security rates, health insurance and levies are law — and treating them as a workspace setting is how a payroll ends up with a tax rate somebody changed to make a number look right.

Income tax income_tax

Progressive bands, a personal relief amount, and a computation order that always puts it last — because it depends on everything else.

Social security social_security

Tiered contributions with their own ceilings, applied to the pensionable base rather than to gross.

Health insurance health_insurance

Its own rate and its own base, with minimum and maximum caps where the law sets them.

Local levy local_levy

For the housing and training levies that sit outside the other three, each with its own basis.

How a rate change actually works

Not by editing a number. By sealing the old version and opening a new one.

v1
Superseded

Its bands and thresholds are exactly as they were. Payslips that used it still point at it and still reproduce from it.

FROZEN
v2
Closed off

Its effective-to date is set to the day before the next version begins, so the timeline has no gap and no overlap.

FROZEN
v3
In force

A new version with the amended numbers and its own effective-from date — the day the change takes legal effect, not the day somebody typed it.

CURRENT

And the freeze is enforced, not merely advised. The mechanism that loads rule data refuses to write over a version that real payslips have already referenced. It will happily add a new version, and it is safe to re-run as often as you like, but a published rate is not editable — which means the arithmetic behind a payslip issued three years ago cannot be quietly rewritten by a well-meaning update today.

Every payslip line for a statutory deduction stores the identifier of the exact rule version it was computed from. That is what makes a P9 reproducible and what makes a payroll query answerable: you can point at a deduction and say precisely which set of bands produced it.

How we know the numbers are right

Verified against a real payslip, and we will tell you which part was not.

Kenya · cross-checked 2026-07-13 against an actual employer payslip

Seeded rates are worth nothing if nobody has ever checked them against reality. Kenya's income tax, social security, health insurance and housing levy figures were reconciled line by line against a real employer payslip — a gross of 71,789 producing exactly 14,112.54 of gross tax before relief.

Confirmed against the sample

Every band, rate and threshold the sample's pay actually reached:

First 24,00010%
24,001 – 32,33325%
32,334 – 500,00030%
500,001 – 800,00032.5%
Above 800,00035%
Personal relief, monthly2,400
One figure the sample could not confirm

Social security's second-tier upper ceiling. The sample employee's pay never reached it, so while the figure is taken from the published schedule, it has not been proven against an actual payslip the way everything else has.

We would rather say that than let you assume it carries the same evidence as the rest. If you employ above that threshold and want it independently confirmed before you rely on it, tell us and we will confirm it.

A correction that shipped, and why it is worth telling you about. An early social security version was seeded with a first-tier ceiling of 8,000. A real payslip proved it was 9,000. Because published versions are frozen rather than edited, the fix was a new version — and the wrong one was left in place, superseded and never in force for any real calculation, because deleting it would have broken the test payslip that referenced it. That is the version chain doing exactly what it exists for.

Rates change through Finance Act amendments. Kenya's figures are the configured jurisdiction today, and any other country's statutory rules are a matter of adding versioned data in the same shape — which is work we do rather than something you configure, precisely because it is law and not a preference.

The certificate

A P9A is a different document from twelve payslips.

It aggregates a full tax year of monthly PAYE for one person, for their own annual return — so it has to agree with every payslip inside it, permanently.

It is built entirely from frozen evidence. Each month's row is reconstructed from that payslip's stored line items and the statutory rule versions it referenced — never from live rates. That is what makes the document reproducible: print it now, print it in 2031 after four Finance Acts, and it is the same certificate.

The available years come from the payslips that actually exist, so the year selector offers what there is rather than an empty calendar. Figures are added with decimal-exact arithmetic rather than floating point, because a year of monthly rounding is exactly where a cent-level drift becomes a figure an employee queries.

view_payroll HR, for any employee

Produces a certificate on screen and as an A4 landscape PDF, named for the year and the employee's own number, and viewable inline or downloadable.

self-service The employee, for themselves

A separate route behind a separate, lower-trust permission — because being allowed your own tax certificate is not the same as being allowed everybody's.

work_country Scoped to the person, not the company

Eligibility is checked on the employee's work country rather than the organisation's, because a business headquartered anywhere can employ people in Kenya — and those people are owed the certificate.

That last point is a small thing that reveals the whole approach. The buttons leading to a P9 are already hidden for employees who do not work in Kenya — but the URL is checked as well, so the address cannot be typed by hand to produce a Kenyan tax document out of a German employee's payslips. Two layers agreeing is the difference between a hidden button and a rule.

And the payroll engine underneath stays jurisdiction-agnostic. The P9 is a country-specific report layered on top of generic output, rather than Kenyan assumptions baked into the calculation — which is what makes adding another jurisdiction a matter of data and a report, not a rewrite.

Payout details

Encrypted at rest, masked on screen, and audited on every look.

Bank account numbers are the single most abusable field in an HR system. Someone who can read them can redirect a salary, and the theft looks exactly like a payroll run.

Payout detail · A. Otieno PRIMARY
Method
Bank transfer
Bank
Equity Bank · Industrial Area
Bank code
068
Account name
••••••••••ENCRYPTED
Account no.
••••••••4471ENCRYPTED
Currency
KES
Reveal
 requires view_bank_details
What one reveal writes to the audit log
Action
bank_detail_viewed
Module
Payroll
Actor
S. Kamau · [email protected]
Description
Viewed decrypted bank number for A. Otieno
Route
employees.bank_details.reveal
IP
41.90.xx.xx
Browser
Chrome on macOS
Session
a7f3…c210
Subject
The specific payout record
An entry per view, not a counter. Ten looks is ten rows, each with its own moment, address and session — so "who saw this account number, and when" is a query rather than an investigation.
view_employees See that details exist

The list of payout methods, masked, with the primary one marked. Enough to know somebody is payable without seeing anything you could misuse.

edit_employees Manage which exist

Adding, removing and changing the primary — the ordinary employee-record grant, because managing which details exist is an ordinary HR edit.

view_bank_details See the actual number

A separate, higher-trust grant, and the only one that decrypts. Every use is audited. This is the split that matters.

Why split those two apart? Because the HR administrator who onboards forty people a month needs to enter payout details constantly and almost never needs to read one back. Granting both together means everyone who does data entry can also harvest account numbers, and nothing in the system distinguishes the two activities. Splitting them means the read is rare, deliberate, permissioned and logged — and a decrypt at two in the morning from an unfamiliar address is a thing you can actually find.

The same treatment covers statutory identifiers — tax numbers, social security numbers, health scheme numbers. Encrypted at rest, displayed as the last four characters only, and revealed through the same audited path.

Two smaller behaviours worth knowing: the first payout detail you add is automatically the primary one, so nobody can be left payable-in-theory with no designated account; and deleting the primary promotes another rather than leaving an employee with details but no primary. Mobile money is a first-class method alongside bank transfer, with its own network and number, rather than a bank account with the fields used loosely.

One seam, stated plainly

Where the money actually leaves.

Posting a payroll run records the payment as made

When you post an approved run, AWRA writes a payment transaction for each payslip — routed to mobile money or bank according to that employee's primary payout method, referenced to the run and the employee, carrying the masked account it was directed to — and posts the accounting: payroll expense against payroll payable, then payable against bank.

What it does not yet do is instruct your bank or mobile-money provider directly. The transaction is recorded as settled, and the actual transfer happens through your existing banking channel. So the ledger, the payslips and the payments register all agree with each other and with what you paid — but the instruction to pay is still yours to send.

We are telling you this on a marketing page because it is the sort of thing that is far better learned now than on a payroll day. Direct payout rails are the natural next piece, and the seam is already drawn in the right place for them — the payment record, the routing decision and the masked destination all exist, waiting for a provider on the other side.

Straight answers

What compliance does today — and what we can add to yours.

Statutory payroll is the least appropriate place in software for a vague claim, so here it is exactly.

The straight answer

What AWRA OpsHub does today

  • Statutory rules held as versioned law data by country and rule type, each with its own effective dates, bands, relief, caps and computation order
  • Four rule types — income tax, social security, health insurance and a local levy — each applied to its own base rather than all to gross
  • Published versions frozen once real payslips have used them, enforced by the loader rather than by convention, and safe to re-run at any time
  • A rate change handled by opening a new version and closing the previous one the day before it takes legal effect, so the timeline has no gap and no overlap
  • Every statutory payslip line storing the identifier of the exact rule version it was computed from
  • Kenya's rates cross-checked against a real employer payslip, with the one figure that could not be confirmed named rather than glossed over
  • A P9A tax deduction certificate rebuilt entirely from frozen payslip snapshots, so a reprint years later is a reproduction rather than a recalculation
  • The P9A available on screen and as an A4 landscape PDF, named for the year and the employee, viewable inline or downloadable
  • A year selector offering only years that have payslips, and decimal-exact arithmetic rather than floating point across twelve months of rounding
  • P9A eligibility checked on the employee's work country rather than the organisation's, and enforced on the URL as well as by hiding the button
  • A jurisdiction-agnostic payroll engine with the country-specific certificate layered on top, rather than one country's assumptions baked into the calculation
  • Account names, account numbers and mobile-money numbers encrypted at rest and displayed masked
  • Decrypting gated by a separate, higher-trust permission from the one that manages which payout details exist
  • Every single decrypt audited — actor name and email, subject, route, method, full URL, IP address, browser and session — as an entry per view rather than a counter
  • Statutory identifiers given the same treatment: encrypted, shown as the last four characters, revealed through the same audited path
  • Mobile money as a first-class payout method alongside bank transfer, with its own network and number
  • The first payout detail automatically primary, and deleting the primary promoting another, so nobody is left payable with no designated account
  • Posting a run writing a payment transaction per payslip, routed by the employee's primary method, referenced to the run, carrying the masked destination — and posting the matching ledger entries

More we can add to your workspace

  • Direct payout rails — instructing your bank or mobile-money provider from the platform, with per-payment status coming back and reconciling itself
  • Statutory rule sets for further jurisdictions, in the same versioned shape as Kenya's, verified against real payslips before they go anywhere near a live run
  • Statutory return filing — generating and submitting the monthly and annual employer returns your authority requires, with a submission receipt
  • A bank payment file export in the formats your bank accepts, so a run becomes a single upload rather than manual entry
  • A payout detail change alert — notifying finance when an account number changes shortly before a payroll run, which is the signature of a redirection attempt
  • Dual approval on a payout detail change, so altering where a salary lands needs two people
  • An independently confirmed social security upper-tier ceiling, evidenced the same way as every other figure
  • A statutory reconciliation report proving the totals deducted agree with what was remitted, period by period
  • A scheduled digest of decrypt activity, so unusual access to payout details is noticed without somebody opening the audit log
  • Employee-facing payout detail updates through self-service, with verification and an approval step
  • An annual statutory summary per employer across all employees, beyond the per-employee certificate
  • Retrospective recalculation against a superseded rule version, for correcting a period that was run on the wrong version

Where we point you to a specialist

  • We will not tell you what your tax obligations are. We implement the rates and rules your jurisdiction publishes and your adviser confirms, and we version them so you can prove what was applied when.
  • Whether a payment is correctly treated for tax is your accountant's judgement. Give us the treatment and we will apply it identically every time, and record which version did it.
  • Your statutory returns carry your organisation's declaration. We will produce the figures and the evidence behind them; the declaration stays yours.
  • We will not build a way to read a decrypted account number without an audit entry, on any permission, for any reason. An unlogged decrypt is the one thing this design exists to prevent.
  • We will not edit a published statutory version in place, even when asked. A superseding version with its own effective date is the only correct answer, because the alternative rewrites payslips that have already been issued.

Direct payout rails and additional jurisdictions are the two biggest items here, and both are additive rather than structural — the payment record and routing decision already exist for the first, and the versioned rule shape already exists for the second. Tell us your provider or your country and we will come back with a written spec, a timeline and a price.

Worth planning around on your first payroll day: posting a run records the payments as settled and posts the ledger, and the actual transfer still goes through your own banking channel. Everything reconciles; the instruction to pay is the part that is still yours to send.

Questions, answered

Statutory payroll FAQ.

What happens to my old payslips when tax rates change?
Nothing. A rate change adds a new version and seals the old one, and every statutory payslip line stores which version computed it. So historical payslips and P9 certificates reproduce exactly as they were issued, whatever the law does afterwards.
Can I change a tax band myself?
No, and that is deliberate. Statutory rules are versioned law data rather than a workspace setting, so nobody can adjust a tax rate to make a figure come out differently. Your allowances and deductions are fully yours to configure; the law is not.
Which countries are supported for statutory payroll?
Kenya is the configured jurisdiction today, with its rates cross-checked against a real employer payslip. Adding another country means adding versioned rule data in the same shape — work we do rather than something you configure, and we verify it before it goes near a live run.
Who can see an employee's bank account number?
Only somebody holding the specific bank-details permission, which is separate from the permission that lets people add and manage payout records. Every reveal writes an audit entry with the person, the employee, the moment, the IP address, the browser and the session — one entry per view.
Can somebody read an account number without it being logged?
No, on any permission. The audit entry is written on the same path that performs the decrypt, so there is no route to the plaintext that bypasses it. This is the one thing the design exists to prevent, and we will not build an exception.
Does AWRA OpsHub pay my staff directly?
Not yet. Posting a run records a payment per payslip, routed to bank or mobile money by that employee's primary method, and posts the matching ledger entries — so everything reconciles. The actual transfer goes through your own banking channel today. Direct payout rails are the natural next piece and the seam is already drawn for them.
Can employees get their own P9?
Yes, through self-service, behind a separate and lower-trust permission from the one HR uses to produce anybody's. Both check the employee's work country rather than the organisation's, and both enforce it on the URL as well as by hiding the button.
Does the platform file my statutory returns?
Not today. It produces the per-employee certificate and holds every figure and rule version behind it. Generating and submitting employer returns with a submission receipt is on the list above — and the declaration on a return stays yours regardless.
Ready when you are

Prove what you deducted, years after you deducted it.

Sealed rule versions, certificates rebuilt from frozen evidence, account numbers nobody can read without leaving their name — and a straight account of the one place the money still leaves by your own hand.