Fiscalise Sage invoices to URA EFRIS, automatically
Raise the invoice in Sage as you already do. It is submitted to EFRIS, and the fiscal document number, verification code and QR code come back — ready to print on the document your customer receives. Nobody re-keys anything into the URA portal.
“Sage” is several different products
More than any other accounting brand, the name says less than people expect. Two businesses both running “Sage” can have almost nothing in common underneath. Which one you have decides how the invoice is read, so it is the first thing to establish — and it is usually answered in a single phone call.
Sage 50 and Pastel
The most common in Uganda by a distance, and desktop: the company data sits on a machine or a server in your office. A connector runs alongside it, reads invoices as they are posted and writes the EFRIS result back.
The machine holding the data has to be on when invoices are raised.
Sage 200 Evolution and Sage 300
Mid-market, usually on a SQL Server in your own building or in a data centre, and built to be extended. Invoices can be picked up as they are posted, and the fiscal details written back onto the document so the printed invoice carries them.
Multi-branch and multi-warehouse setups are ordinary here, which matters — see the numbering point below.
Sage X3 and Sage Business Cloud
Both expose web services, so the connection is made over the network with no software installed on anyone's desk. Business Cloud Accounting is authorised once and refreshes itself from then on; X3 is larger, and its integration is scoped alongside whoever maintains it.
This is the cleanest of the three routes where it is available to you.
If you are not sure which you have, the version line on the login screen or the Help → About window settles it, and we can tell from that alone what the work involves.
What comes across
EFRIS needs more than the invoice itself. These are read from Sage and kept in step.
Invoices
Fiscalised to EFRIS, with the fiscal document number, verification code and QR code returned for printing on the document.
Credit notes
Raised against the original invoice, which URA requires — a credit note detached from its invoice is rejected.
Inventory and service items
Registered with URA through the API as part of the integration, carrying their unit of measure and tax treatment. Nothing is keyed in by hand.
Stock movements
For goods: opening stock and subsequent movements, which URA requires before those goods can be invoiced. Services carry no stock.
Customer accounts
Buyer type and TIN where the sale is business-to-business, which changes what EFRIS requires on the document.
Tax treatment
Standard-rated, zero-rated, exempt and deemed VAT, plus excise duty where it applies — resolved from your own tax codes, whatever they are numbered.
Where Sage and EFRIS disagree
The connection is not the difficult part. Reconciling how the two systems think about a sale is, and it is where in-house attempts usually stall.
Your tax codes mean whatever your company decided they mean
Sage tax types are set up per company, so tax code 1 in your books and tax code 1 in the business next door can be entirely different things. EFRIS has one fixed set of tax categories and no interest in your numbering. The mapping between them is specific to your installation, has to be established once against your actual VAT return, and is the single most common reason a Sage integration produces invoices URA accepts but the accountant does not recognise.
An item valid in Sage can still be unknown to URA
A product has to exist in the EFRIS catalogue before an invoice can mention it, and its unit of measure must come from URA’s own list rather than whatever the inventory master calls it. Registration happens through the API — it is one of the first calls an integration makes — so this is handled, not typed in somewhere.
Goods need stock recorded before they can be sold
URA rejects an invoice for goods it holds no stock against, so opening stock and subsequent movements have to be reported. Services are not stocked and need none of this. Where Sage is running several warehouses, the stock URA holds is against the taxpayer rather than against your warehouse structure, so the two do not map one to one.
Rounding is computed twice, and both answers have to agree
Sage works out the tax on a document with its own rounding rules; EFRIS recomputes it and rejects the document if the figures do not reconcile. A cent of difference on a long invoice is a rejection with a code and no hint that rounding was the cause. The reconciliation has to be done deliberately rather than assumed.
Document numbers collide across companies and branches
EFRIS enforces uniqueness of the seller reference per taxpayer, across every till and every integration on that TIN. Sage numbers documents per company and per document type, so two branches numbering independently — routine in a multi-company Pastel or Evolution setup — will produce the same number twice, and the rejection reads as a duplicate submission.
Each of these is a rejection code we have already worked through. The error-code reference documents them, free to read, whether or not you ever work with us.
Two ways to do this
Most businesses want the first. Sage resellers and teams with their own developers usually want the second.
We set up the environment and everything your business needs to start issuing fiscalised invoices. You keep working in Sage exactly as before.
Talk to usSend invoices to our API as ordinary JSON and it handles the EFRIS protocol, the signing and the tax reconciliation — you stay on the Sage side of the problem, which is the side you know. Or licence the whole platform as source and run it on your own infrastructure.
efrisgateway.comSage and EFRIS — common questions
Can Sage connect to URA EFRIS?
Which version of Sage do I need?
Does it work with Sage Pastel?
Do I have to change how I raise invoices in Sage?
What happens when URA rejects an invoice?
Do I need to be a URA-accredited integrator to use this?
Running something else?
The EFRIS side is identical whatever you run. What changes is how the invoice leaves your system, so each has its own notes.
QuickBooks
Online and Desktop
Tally
TallyPrime and Tally.ERP 9
Odoo
Online, Odoo.sh, self-hosted
Zoho Books
Cloud, over the Zoho API
A custom ERP, an in-house system or a POS nobody has heard of is not a problem either — if it can produce an invoice, it can be connected. Tell us what you run.
