Evolve FM is now Zenith. We’ve brought the product under our company name. Same software, same team — new name as of September 1, 2026.
Zenith · Parts & Inventory

The part isn't consumed. It's in a van.

Almost every maintenance system can take stock off a shelf and has no way at all to put it back. What follows is a chain nobody watches: parts drawn and not used are recorded as used, consumption overstates, reorder points are set from the overstatement, and the room fills with something nobody is using at the rate the system believes. Zenith closes that loop — and every balance along the way is folded from one ledger, never stored beside it.

Bilingual EN / FR · Multi-site · WCAG 2.2 AA
One ledger
Balances are folded from the movements, never stored beside them
5 movements
Receipt, issue, transfer, return, adjustment — and none of them is ever edited or deleted
Blind counts
The expected quantity appears only after the counter has committed a number
EN · FR
Fully bilingual from the foundation, not a bolted-on translation
The model

Two registers, on purpose

The item master answers what a part is. The storerooms answer where it is and how many there are. Merging them is how an item master turns into a stock ledger with a name field — and how every picker, model page and purchase order ends up answering a question it never asked.

01

What a part is

Identity, type, the manufacturer's own number — which is what appears on the box and in a quote — hazard class, and whether the organization stocks it at all. It carries nothing about quantity on hand.

02

Two units and a number

Gaskets are bought by the box of fifty and issued one at a time. A single “unit” field forces somebody to pick which of those the number means, and whichever they pick, half the system is then wrong by a factor of fifty.

03

What fits what

Fitment lives on the part, once, with how many a model takes — and a separate flag for whether it is worth stocking. A bolt fits, and nobody holds one against this machine; those are different claims.

04

Where it is held

Main stores, a satellite room, an unstaffed crib, a truck, quarantine, consignment. A vehicle is a room — stock on a truck is real stock, and it is the stock most routinely forgotten.

05

Bins that read like a shelf

Unique within their room rather than globally, because every room has an A-01 and forcing global uniqueness invents prefixes nobody says out loud.

06

Scope where it bites

A storeroom is a room and a room is at a site, so somebody scoped to Victoria is never offered stock in Calgary — they cannot walk to it. The item master is deliberately not scoped: it belongs to the organization, not to a campus.

The ledger

There is one number, and it is folded from the rows

Storing a balance beside a movement log is the classic inventory bug: two records of the same fact, updated by different code paths, drifting apart until somebody does a count and finds the system claims eleven of something there are four of. Zenith stores no balance at all. On hand is a fold over the ledger, computed every time it is asked for.

  • Nothing is ever edited or deleted — a correction is another row, because a stock history somebody can quietly rewrite is not a history.
  • A transfer is two rows that sum to zero — conservation is structural: there is no separate total for the two halves to disagree with, so a transfer cannot lose or invent quantity.
  • An adjustment requires a reason — an unexplained correction is the single most useful thing to find when stock goes missing, and making it optional guarantees it is blank on exactly the rows somebody later needs to read.
  • The history reads backwards — because that is how anybody reads one: from “what just happened”, not from the day the room opened.
Available is not on hand

Fourteen on the shelf, twelve promised, two available

A system that answers “fourteen” will cheerfully let somebody walk off with them. Reservations are a separate claim rather than a movement, because nothing has moved — that is the whole point of a reservation, and modelling it as a movement would make the ledger lie about what is physically in the room.

  • Every question that matters is asked of available — the reorder check, the issue gate, the replenishment suggestion, and the number on a machine's own parts tab.
  • The same stock can't be promised twice — a reservation beyond what is available is refused at the moment it is made, not discovered later.
  • The counter gives you both numbers — “4 asked for, 2 available of 14 on hand” is a sentence somebody can act on. “Insufficient stock” is not.
  • What needs ordering needs both registers — the reorder point is a property of the item and the quantity is a property of the room, and neither can answer alone.
One rule, every counter

The item master refuses it, however much is on the shelf

Stock and permission are different questions, and the counter has to ask both. A solvent with no safety data sheet on file is refused at every counter in the organization — and duplicating that rule inside the storeroom would simply be a second place for it to be wrong.

  • A superseded part sends you somewhere — the refusal names the replacement and follows the chain to whatever is current, so a code printed in a five-year-old manual still leads to a shelf.
  • Obsolete and superseded are different statements — retiring a part with nothing to replace it must not send a storekeeper to a successor that does not exist.
  • The hazard is recorded even while the paperwork is missing — refusing to record it would mean the safest information could not be entered until the file caught up.
  • “Never stocked here” is not “run out” — one is a transfer and the other a purchase order. They lead different people to do different things, so they are different sentences.
The stock desk

Two ledgers, held next to each other

A work order records what it used. A storeroom records what left the shelf. They are the same event seen from two sides, written by two people at two times, and in most systems nothing anywhere holds them together — so they drift, and nobody finds out.

The arithmetic is the whole screen

What left, less what came back, less what was used

That is what somebody still has. Issued against a job, not given back, and not recorded as used: open work is somebody about to fit it, and finished work is a part in a toolbox — the older it is, the less likely anybody remembers.

  • Returns go back to the room they came from — the only answer that does not quietly move stock between sites while nobody is looking.
  • A return cannot exceed what went out — returning more than was drawn is not generosity, it is a receipt wearing a return's clothes, and it is how a storeroom silently gains stock nobody bought.
  • Issuing is against a job, never into the air — a movement with no reference is a number the storeroom can balance and nobody can explain.
  • What did this job take? — asked often enough to deserve its own door, rather than a filter somebody rewrites at every call site.
Counting

Told there should be twelve, people find twelve

A count sheet that shows the counter what the system expects is a count that confirms the system. So the expected quantity is not revealed until the line has been recorded — the counter writes down what is on the shelf, and only then sees whether the ledger agrees.

  • Variance is measured at posting, against the live ledger — freezing it when the sheet was raised would charge every mid-count issue to the variance, and the sheet would “find” losses that are sitting, correctly recorded, on this morning's work orders.
  • Posting writes adjustments, not edits — one row per disagreement, carrying the sheet's own number as the reason the ledger keeps for ever. A count that silently rewrote balances would be the one place stock changes with nothing to explain it.
  • One open count per room — two sheets counting the same shelf would each post the full variance, and the second would correct the correction. The refusal is structural, not procedural.
  • Zero balances are counted on purpose — “the system says none and the shelf has four” is the variance most worth finding.
Replenishment

The cheapest purchase order is the one never raised

A line appears when a room's available stock is at or below the item's reorder point. The suggested buy fills back up to the maximum, less what is already on an issued order heading for that room — a shortage already ordered must not be ordered twice — and it rounds up to whole purchase packs, because a vendor sells cases and “order 11.7 cases” is a number nobody can act on.

  • It looks across sites before it buys — if another room holds available stock, the honest suggestion is a transfer, and it is shown beside the buy rather than discovered afterwards.
  • Promised stock is never offered as surplus — another room's reservations are honoured before its shelves are offered to you.
  • Quarantine and closed rooms produce nothing — you cannot replenish a room whose stock could not satisfy a job in the first place.
  • A part whose policy nobody has written stays silent — no maximum and no reorder point means no line at all, rather than a number invented to fill the column.
Asked for, and on its way

A requisition and an order are two records

They answer to different people. A requisition is a maintenance question — “we need filters” — raised by whoever saw the shelf and approved by whoever owns the budget. An order is a commercial commitment to a named vendor with prices on it. Collapse them and either every storekeeper can commit the organization's money, or every purchase needs a buyer to notice a shelf — and every real plant has learned to want neither.

Ordering and receiving

You buy what the vendor sells

A case of six is ordered as one case, not as six units somebody hopes divide evenly. The item master owns the factor, and everything that projects an order into stock units converts through it — the same conversion, in the same place, as the receiving desk uses.

  • A decline needs a reason — “no” with no reason teaches people to stop asking, and the next shortage is discovered by the machine that needed the part.
  • “Partially received” is derived, not stored — a stored flag and a receipts log are two records of the same fact, and they would drift.
  • Over-receipt is refused at the door — the difference between a generous delivery and a wrong one is somebody checking, and stock the order cannot explain must arrive as its own receipt with its own paper.
  • Closing short is allowed, never silently — the outstanding quantity was a promise to a shelf, and whoever breaks it writes down why, where replenishment will see the gap again.
  • A delivery arrives by the same door as everything else — receiving writes the storeroom's own receipt, referenced to the order, so the balance, the movement history and the order agree because they are reading the same rows.
And the rest of it

Everything a shelf touches

Can we hand one over today?

A machine's own Parts tab: what fits, by way of its model, and the bold number is available at this site. A filter in another city is real stock and no help to somebody standing at the machine — so it is shown, as the second number.

Quarantine that can't be laundered

Received and not yet accepted. The stock is really there and really cannot satisfy a job — which is the only reason the room exists — and a transfer into main stores is refused rather than quietly allowed.

Truck stock is stock

A vehicle is a room. Stock on a truck is real and routinely forgotten, so it is counted, issued from, transferred and replenished like any other shelf.

A code from an old manual still works

Supersession chains are followed to whatever is current, and a loop is refused rather than walked — because two parts that replace each other is not a thing anybody means.

The storekeeper's morning page

One row per room: lines held, how many are below their line, and whether a count is in progress. It does not make the buying decision — it refuses to let a shortage hide.

Every room holding a part

One list, so “where else is there one?” has an answer instead of a phone call — with rooms you cannot issue from left out of the total rather than padding it.

Hazard classes you can query

A closed, short list rather than free text — because a free-text hazard field is one nobody can query, and “which of our stocked items are flammable?” stops being answerable on the day it matters.

Your words, everywhere

Rename Part, Storeroom or Bin and it changes what people read — never what a filter matches on.

Scoped where it counts

Storerooms are site-scoped because you cannot walk to Calgary. The item master is not, because scoping it would empty the picker for every site-scoped user — and an item is an item everywhere.

Enterprise foundations

A history nobody can quietly rewrite

Inventory is the module where small dishonesties compound fastest: one edited balance, one unexplained adjustment, one return that had nowhere to go, and a year later the numbers are decoration. Everything here is built so that cannot happen by accident.

Append-only by construction

Every movement is signed, dated, referenced and permanent. A correction is a new row with a reason on it, not an edit to an old one.

Derived, never stored twice

On hand, available, below-reorder and “partially received” are all computed from the rows underneath them, so no two screens can tell different stories.

Bilingual by birth

Full en-CA / fr-CA parity on every screen, hint, empty state and refusal — plurals handled properly, not by concatenation.

Accessible to everyone

WCAG 2.2 AA as a build rule: real tab semantics, states announced in words, and focus that moves to the field an error refers to.

Designed around ISO 55000 · Asset management EN 13306 · Maintenance terms Min / max replenishment WCAG 2.2 AA
Questions people actually ask

Before you book the demo

Does it value inventory?
Not yet, and we would rather say so than show you a number your finance team would have to re-derive. The item master carries a standard cost, and it is used to propose a pack price on a purchase order. There is no FIFO, no moving average and no inventory valuation report today. The ledger underneath is the right foundation for one — every movement is signed, dated, referenced and never edited — and the costing layer lands with the server phase.
Do you track serial numbers, lots and expiry dates?
Partly, and the honest line is worth drawing precisely. A part can be marked serialised, and a rotable must be — the register refuses one that isn't, on an edit as well as on a create. But there is no per-serial movement history and no lot, batch or expiry tracking today: issuing one of three serialised motors records a quantity, not which one. Both land on this same ledger with the server phase.
Is there barcode scanning?
Not in the product today. What is already there is the part a scanner needs: every movement is a validated command that refuses for a named reason, so a scanned issue and a typed issue would go through the same door and be refused the same way. The scanning surface itself is field-app work, alongside offline.
Why is “available” different from “on hand”?
Because fourteen on the shelf with twelve already promised to Friday's shutdown is two. A system that answers fourteen will let somebody take them, and the shutdown finds out on the Friday. Every gate in the module — the issue check, the reorder check, the replenishment suggestion, the number on a machine's parts tab — is asked of available, not of on hand.
Can we just correct a balance when it's wrong?
You can correct it, and the correction is another row with a reason on it. What you cannot do is edit or delete what is already there — a stock history somebody can quietly rewrite is not a history. An unexplained adjustment is the single most useful thing to find when stock goes missing, which is exactly why the reason is required rather than optional.
Is the count really blind?
Yes. A line shows nothing but the part until the counter has committed a number; the expected quantity and the variance appear only afterwards. Told there should be twelve, people find twelve — and the three that walked out uncounted stay uncounted for another quarter. The counter writes down what is on the shelf first, and the ledger answers second.
Can we count a room while it's still being used?
Yes, and that is normal rather than an error. Variance is measured at the moment of posting against the live ledger, so a part issued mid-count is not charged to the count. Freezing the expected quantity when the sheet was raised would make the sheet “find” losses that are sitting, correctly recorded, on this morning's work orders. Once posted, the numbers are frozen onto the sheet so the history stays legible.
What happens to stock of a part we've superseded?
It stays on the shelf and stays visible, because stock is a fact about a place and issuability is a decision about a part. What changes is the counter: the part can no longer be issued, and the refusal names its replacement rather than just saying no — following the chain to whatever is current, however many hops that takes.
Do you approve purchase orders?
Approval lives on the requisition today: submit, then approve or decline with a mandatory reason. There is no separate approval step on the purchase order itself and no spend-threshold routing — the gate between draft and issued is the vendor's own compliance, which is the same rule that governs giving them work. Order-level approval limits land with the server phase.
Do you do three-way matching?
No, and we will not claim it. What exists is order-to-receipt reconciliation: partial receipts accumulate against a line, over-receipt is refused outright, the display status is derived from the receipts rather than stored, and closing an order short requires a written reason. Invoices and matching are not in the product — that is finance territory and belongs to the integration, not to a maintenance system pretending.
How does replenishment decide what to order?
Min/max against a point-in-time balance: a line appears when available is at or below the reorder point, the suggestion fills back to the maximum, what is already on an issued order is subtracted, and the result rounds up to whole purchase packs. What it deliberately does not do: forecast demand, compute a consumption rate, apply an EOQ, model safety stock, or offset for lead time. Those are judgment calls, and it says so rather than dressing an assumption as arithmetic.
What happens to parts a technician takes and doesn't use?
They come back, to the room they came out of, and the ledger records a return rather than pretending they were consumed. That single missing movement is why so many storerooms slowly fill with something nobody is using: the parts sit in a van, get recorded as used, and inflate the usage figures the reorder points are then set from. The stock desk lists what is out and unaccounted for, by job, and gives it back.
See it on a shelf you already have

Bring the part you keep running out of.

Every storeroom has one — the filter that is always short in September, or the bearing the system swears there are eleven of. Give us its history and we'll show you what the ledger says, what the shelf says, and exactly where the gap between them was written.

Zenith · Parts & Inventory Part of the Zenith maintenance & asset operations platform

Standards are named by number, title and scope only. CSA and ULC publications are paywalled — read the standard itself before building a compliance programme on any summary.