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, counted in stock units, and worth filling in where space is tight. A location with a capacity shows how full it is, and raises an Ops Center alert when it goes over; 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.

Now on every journal line

The axes reach the ledger: department, branch and project on the posting itself.

A journal line can carry a department, a branch and a project. On the ledger a branch is a warehouse — the same record the “where” axis already defines — so the codes you set up for stock are the codes your profit is reported by. The income statement then takes a date range and breaks itself down by any one of the three, with an Unassigned column for whatever carried no tag, so a breakdown never claims to explain more of the result than the tags actually cover.

Petty cash voucher · PCV-0418KES
Dr Fuel & Transport
Programmes Kilifi field office WASH Kilifi
4,600.00
Cr Petty Cash — Kilifi float
Programmes Kilifi field office WASH Kilifi
4,600.00
Nobody typed those tags on the ledger. The voucher carried its department and project, the float carried its branch, and the posting copied all three onto both legs.
PostingDepartmentBranchProject
Manual journalChosen per line by the person posting it✓✓✓
Petty cash voucherDepartment and project from the voucher, branch from the float✓✓✓
Staff advanceIssue, retirement and write-off, per expense line where given✓—✓
Stock movementFrom the adjustment that moved the stock—✓✓
Invoice revenue and expensesFrom the invoice or expense record——✓
DepreciationThe warehouse the asset currently sits in—✓—
Till sales, payroll, payments, supplier billsPosted untagged today, so they land in Unassigned———

The balance sheet deliberately takes an as-at date and no dimension. It balances only if every leg of every entry carries the same tag, and a manual journal is free to tag its lines differently — so a “balance sheet for one project” would be a number that looks finished and does not add up.

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.

Coding dimensions — what is real

What AWRA OpsHub does today

  • Departments as a single flexible cost-centre concept, carried on sixteen record types — users, employees, asset custodians, assets, asset movements at both ends, pooled balances, pooled movements at both ends, RFQs, purchase orders, budgets, projects, workflow tasks, tickets and ticket categories.
  • A default department seeded, so no record is unattributed on day one and nothing has to be coded to nothing.
  • Warehouses with a stable code, a name, an address, a manager and a status — the code being what import templates and transfer documents reference.
  • Locations inside a warehouse with their own name and code, plus structured placement across five separate fields: zone, aisle, bay, shelf and bin.
  • A pick sequence per location, so a picking list can follow the walking order of the store rather than the order records were created.
  • An optional capacity per location, counted in stock units, with a percentage full on the location list and an over-capacity Smart Alert that warns rather than refuses.
  • Eight storage roles — pick face, bulk, reserve, staging, receiving, shipping, quarantine and general bin — so a system can tell held-back stock from available stock in the same building.
  • Twenty-five shipped reason codes, ten inbound and fifteen outbound, covering purchase, donation, grant, consignment, production, returns and revaluation on the way in, and sale, internal issue, write-off, damage, expiry, theft and transfer on the way out.
  • A default reason resolved per movement type, so a movement is never recorded with no explanation at all.
  • A revenue flag on a reason code, carried by Sale and Paid Checkout, which decides whether a check-out is treated as revenue-producing or as consumption.
  • Reasons stored by name on the movement, so historical records stay readable and renaming a reason does not rewrite what past movements say.
  • Warehouses and locations loadable by import, in that order, joined by the warehouse code.
  • Departments, reasons and locations all in global search and the command palette, findable by name or alias rather than by knowing which settings screen they live on.
  • Department, branch and project on a journal line — chosen per line on a manual journal, and copied from the source record on stock movements, invoices, expenses, petty cash, staff advances and depreciation.
  • An income statement broken down by department, branch or project for any date range, with an Unassigned column for postings that carry no tag, on the web and over the API.

More we can add to your workspace

  • A department hierarchy, so a region containing branches containing teams rolls a total up through several levels rather than being encoded in the naming.
  • Separate cost-centre and department concepts, for organisations where the reporting structure and the management structure genuinely differ.
  • Reason codes mapped directly to specific ledger accounts, so a write-off reason posts to the write-off account without an intermediate rule.
  • Reason codes scoped per module or per warehouse, so a store's outbound list can differ from a clinic's.
  • Approval on a reason code, requiring a second person before a high-consequence reason such as theft or write-off can be used.
  • A location capacity in volume or weight, and a capacity-aware put-away suggestion, beyond today’s count of stock units and its warning.
  • Zone-level and aisle-level records in their own right, rather than as fields on a location.
  • A reference-data health report — departments with no records against them, locations never used, reasons nobody has selected in a year.
  • Dimension tags on till sales, payroll, payments and supplier bills, so the Unassigned column of a breakdown shrinks to what is genuinely shared cost.
  • Budget-versus-actual by project from the ledger, setting a project budget beside the postings tagged to it.
  • Bulk recoding, moving a set of historical records from one department or reason to another with a reviewable plan.

Where we point you to a specialist

  • We will not silently recode your history when you rename something. A movement stores its reason as text, so past records keep saying what they said. If you want history restated, that is a deliberate exercise with a plan attached, not a side effect of an edit.
  • We will not hide that a reason-code checkbox has an accounting consequence. The revenue flag decides whether a check-out posts as a sale. Somebody duplicating “Sale” without ticking it has made a reason that looks right and behaves differently, and that is worth knowing before you edit the list rather than after a month-end.
  • We will not pretend a flat department list is a hierarchy. Most organisations encode the levels in the naming and get what they need. If you genuinely need multi-level roll-up, that is a structural conversation to have before you load data rather than a setting to switch on afterwards.
  • We will not design your chart of accounts or your cost centre structure for you. We will tell you plainly which dimensions the system carries and where they appear, and we will press you to decide the granularity before you load records — because that is the decision that is genuinely expensive to revisit.

A department hierarchy with roll-up totals is the item in that middle column that most changes reporting for a multi-site organisation, and reason-code-to-account mapping is the one that most changes month-end. Both are best scoped before you load data rather than after. Tell us how your organisation actually reports and we will come back with a written spec, a timeline and a price.

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.

Frequently asked questions

What is a department used for?
It is a single flexible cost-centre concept — organisations use it for a team, a branch, a division, a site, a programme or a funded project. Whatever you mean by it, it is the dimension you will eventually want a total by, and it is carried on sixteen record types so that total is available across modules rather than in one: users, employees, asset custodians, assets, asset movements at both ends, pooled asset balances, pooled movements at both ends, RFQs, purchase orders, budgets, projects, workflow tasks, helpdesk tickets and ticket categories. A default department is seeded so no record is ever unattributed on day one.
Can I see profit by department, branch or project?
Yes. A journal line can carry a department, a branch and a project, and the income statement breaks down by any one of them for any date range. A manual journal is tagged line by line; automatic postings copy the tags their source record knows — a stock movement its warehouse and project, an invoice or expense its project, a petty cash voucher its department, project and the float’s branch, a staff advance its department and project, and depreciation the branch the asset sits in. Till sales, payroll, payments and supplier bills post untagged today, and anything untagged is shown in an Unassigned column rather than left out, so the breakdown never overstates what each tag explains. The balance sheet takes an as-at date only, because a balance sheet filtered by a tag balances only if every leg of every entry carries the same one.
Do departments support a hierarchy?
No — it is a flat list. “East Region, Kisumu, Stores” is three departments rather than one path, and most organisations encode the levels in the naming and get what they need from it. If you genuinely need a total to roll up through several levels, that is a structural conversation worth having before you load data rather than a setting to discover you are missing afterwards, because refiling historical records against a new structure is not something anybody does at volume.
What is the difference between a warehouse and a location?
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.
Why does the pick sequence matter?
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.
What are storage roles for?
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.
How many reason codes ship, and can we change them?
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.
What does the revenue flag on a reason code do?
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.
If we rename a reason code, what happens to past movements?
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