A school knows roughly what it owns. It rarely knows it in one place.
There is a spreadsheet of laptops somebody keeps up to date, a different spreadsheet of projectors somebody used to, a drawer of warranty paperwork, a minibus logbook in the minibus, and an asset list the auditor asked for last year that was accurate on the day it was printed. None of them agree, and the one question anybody actually asks — where is the thing, and who has it — is the one none of them answer.
Inventory is one register for the whole school.
Two facts, not one
The design turns on something small. A register that stores one location per thing cannot answer "what is missing from Room 12", because it has quietly merged two different facts.
Where a thing belongs and who is holding it are independent. A laptop belongs to N21 and is signed out to a teacher; it is not missing, and it is not in N21. Merge those and you have to choose which lie to tell.
So the register keeps both, and shows both. Kit with no place recorded is not hidden or blanked — it sorts to the end and "show me everything unlocated" is one click. That matters more than it sounds: after a big delivery or a first import, most of the register is unlocated, and that is the correct state rather than a fault.
The estate is a tree, because buildings are
Site, building, floor, room, area, container. Six levels, each with a code like B1-204, a capacity, an icon and a photograph of the place itself.
The browsable view walks it — a site opens to its buildings, a building to its floors, a floor to its rooms, a room to the kit in it — and where you are is in the address bar, so Back walks you back up and a link to a room is a link you can send somebody.
Getting your existing spreadsheet in
Nobody starts from nothing. The importer takes a .csv or .xlsx through four screens: pick the file, confirm the column mapping, read a grouped report of exactly what will happen, then commit.
Two decisions in there are the ones that matter.
The first is what happens to a row you already have. Update it — the default — is what makes export, edit in Excel, re-import work as a round trip. The alternatives are leave it alone, or stop and tell me.
The second is what happens when rows fail. They do not stop the import: good rows land, bad rows do not, and you are told the split before you press the button. Then the failures come back as errors.csv — your rows, your headers, plus an _error column. You fix them in the spreadsheet you already had open and re-import, and nothing doubles, because the matching runs on Asset ID, then serial, then asset tag.
A row with nothing identifying it at all is the honest exception: it will import, and importing the same file twice will add it twice. The wizard says so on the screen rather than in a footnote.
Kit goes out and comes back
Custody is a loan with a date it is due back, or a permanent one-to-one assignment with no date at all. Extending a loan is counted, so "it was due in September and moved four times" survives on the record. Overdue loans chase themselves overnight and keep chasing weekly, with nothing to configure.
A permanent assignment is never chased, which is exactly why it must not carry a due-back date — otherwise every Year 7's own device is reported late, nightly, for five years.
The ledger outlives the asset. Name, tag and serial are captured when a thing goes out, so a laptop scrapped in April still names itself on its March row. You can delete an asset from the register; you cannot delete the fact that somebody had it.
Walking round with a phone
A stocktake is a walk. Scan or type a code, one tap to confirm, the field clears and refocuses. It is built for a Bluetooth wedge scanner or for typing off a label.
When something turns up in the wrong room you decide, on the spot, whether the register is corrected — relocated — or left for somebody with the context, which is misplaced. It is never silently corrected behind you. A scanned code that matches nothing is recorded as a discovery rather than thrown away as an error.
Nothing is stored as "missing". It is worked out live from when a thing was last seen, so a laptop that surfaces next week stops being missing on its own and nobody has to remember to clear a flag.
The minibus
Vehicles get their own treatment because a minibus is not a laptop. Signing one out records the odometer and the fuel — in eighths, the way a gauge actually reads — and a walk-round note, and opens a real custody period at the same time.
A defect reported at book-in becomes a dated maintenance job on the responsible department's schedule and moves the vehicle to in-repair. It does not become a sentence in a text box that nobody reads.
An odometer reading that goes backwards is stored and flagged rather than refused. A replaced instrument cluster and a mistyped digit are both real, and refusing the write loses the whole trip.
The money, and the two things "worth" means
Depreciation policy sits on the category rather than on each asset: straight line, reducing balance, or don't. A year-by-year schedule redraws while you type the rate, computed by the same engine the server posts with — so the preview cannot disagree with the books.
It will also tell you, before you commit, that 33% over three years does not actually reach zero, and then land it on zero anyway with a marked balancing charge.
Then there are two meanings of what something is worth, and every screen says which it is showing:
- Indicative — before your first month is posted. Computed from policy, and it moves whenever somebody edits a cost.
- Per the books — afterwards. Cost less posted depreciation, and it moves only when a month is posted.
Posting a month freezes it. Correcting a purchase date next term cannot restate a closed period behind your back. You can re-run a closed month, but it wants a reason in your own words, and it reverses the old rows rather than erasing them — both stay in the ledger, because "we restated March" is itself a fact.
A number is shown, withheld, or absent — never faked
Money is stripped on the server before it leaves, per row. Somebody without finance rights sees that a figure exists and is being withheld, rather than a plausible-looking blank.
The same rule holds for totals. A report that could not count everything shows no figure and says why, because a total that is really a floor is a wrong number rather than an approximate one. The fixed-asset movements note takes it furthest: if any month in the range was never posted, it refuses to produce and names them.
Limits
Places nest six deep and 500 are listed at once. The register pages 100 rows at a time. An import stops at 10,000 rows, and the uploaded file — encrypted at rest — is deleted after seven days, which also means errors.csv stops being downloadable after a week. Eight stocktakes can be open at once. A movements note covers thirty-six months at a time.
Nothing seeds default categories, and every asset needs one, so creating a few really is the first job.
Known gaps
Two, stated plainly.
Who looks after a thing is chosen when it is added and cannot be changed from the asset panel afterwards. Places can be reassigned; assets cannot yet.
And seeing money and editing an asset currently resolve to the same permission. A department manager who can edit their department's kit can also see what it cost. Those should be two rights and today they are one — we would rather name it than have you discover it.
Availability
Inventory is on Business organisation plans and above. Switching it off hides the sidebar entry, the homepage card and the page, and deletes nothing — turn it back on and the register is exactly as you left it.