Written for whoever has been handed the ticket. This is the honest inventory — the same list we worked through — so you can decide whether to build it or hand it over.
Under the VAT (Electronic Tax Invoice) Regulations, 2020, tightened by the Finance Act, 2023, a tax invoice in Kenya must be generated through eTIMS and signed by a control unit before it is a valid receipt. The technical detail lives in KRA's Trader Invoicing System specification for OSCU and VSCU, and it is more specific than most teams expect.
The commercial pressure usually arrives before the legal one. A business customer cannot claim input VAT against a non-compliant receipt, so they stop accepting yours long before anyone audits you.
A control unit belongs to one taxpayer PIN and one branch. Registration returns a key, once, which every later call is signed with. Lose it and the device is dead; leak it and someone else can sign as you.
Invoice numbers per device must ascend without gaps. Not "mostly" — a missing number is a question you will be asked to answer. Getting this right under concurrent sales is a locking problem, not a counter.
A receipt is only a tax invoice once a control unit has signed it. Your checkout flow has to survive the round trip, which means it must have an answer for what the cashier does while it is in flight.
A exempt, B 16%, C zero-rated, D non-VAT, E 8%. Shelf prices are VAT-inclusive; KRA wants the exclusive taxable amount and the tax, per line and per category, rounded the way the spec rounds.
Date and time, the control unit ID, the CU invoice number, internal data, and the receipt signature grouped in fours. Then the QR, whose payload is a defined concatenation, not a link you invent.
Normal, copy, training and proforma, each crossed with sale, credit note and debit note, produce the labels NS, NC, CS, CC, TS, TC and PS. Copies, training and proforma receipts must say, in print, that they are not official receipts.
A refund references the original control-unit receipt number, carries negative amounts only, and an original transaction may be cancelled exactly once. Enforcing "once" is your job, not KRA's.
X and Z daily reports, PLU reports, an item counter and stock control — including refusing to release goods you do not have. Services are exempt from the stock rule; goods are not.
Bio data, an architecture document, named technical staff, then a demo and vetting before you get an approval certificate. This is a process with a queue, not a form you submit.
The registration key is issued once and cannot be reissued on demand. It has to live somewhere encrypted, out of your repository and out of your logs, per device, for years.
Two sales at the same instant must not take the same invoice number, and a crash between allocating and signing must not eat one. This is the bug that surfaces on your busiest day.
A KRA rejection is permanent and must not be retried. A timeout is not a rejection and must be. Confusing the two either loses invoices or signs them twice.
Not development effort — calendar time, in a queue, before you can invoice a single customer in production.
That is a whole product. It is ours, so it does not have to be yours.
One POST when a sale completes, and one handler for the signature that comes back. The control unit, the key, the sequence, the tax split, the QR payload and the certification are on our side of the line.
Tell us what your system does. We reply with a sandbox token, a registered device and a working example against KRA.