Units of measure
Route: /org/inventory/uom · Module: org_inv_uom — 7 permissions
Permission to view: View unit of measures
1. What a unit of measure is
The counting basis for everything else in Inventory. A raw material is 60 kilograms; a variation is 6 pieces; a recipe consumes 0.03 litres.
Units are the first thing to configure on a new tenant, because a raw material cannot be saved without one.
| Unit of measure | Product attribute | |
|---|---|---|
| Answers | How is this counted? | Which version is this? |
| Example | KG, PCS, LT | Spice Level: Hot |
| Appears on | Raw materials, variations, ledger rows | Variations only |
| Customer sees it | Indirectly, as "6 Pieces" | Yes, as the variation selector |
2. How units spread through the application
| Where it appears | As |
|---|---|
| Raw material master | The material's counting unit — required |
| Product variation | The variation's unit, shown as 6 Pieces |
| Bill of materials | The unit each ingredient quantity is expressed in |
| Goods receipts, production, sales | Inherited from the material or variation, never chosen again |
| Ledger | The 12 PCS / 1.2 KG in the Movement column |
No operations screen asks you to pick a unit. They all read it from the material or variation. This is why getting units right at setup matters more than it looks.
3. Step by step
Step 1 · Fill the list
A new tenant is not empty. Three controls populate it:
| Control | What it does | Permission |
|---|---|---|
| Seed defaults | Inserts the standard unit set (KG, G, LT, ML, PCS, DOZ…) | uom.create |
| Discover | Scans existing data for units in use but not defined, and adds them | uom.create |
| AI Suggestions | Proposes units from a description of your business | uom.createwithai |
Discover is the one people miss. If a tenant was populated by import or by API, it can be using unit codes that were never formally created; Discover finds them.
Step 2 · Create a unit
New UOM opens a right-hand drawer with three things: a code, a language selector, and a name/description pair per language.
The code is the short form shown everywhere else — KG, PCS. It is what appears in the ledger
and on variation labels, so keep it short and conventional.
The name and description are per-language and only ever shown on this screen.
The create drawer exposes a wide language set — AR, AS, BN, DE, EN, ES and more. The list screen's Language Context switch offers only Bengali, English and Hindi.
You can therefore enter a German name that no screen in the module will ever display. Fill the languages your Language Context actually offers.
Step 3 · Manage the unit over its life
| Action | Icon | Permission | Effect |
|---|---|---|---|
| Translate | globe | uom.edit | Opens the per-language name/description editor |
| Edit | pencil | uom.edit | Changes the code, name or description |
| Deactivate / Activate | crossed bell | uom.deactivate | Flips Active ↔ Inactive |
| Delete | red bin | uom.delete | Soft-deletes the unit |
uom.deactivate is a lifecycle action — the unit stays, but stops being offered for new records.
uom.delete removes it. A stock controller usually needs the first and not the second.
4. Field reference
| Field | Type | Required | Notes |
|---|---|---|---|
| UOM Code | text | ✅ | The short form used across the module. Uppercase by convention |
| Language | tab strip | — | Selects which language the fields below edit |
| Name | text | ✅ | Per language |
| Description | textarea | — | Per language; shown only on this list |
| Status | derived | — | Active / Inactive, set by the deactivate action, not editable in the drawer |
Language Context
The switch does not translate anything. It selects which stored translation is displayed. A unit with no Bengali name shows blank in Bengali — the same row an English operator sees as fully populated.
5. The admin contract
| Must be true | Or else |
|---|---|
| At least one unit exists | Raw materials and variations cannot be saved |
The unit is Active | It is not offered in new-record dropdowns |
The operator holds uom.view | The screen does not appear in the menu |
6. Downstream — what changes when this changes
| Change | Effect |
|---|---|
| Rename a unit | Display changes everywhere immediately; historic ledger rows show the new name |
| Change the code | The code is what the ledger and variation labels show — expect historic rows to read differently |
| Deactivate | Existing records keep it; new records cannot select it |
| Delete | Soft delete. Records already pointing at it are unaffected |
7. Don't confuse this with…
| Product attributes | Options a customer chooses between — not a counting basis |
| Variations | The sellable row. It has a unit; it is not one |
| Tax categories | Also a per-product classification, but owned by Finance |
8. Troubleshooting
| Symptom | Cause |
|---|---|
| The unit list is empty | No project selected in the Platform Context chip |
| A unit is missing from a dropdown | It is Inactive, or soft-deleted |
| Names look blank | Language Context is on a language with no stored translation |
| A German name never appears | The list only renders Bengali, English and Hindi — see §3 |
| Seed defaults does nothing visible | The defaults already exist; it does not duplicate them |