AWRA OpsHub Search
Departments, locations & reason codes

Every record you will ever create gets filed against who, where and why.

Those three decisions are usually made in week one of an implementation, by whoever happened to be doing the setup, in about forty minutes. Two years later they are the reason a report can or cannot be produced — because every historical record is filed against them and refiling history is not a thing anybody does. This is the least glamorous hour of a rollout and by some distance the highest-leverage one.

WHO department cost centre WHERE warehouse location / bin WHY reason code One movement, expense or asset

Why this page exists

Reference data is the one part of a system that is genuinely hard to change later.

You can rewrite a workflow, replace a report, re-theme the interface and add a module. What you cannot easily do is retrospectively decide that the last two years of expenses should have been coded to eight departments rather than three, or that stock should have been tracked to bin level rather than to warehouse. The records exist. They carry the codes they were given. Nobody is going to open eleven thousand of them.

The three questions to answer before you load a single record.

How finely do you need to attribute cost? If the answer might ever be “by branch” or “by programme” or “by grant”, the department list has to reflect that from the beginning. Three departments called Admin, Operations and Sales will answer no question anybody eventually asks.

How precisely do you need to find things? A warehouse alone tells a picker which building. A location tells them which shelf. The difference is a working day per week in a store of any size, and it is decided by whether locations were set up at all.

What are the real reasons stock moves in your operation? Not the generic list — yours. “Issued to a programme”, “written off after flood damage”, “transferred to the clinic”. A reason code list that does not match how your organisation actually loses and gains stock produces a variance report nobody can act on.

Axis one — who

A department is a cost centre wearing a friendlier name.

It is deliberately one flexible concept rather than several rigid ones, because organisations mean different things by it: a team, a branch, a division, a site, a programme, a funded project. Whatever you mean, it is the thing you will eventually want a total by — and it is carried on sixteen different record types so that total is available everywhere rather than in one module.

Users A person belongs to a department, which is how activity and cost attach to a team by default.
Employees The HR record's department, separate from the user's, because an employee may not have a login.
Asset custodians The department a custodian is attached to, so custody rolls up to a team.
Assets The department currently responsible for an asset — where it sits on the balance sheet of accountability.
Asset movements Both ends: the department it left and the department it reached. A transfer between teams is two facts, not one.
Pooled asset balances A quantity held by a department rather than by an individual — the shared projector, the site compactor.
Pooled asset movements From-department and to-department on every quantity that moves, for the same reason as individual movements.
Procurement RFQs Which department is sourcing, so spend under negotiation is attributable before it becomes an order.
Purchase orders The committed spend, coded to the team that committed it. This is the one finance asks for first.
Budgets A budget belongs to a department, which is what makes budget-versus-actual a comparison rather than two lists.
Projects The delivering department, so project cost and departmental cost reconcile rather than double-count.
Workflow tasks The team a piece of automated or assigned work belongs to, for load and throughput by department.
Helpdesk tickets Which department owns the ticket — the basis of a queue rather than a single shared inbox.
Ticket categories A default department per category, so routing is a property of the category rather than a decision per ticket.
Departments themselves Name and description, with a default one seeded so nothing is ever unattributed on day one.
Everything above, reportably Headcount by department, spend by department, custody by department, tickets by department — one dimension, many questions.

One honest note on granularity. A department here is a flat list rather than a tree — there is no parent-child hierarchy, so “East Region → Kisumu → Stores” is three departments rather than one path. In practice most organisations encode the hierarchy in the naming and get what they need; if you genuinely need to roll a total up through several levels, say so early, because that is a structural conversation rather than a setting.

Axis two — where

Two levels, and the second one is the one people skip and then regret.

A warehouse says which building. A location says which shelf. Almost every implementation sets up warehouses immediately and puts locations off until later — and later never arrives, because by then there are twelve thousand stock rows with no location on them and adding the level means a physical exercise nobody has time for.

warehouse

The site

A name, a stable code, an address, a manager and a status. The code is the important field: it is what the import templates reference, what appears on transfer documents, and what other records point at. Short and permanent beats descriptive and changeable, because five other things will reference it.

location

The position inside it

A location belongs to a warehouse and carries a name and a code of its own — plus a structured placement: zone, aisle, bay, shelf and bin. Those five are separate fields rather than a free-text string, which is what lets a location print as “Zone A / Aisle 4 / Bay 2 / Shelf 3” and be sorted, filtered and reported on rather than merely displayed.

pick_sequence

The order somebody walks in

A number per location, which is the difference between a picking list that follows the aisle and one that sends a person back and forth across the store. It is one integer and it is the single highest-value field on this page for anywhere with more than a few hundred lines.

capacity

What will actually fit

Optional, and worth filling in if you intend to make slotting decisions. A location with a capacity is a location a system can reason about; one without is a label.

Eight storage roles

A location also declares what it is for. This is not decoration: a receiving bay and a quarantine shelf hold stock under completely different assumptions, and a system that cannot tell them apart cannot stop somebody picking from quarantine.

Pick face pick_face Where picking actually happens. The fast-moving front line of the store.
Bulk storage bulk Pallets and volume, replenishing the pick faces rather than being picked from directly.
Reserve storage reserve Held back deliberately — safety stock, seasonal, allocated.
Staging staging Assembled and waiting to move. Neither properly in nor properly out.
Receiving receiving Where a delivery lands before it is put away. Stock here is present and not yet placed.
Shipping shipping The other end: picked, packed and about to leave.
Quarantine quarantine Held back on purpose — damaged, expired, disputed, awaiting a decision. The role that most needs to be distinguishable.
General bin bin The default, and an honest one. Not everything in a store has a designed purpose.

Axis three — why

A stock movement without a reason is a number that changed.

Twenty-five reason codes ship with the product — ten for stock coming in, fifteen for stock going out — and they exist so that a quantity change carries its own explanation. A default is resolved per movement type, so nothing is ever recorded unexplained, and the list is yours to add to, rename and prune.

And one of the fields on a reason code deserves its own paragraph, because it is a checkbox on a reference record that has an accounting consequence. Read the right-hand column below.

Reason
What it records
Revenue
Stock coming in — 10 shipped
Purchase for Resale

Bought to sell on. The commonest inbound reason in a trading business, and the one that makes cost of sales meaningful.

no
Purchase for Internal Use

Bought to consume. Distinguished from resale because they land in different places in your accounts.

no
Donation Received

Stock arriving without a purchase. Essential for donor-funded work, where in-kind receipts have to be reportable separately.

no
Grant or Government Supplies

Stock from a grant or a government programme, which usually carries its own reporting obligation.

no
Approved Quotation

Received against a procurement decision, linking the movement back to the sourcing chain.

no
Consignment Received

On your shelf, not yet yours. A distinction that matters enormously at a valuation.

no
Production Output

Finished goods you made rather than bought — the output side of a job.

no
Customer Returns / Exchanges

Coming back from a customer, which is a different event from a purchase and should never be counted as one.

no
Inventory Revaluation

A correction for price or valuation rather than a physical movement.

no
Stock going out — 15 shipped, and two of them post revenue
Sale

Sold to a customer. Carries the revenue flag, which is what makes a check-out post as a sale rather than as a consumption.

posts revenue
Paid Checkout

Issued against a paid service or project. Also carries the revenue flag, for work billed rather than goods sold.

posts revenue
The other thirteen

Issues to internal use, to programmes, to projects, write-offs, damage, expiry, theft, transfers and returns to supplier — all of which reduce stock without producing revenue, and each of which is separately reportable.

no

The flag, stated plainly

A reason code carries a generates revenue setting. When a check-out is recorded against a reason that has it, the movement is treated as revenue-producing rather than as internal consumption. Two of the twenty-five shipped reasons carry it: Sale and Paid Checkout.

Why that is worth a paragraph

Because it means a checkbox on a settings screen has an accounting consequence, and somebody who duplicates “Sale” as “Sale (retail)” without ticking it has created a reason that looks like a sale and does not post like one. It is exactly the kind of thing to know before you edit the list rather than after.

Reasons are matched by name

The movement stores the reason as text, and the flag is resolved by looking the name up. That makes the historical record readable without a join — and it means renaming a reason in the settings screen does not rewrite what past movements say they were, which is usually the behaviour you want and always worth knowing.

All three at once

The questions you can only answer if all three axes were set up.

None of these is a clever report. Each is an intersection — and each is impossible if one of the three dimensions is missing from the records, which is why the setup hour matters more than any dashboard.

Write-offs by department, this quarter

Reason code says written off, department says whose stock it was, date says when. If the reason list has one generic "adjustment" entry, this report cannot exist.

Everything sitting in quarantine, across four sites

Storage role says quarantine, warehouse says which site. Without the role, quarantined stock is indistinguishable from available stock in the same building.

Donated stock issued to programmes, for a donor report

Reason in, reason out, and the department that received it. Three fields, one report, and the difference between a donor file that assembles itself and a fortnight of reconstruction.

Budget versus actual, per team

A budget belongs to a department and so does the spend. Without the department on both, this is two lists somebody compares by eye.

A picking list that follows the aisle

Pick sequence per location, and locations that exist at all. The saving is measured in hours per week and it is one integer per shelf.

Which reasons account for your shrinkage

Damage, expiry, theft and miscount are four different problems with four different fixes. Filed under one reason they are one unactionable total.

The straight answer

Three flat lists, done properly. Not a master data management product.

The value here is that the dimensions exist on the right records and are used consistently. What they are not is a hierarchy engine.

What changes

Reports you did not plan for turn out to be possible.

That is the whole return on the setup hour. Two years in, somebody asks a question nobody anticipated — spend by branch, write-offs by cause, everything sitting in quarantine — and the answer is a filter rather than a project, because the records were filed properly when they were created.

Spend has an owner

One department dimension on sixteen record types, so every total can be taken by team.

Stock has an address

Zone, aisle, bay, shelf and bin as separate fields, sortable and reportable rather than a text note.

Pickers walk in order

One integer per location, and a picking list that follows the aisle instead of the database.

Held stock is distinguishable

Eight storage roles, so quarantine is not just another shelf in the same building.

Movements explain themselves

Twenty-five reasons, a resolved default, and nothing recorded as an unexplained number.

Shrinkage becomes actionable

Damage, expiry, theft and miscount as four separate reasons rather than one total nobody can fix.

'What is the difference between a warehouse and a location?', 'a' => 'A warehouse says which building; a location says which shelf. A warehouse carries a name, a stable code, an address, a manager and a status — the code being the important field, because import templates, transfer documents and other records all reference it. A location belongs to a warehouse and carries its own name and code plus a structured placement across five separate fields: zone, aisle, bay, shelf and bin. Those being five fields rather than one free-text string is what lets a position be sorted, filtered and reported on rather than merely displayed.'], ['q' => 'Why does the pick sequence matter?', 'a' => 'It is one integer per location and it decides whether a picking list follows the walking order of the store or the order the records happened to be created in. In a store of any real size that difference is measured in hours per week. It is the highest-value field on a location and the one most often left empty.'], ['q' => 'What are storage roles for?', 'a' => 'A location declares what it is for, from eight roles: pick face, bulk storage, reserve storage, staging, receiving, shipping, quarantine and general bin. This is not decoration — a receiving bay and a quarantine shelf hold stock under completely different assumptions, and a system that cannot tell them apart cannot distinguish stock that is present from stock that is available. Quarantine is the role that most needs to be distinguishable, and "general bin" is the honest default because not everything in a store has a designed purpose.'], ['q' => 'How many reason codes ship, and can we change them?', 'a' => 'Twenty-five: ten for stock coming in and fifteen for stock going out. Inbound covers purchase for resale, purchase for internal use, donation, grant or government supplies, receipt against an approved quotation, consignment, production output, customer returns and revaluation. Outbound covers sale, paid checkout, internal issues, write-offs, damage, expiry, theft, transfers and returns to supplier. The list is yours to add to, rename and prune, and a default is resolved per movement type so a movement is never recorded with no explanation at all.'], ['q' => 'What does the revenue flag on a reason code do?', 'a' => 'It decides whether a check-out is treated as revenue-producing rather than as internal consumption. Two of the twenty-five shipped reasons carry it: Sale and Paid Checkout. This is worth knowing explicitly because it means a checkbox on a settings screen has an accounting consequence — somebody who duplicates "Sale" as "Sale (retail)" without ticking the flag has created a reason that looks like a sale and does not post like one. Better to know that before you edit the list than after a month-end.'], ['q' => 'If we rename a reason code, what happens to past movements?', 'a' => 'They keep saying what they said. A movement stores its reason as text and the revenue flag is resolved by looking the name up, so the historical record stays readable without a join and a rename in the settings screen does not silently restate history. That is usually the behaviour you want, and it is always worth knowing — if you do want history restated, that is a deliberate exercise with a plan attached rather than a side effect of an edit.'], ]" />

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