Goods Registration
Before any item can be sold or stocked, it must be registered with EFRIS. Registration tells URA what you sell, how it is measured, how it is taxed, and how it is packaged. Every scenario below uses the same endpoint:
Each good carries its name, your own SKU, its unit of measure, price, currency, commodity classification, and whether it attracts excise duty or uses piece or customs units.
A. Standard good
The simplest case: no piece unit, no excise duty, no customs unit.
{
"goods": [
{
"goodsName": "Premium Water 500ml",
"goodsCode": "SKU-BOTTLE-01",
"unitPrice": "100000",
"stockPrewarning": "10",
...
}
]
}
Want a working example of goods registration? Chat with our team
B. Piece (multi-unit) packaging
EFRIS uses scaling to handle bulk vs retail units - for example a crate that contains 24 bottles. The good is registered in its outer unit, together with the inner unit, its price, and how many inner units fit in one outer unit.
{
"goods": [
{
"goodsName": "Premium Water Crate (24x500ml)",
"goodsCode": "SKU-CRATE-01",
"unitPrice": "2400000",
"pieceUnitPrice": "100000",
"pieceScaledValue": "24",
...
}
]
}
Want a working example of piece packaging registration? Chat with our team
C. Percentage-based excise duty
Items that attract excise duty are registered with the official URA excise duty code that applies to them (see the excise duty lookup). Percentage-rated duties, such as beer, are the simpler case.
{
"goods": [
{
"goodsName": "Bell Lager 500ml",
"goodsCode": "BELL-500",
"unitPrice": "4720",
"description": "Lager beer, 500ml bottle",
...
}
]
}
Want a working example of excise duty goods registration? Chat with our team
D. Unit-based excise duty
Some excise duties are charged per unit of measurement - for example mineral water at
UGX 150 per Litre. These goods need their packaging described in the same unit the duty is charged
in, so URA can calculate the duty correctly.
{
"goods": [
{
"goodsName": "Mineral Water 1L",
"goodsCode": "WATER-LITRE",
"unitPrice": "2000",
"pieceUnitPrice": "2000",
...
}
]
}
Want a working example of unit-based excise duty registration? Chat with our team
E. Registering services
Services are registered the same way as goods. They carry no stock, so no low-stock alert is needed.
{
"goods": [
{
"goodsName": "Consulting Services",
"goodsCode": "SVC-CONSULT-01",
"unitPrice": "5000000",
"stockPrewarning": "0",
...
}
]
}
Want a working example of service registration? Chat with our team
F. Additional selling units
The same good can be sold in more than one unit - for example by the carton and by the single piece. Each additional unit has its own price and its ratio to the main unit.
{
"goodsOtherUnits": [
{
"otherPrice": "1000",
"otherScaled": "10",
"packageScaled": "1",
...
}
],
...
}
Want a working example of additional selling units? Chat with our team
G. Customs units (exporters)
Exported goods can also carry a customs unit of measure, along with its price and scaling.
{
"commodityGoodsExtendEntity": {
"customsUnitPrice": "4",
"customsScaledValue": "2.5",
...
},
...
}
Want a working example of customs unit registration? Chat with our team
Goods with more than one customs unit are supported too.
H. Modifying existing goods
Registered goods can be updated through the same endpoint, identified by the same goodsCode.
What comes next
Once a good is registered, load its opening stock before selling it - see
Stock Management. When it appears on an invoice, the
itemCode must match the registered goodsCode exactly - see
Fiscal Invoices.
Sign in to the dashboard · Get started