AWRA OpsHub Search

Filing Is Not Fiscalisation, and Your Till Knows the Difference

Four East African revenue authorities, four separate interfaces, and one question that separates them from each other: can the sale complete when the authority cannot be reached? We built for one answer. Here is which, what it means for the paper in your customer's hand, and the thing we found in our own code while writing this.

Point of Sale AWRA OpsHub Team 14 min read

A shopkeeper in Kampala, one in Dar es Salaam, one in Kigali and one in Nairobi are all told by their software vendor that the product "handles e-invoicing". All four are being told something true. No two of them are being told the same thing, and at least one of them is going to find that out on a Tuesday afternoon when the internet goes down and a queue forms.

The word doing the damage is e-invoicing, which has been stretched to cover two mechanisms that have almost nothing in common. One of them sends a document to a revenue authority after the document exists. The other requires the authority, or a device the authority has approved, to authorise the document before it can be issued at all. Those are not two grades of the same feature. They are opposite architectures, and a system built for the first cannot be persuaded into the second by configuration.

This matters more at a till than anywhere else in a business, because a till is the one place where a document and a human being meet in real time. An invoice can be raised on Tuesday and transmitted on Wednesday and nobody is standing there. A customer at a counter is standing there.

The question that separates the two

There is a single diagnostic, and it is short enough to ask in a demo.

Cut the connection to the revenue authority. Now sell something. Did the sale complete?

If the sale completed, you are looking at a filing pipeline. The transaction is the business's own act; the authority is told about it afterwards. Reliability is a queue problem, and queues are a solved problem — retry, back off, alert somebody when the backlog grows.

If the sale refused to complete, you are looking at fiscalisation in the strict sense. The authorisation is not a notification about the transaction, it is a component of it, and the software is not permitted to produce a valid document without it. A vendor who has built this will tell you about it immediately, because it is the hard part and it is expensive.

Our own codebase already draws this line, in a place most people will never read. The text we publish for South Sudan says that the authority's platform there "is registration, filing and payment, not a requirement that each invoice be validated before it can be issued, so this is a filing pipeline rather than a fiscalisation one and the two are often confused." That distinction was written for one market. It is the whole subject of this post.

Four neighbours, four interfaces

The East African Community harmonises a great deal. It does not harmonise this. Each of these is a separate authority running a separate scheme against a separate technical interface, and each one is a separate build for any vendor serving the region.

Country Authority The scheme Built by us
Kenya KRA eTIMS, via an OSCU device registration Yes — invoices and POS sales
Uganda URA EFRIS No
Tanzania TRA EFD / VFD, with a Zanzibar variation No
Rwanda RRA EBM No

What this table deliberately does not have

A column saying which of these schemes authorises a document before issue and which accepts it afterwards. We have not published one because we cannot source it to the standard the rest of this site holds — every statutory figure here carries a dated source, and nothing equivalent exists in our hands for these four schemes. The taxonomy above is a question for you to put to your own adviser and to every vendor on your shortlist. It is not a claim we are making about your country on your behalf.

What we can state without qualification is the second column of that table, because it describes our own code rather than anybody's statute. One of those four is implemented. The other three are not, and no amount of settings will make them appear.

What we actually built, described precisely

A tenant connects by supplying their KRA PIN, a branch identifier and a device serial number, then initialising the device to obtain a communication key. That key is stored encrypted and every subsequent call carries it. There is a sandbox toggle, so the connection can be proved end to end before anything real goes through it. This is a device-registration model, and it is a reasonable one.

Then a sale happens, and here is the design decision that this whole post is about. Filing is dispatched after the database transaction commits, onto a queue. The job's own comment says it plainly: recording a sale is never blocked or delayed, the sale completes immediately, and filing happens in the background. Three attempts, backing off thirty seconds, then two minutes, then five.

For Kenya that is the right call, and it is the call we would make again. It means a network problem at the revenue authority is not a network problem at your counter. It means the queue absorbs an outage instead of your customers absorbing it. It is the correct architecture for a filing regime.

It also has a consequence that we have never written down anywhere until now.

The receipt in the customer's hand

The receipt template renders the fiscal block — the authority's receipt number, the receipt signature, the QR code drawn in vector from the stored payload — inside a condition. The condition is that the sale's filing status equals filed. Everything in that block is real, it is production code, and it works.

But at the moment the receipt prints, the filing has not happened yet. It was queued a fraction of a second ago and it is going to complete somewhere between a moment and several minutes from now, depending on the queue and the authority. The status at print time is not filed. So the condition is false, and the block is absent.

One sale, in order

Cashier takes payment, sale is committed Filing status: not yet filed
Filing job queued, after commit Filing status: not yet filed
Receipt PDF generated and printed Fiscal block condition false — omitted
Customer leaves with the receipt No number, no signature, no QR
Queue worker picks the job up, KRA accepts Filing status: filed
Signature, receipt number and QR stored on the sale Now available — on a document nobody reprinted
What the customer is holding A commercial receipt, not a fiscal one

The data is not lost. It is on the sale record, it is on the reprint, it is on the screen, and it is in every report. The system is doing what it was designed to do. But the printed artefact that a person carried out of the shop is not the artefact that carries the fiscal reference, and if you are in a jurisdiction where the customer's copy is required to bear that reference at the moment of handover, this design does not satisfy your regime and cannot be configured into satisfying it.

A queue is the right answer to an outage and the wrong answer to a legal precondition. Which one you have is decided by your statute, not by your vendor.

And the one we found while writing this

Auditing our own code for this post turned up something we did not know, which is the usual reason these posts are worth writing.

A filing that fails is marked failed, with the authority's error message stored against the sale, and the job raises so the queue can retry it. After three attempts it stops. For a customer invoice that is fine, because the invoice screen carries a button that reads "Retry eTIMS filing" and an operator can push it.

There was no such button for a point-of-sale sale. No route, no control in the interface, and no scheduled task that swept up failures and tried again. A POS sale that failed three times was stranded in the failed state permanently, and the only thing that would have surfaced it was somebody querying the database. The mechanism that files POS sales was modelled on the invoice one and the recovery half was not carried across.

Corrected 12 August 2026, the day this was published

The sale page now carries the same control the invoice page has always had, the failed state shows as a chip on the sale rather than being invisible, and an hourly sweep re-queues anything left stranded. Both halves were built rather than just the button, because the case that actually happens is not one sale somebody noticed — it is an outage during trading that strands every sale it touches, and nobody is going to click through three hundred of them. Organizations whose connector is disconnected are skipped and counted rather than hammered, and the run says so out loud. What this does not fix is the paragraph above it. Recovering a filing puts the fiscal number on the record; it does not put it on the paper a customer walked out with an hour ago.

Point-of-sale fiscal filing — what is and is not built

What AWRA OpsHub does today

  • A per-taxpayer, per-branch device registration with KRA, with the communication key held encrypted and a sandbox environment to prove the connection before going live.
  • Automatic filing of POS sales on completion, queued after commit so the counter is never blocked by the authority.
  • Per-document-type control — a tenant chooses whether invoices, POS sales or both file automatically.
  • The signed response stored on the sale — receipt number, receipt signature, internal data and QR payload, all persisted rather than discarded.
  • The fiscal block rendered on the receipt, including the QR drawn in vector, whenever the sale has been filed at the time the document is produced.
  • Filing is idempotent. A sale is never filed twice, whether the job runs once or is dispatched repeatedly.
  • A way out of a failed filing, since 12 August 2026 — a retry control on the sale, the failed state shown rather than hidden, and an hourly sweep that re-queues anything stranded. Organizations with no sendable connection are skipped and counted instead of being retried into the same wall.

What it does not do

  • No authority other than KRA. EFRIS, EFD/VFD and EBM are not implemented, and there is no abstraction that would let one be added as configuration rather than as a build.
  • No pre-authorisation path. Nothing in the design can hold a sale open until an authority responds, because the whole point of the current design is that it does not.
  • The fiscal reference is not on the printed receipt at the counter, because at that instant it does not exist yet.
  • No report of sales carrying no fiscal reference, which is the report you would want on the morning after an outage and — now that recovery exists — the clear next thing to build. A retry you have to know to run is not the same as being told.
  • No alert when filings start failing. The sweep recovers them; nothing tells anybody it had to.
  • No named document series and no series registered with an authority. The counter is private to each organization and to each year — that has been true since 6 August 2026 — but it cannot be declared in advance or registered anywhere.

What a buyer in the region should actually do

The useful move is not to ask whether a system supports your country. Every vendor says yes to that, and most of them are describing a filing pipeline while you are picturing a fiscal device. Ask the questions that have factual answers instead.

  • Under my regime, can a valid receipt exist before the authority has responded? Put this to your adviser before you put it to any vendor, because it decides which half of the market you are shopping in.
  • Show me a receipt printed while the connection to the authority is down. Not a screenshot of a settings page — a piece of paper.
  • Does the fiscal reference appear on the customer's copy at the moment of handover, or on a reprint afterwards?
  • What happens to a sale whose transmission fails permanently? Who finds out, on what screen, and what can they do about it?
  • Is there a daily report of sales carrying no fiscal reference, and can I see it on real data?
  • If I operate in two of these countries, is that one system or two? Ask which authority interfaces are implemented today, by name.

The last of those is the one that catches regional groups. A business with branches in Nairobi and Kampala is not running one compliance obligation with a country field on it. It is running two schemes, against two authorities, with two technical interfaces, and any vendor who describes that as a setting has not built either of them.

What we would build

The three that are specified, and the one that changes the architecture

Three of these are ordinary engineering against a published interface, and we would scope, price and timetable them like any other build. The fourth is not, and saying so is the point of putting them in the same list.

A second authority — EFRIS, EFD/VFD or EBM

Submission against URA's, TRA's or RRA's published interface, with the parts that get left out of demonstrations: retries, a failure queue somebody actually looks at, and a daily report of sales carrying no fiscal reference. Each is a separate build against a separate specification, and the honest way to price them is separately.

Being told, rather than having to look

Recovery for failed filings was the gap when this was written and it was closed on 12 August 2026 — a retry control, the failed state made visible, and an hourly sweep. What is still missing is the half that does not wait to be asked: a daily report of sales carrying no fiscal reference, and an alert when filings start failing rather than a sweep that quietly fixes them. A system that recovers silently and a system with no problem look identical from a desk.

Named series, declarable in advance

A document series you define and can register with an authority before use, with the returned code carried onto the document. The counter underneath is already the right shape — locked, per organization, per year — which shortens this considerably and changes nothing about the paragraph below.

Blocking fiscalisation — and what it would cost you

A path where a sale cannot complete until an authority or an approved device has authorised it. This is not a feature added to the current design; it inverts it. Everything that makes the till resilient to an outage today exists precisely because the fiscal step is not in the transaction. We would build it where a regime requires it, and we would want you to understand that you are buying a till that stops when the authority does, because that is what the regime is asking for.

What we will not do is tell you which of these your regime requires. That turns on your statute and your category of business, it has real consequences, and it belongs to your adviser rather than to a vendor with a commercial interest in the answer.

Talk to us about your authority

The verdict

We built a filing pipeline for one revenue authority, we built it well, and we built it on an assumption — that the sale is the business's act and the authority is told afterwards — which is correct in Kenya and is not a universal truth about East Africa. The consequence we had not written down is that the receipt a customer carries out of the shop does not yet carry the fiscal reference, because at that instant nobody has one. If your regime is happy with that, the design is right and the resilience is real. If your regime requires the number on the paper at handover, no vendor can configure their way there, and you need to be asking that question of your adviser before you ask it of anybody selling you software.

Bring us the scheme you are actually under

Name the authority and the scheme and we will tell you plainly whether it is built, whether it is a build we would quote, or whether it is a different shape of product than the one we sell. All three of those answers have been given on this site before.

Talk to us about fiscal filing

Help Center

Need a quick answer while you read?

Run inventory, procurement, assets, sales, and field work with approved AWRA guidance for setup, migration, integrations, security, pricing, and support.

Search all approved AWRA public help articles.

Open Help Center