The Fridge Has No Calendar
The vaccine fridge in a branch pharmacy has a laminated card taped to its door with a hand-written date on it. Our asset register can tell you who holds that fridge, which room it stands in, what condition it was in at the last hand-off and the exact minute somebody last laid eyes on it. It cannot tell you what is written on the card, and the reason is worth understanding before you buy anything.
Every pharmacy that stores anything cold has the same two records, and they live about a metre apart. One is the fridge itself — a serial number, a purchase invoice somewhere in a file, a plug in a wall. The other is a laminated card taped to the door, with a service engineer's phone number and a date in biro. The card is the calendar. The fridge is the asset. Software that manages one of those and quietly implies it manages the other is the single most common way a cold-chain requirement gets mis-bought.
Our asset register manages the fridge. It manages it properly: who has it, where it is, what state it was in when it changed hands, when it was last physically verified and by whom, with the location and the person's name attached to a dated row that cannot be quietly edited away. For a pharmacy chain that has lost track of which branch has which nebuliser, that is the whole problem solved.
It does not manage the card. There is no service interval on an asset, no next-service date, no calibration date, and nothing anywhere in the product that watches a date approach and tells somebody. That is a real boundary, it is easy to state, and this post states it — along with the more interesting fact underneath it, which is that the machinery for watching a date arrive is built and running in this product. It is simply not connected to assets. Knowing that changes what the gap costs you to work around, and it changes what you should ask for.
What the register is actually for
An asset register answers custody questions. Every one of them is in the past or the present tense, and the register answers all of them from something it stored at the time rather than by inference.
| The question | What the register holds | How it gets there |
|---|---|---|
| Who has this machine? | A current custodian on the asset | Set by every check-out, transfer and hand-back |
| Where is it? | A current location and warehouse | Set by relocation and transfer movements |
| What state was it in? | A condition on the asset, and the condition before and after on each movement | Captured at each hand-over, dated and attributed |
| When did somebody last check? | The date of the last verification, and who performed it | Written the moment a verification is recorded |
| Is it out past its return date? | An expected return date, compared with today | Surfaced in Asset Watch and the asset reports |
| Is it lost, damaged or retired? | A status, plus a retirement date and a reason | Set by the corresponding movement |
The verification action is the one worth dwelling on, because it is the closest thing the register has to a recurring discipline. Recording a verification stamps the moment it happened and the user who did it, optionally captures GPS coordinates if your settings require them for verification, and lays down a dated movement row alongside the ones for transfers and hand-backs. The asset reports count how many assets were verified in the last thirty days. The insights widget flags any asset whose last verification is older than a hundred and eighty days, or which has never been verified at all.
That is a genuine control. If you want a monthly walk-round where a pharmacy technician scans every fridge, freezer, cold box and thermometer in the branch and the system holds a dated, attributed record of the walk, that works today and it works well.
Verification asks a different question from service
A verification says: this machine exists, it is here, this person saw it, and it looked like this. It does not say the machine is working correctly, that it holds temperature, or that a qualified engineer has certified it. Those are separate claims, and the register does not carry any of them.
The one date that looks forward, and what it is about
There is exactly one forward-looking date on an asset, and the product does watch it: the date the warranty expires. It is a field on the asset form, it shows on the asset detail screen, and the Asset Watch insight counts every non-retired asset whose warranty expires within the next sixty days and puts that number in front of you.
So the register is not blind to the future. It looks forward once, sixty days out, about one thing. And that one thing is a commercial fact, not a clinical one.
A warranty date tells you who pays for the repair. It does not tell you the machine needs one.
This distinction matters more in a pharmacy than almost anywhere else. A fridge under warranty that has not been serviced in two years is a compliance problem and a stock-loss risk. A fridge out of warranty that was calibrated last month is fine. The date the product watches is the one that answers neither question. It is a useful date — knowing your warranties are lapsing is worth something — but if you read the sixty-day warning as a maintenance prompt, you will be reading it wrong.
The status that leaves no trail
An asset can be marked as being in maintenance. Asset::STATUS_MAINTENANCE is a real status, it is one of the values an asset can hold, and the insights widget counts how many of your assets are sitting in it right now. So far so reasonable.
Here is the part to understand. Every other significant thing that happens to an asset happens through a movement — a dated, attributed row that says what action occurred, who performed it, what changed, and optionally where they were standing. Check-out, check-in, transfer, relocation, verification, marked-lost, marked-damaged, retirement. Each writes a row. Together they are the asset's history, and it is the history, not the current status, that survives an audit.
Maintenance does not work that way. Two movement actions for it are declared in the code — one for sending an asset out to maintenance, one for it returning — and nothing in the application writes either of them. There is no service, no controller and no job that records them. The only way to put an asset into the maintenance status is to edit the asset, and editing an asset records no movement.
A fridge goes out for repair on the 4th and comes back on the 19th. Here is the entire record.
Downtime cannot be derived from the log, because the log has nothing in it. If you need to answer "how many days was this unit out of service last year", the register cannot answer it.
This is stated plainly in the code itself. The model that defines those two actions carries a note explaining that they are deliberately excluded from the list of actions the movement filter offers, precisely because offering them would give a user three filter choices that could only ever return an empty table. Somebody already found that trap and closed it. The underlying gap is still the gap.
The calendar machinery exists. It is not wired to assets.
This is the finding that makes the post worth writing rather than a one-line disclaimer. The product has a workflow engine, and that engine has a category of trigger that fires not when a record changes but when a date arrives. Internally these are called relative-date events. Six of them exist.
| Event | Module | Fires on |
|---|---|---|
Items_batch_expiring | Items | A batch expiry date coming up |
Items_low_stock | Items | Stock crossing the reorder point |
Items_dead_stock | Items | An item going stale |
Quotations_expiring | Quotations | A quotation validity date approaching |
PurchaseOrders_delayed | Purchase Orders | A PO passing its expected date |
CustomerInvoices_overdue | Customer Invoices | An invoice passing its due date |
A batch of amoxicillin can raise a workflow because its expiry date is approaching. That is the exact mechanism a calibration reminder would need. It exists, it is configured through the workflow builder, it routes to people and notifications like any other workflow.
The event catalogue that the workflow builder reads contains twelve modules and thirty-eight events. Assets is not one of the twelve. There is no asset event of any kind — not created, not updated, not a date arriving. So there is no asset workflow to build, and consequently nowhere to hang a service reminder even though the mechanism for one is running a few tables away.
One precision worth having
Assets is listed in the workflow module registry. That is a different list — it names the modules the workflow area knows about for scoping and permissions. The event catalogue, which is what determines whether anything can actually start a workflow run, has no assets entry. If a demo shows you Assets in a workflow module dropdown, that is the first list, not the second. Ask to see an asset event chosen as a trigger.
A maintenance date that exists where nothing reads it
There is one more thing a thorough evaluator would find, and it is better that you hear it here than discover it while reading our database and draw the wrong conclusion.
A second, older equipment register exists alongside the main one — built for scanners, tills, tablets and printers. It holds two dates the main asset register does not: when an item was last maintained, and when it is next due. At some point somebody intended maintenance scheduling and built the storage for it.
Nothing refers to it. No screen renders it, no report reads it, no route reaches it, and nothing fills it. The only next-maintenance date anywhere in the product sits in a store no part of the application touches. It does not power a feature, it will not appear in your data, and it should not appear in anybody's answer to a maintenance question. It is recorded here so that the ledger below is complete.
What you can actually do inside the product
The workaround people reach for is a custom field, and it half works. Assets are a custom-fields module, so you can define a "Next calibration due" date field and it will behave like a first-class field: it appears on the asset form, it comes back through the API, it is visible in the mobile app, it can be filtered and shown in asset reports, it exports, and it imports. If you have three hundred pieces of equipment and a spreadsheet of due dates, you can get those dates into the register in an afternoon.
What the field cannot do is tell you the date has arrived. Custom field values raise an event when the value changes — somebody edits it, and the system knows. A date arriving is not a change. Nothing in the database moves on the morning a calibration falls due. There is nothing to notice, so nothing is noticed.
The second workaround is a scheduled report — build a filtered view of assets due for service and have it emailed every Monday. Scheduled report delivery is built and it runs hourly, and eighteen report modules can be scheduled: items, adjustments, customers, invoices, procurement requests, RFQs, quotations, purchase orders, inventory levels, stock movement, item activity, low stock, the three location reports, POS sales, cash drawers and the POS sales summary. Assets is not among them. An asset report cannot currently be put on a cadence.
-
Put the date in the register anyway
A "Next service due" or "Next calibration due" date field on the asset, filled for every piece of equipment that has an interval. It costs one afternoon and it means the date lives next to the machine rather than in somebody's drawer.
-
Accept that the register will not chase it
Nothing will notify anyone. Plan on the assumption that the field is a record, not a reminder, and do not let anyone on your team believe otherwise.
-
Keep the chasing where it already works
A shared calendar with recurring entries, or whatever your engineer already sends. This is the part the register does not replace, and pretending otherwise is how a date gets missed.
-
Use verification as the physical control
A monthly or quarterly verification round is fully supported, dated, attributed and GPS-stampable, and the hundred-and-eighty-day staleness flag will surface anything nobody has looked at. That is a real discipline the register enforces — use it for the walk-round, not for the service calendar.
-
Ask us before you assume it is coming
A service schedule on assets is a well-shaped piece of work: a date field, an event in the catalogue, and the relative-date trigger that already exists. It is commissionable. It is not shipped, and a roadmap is not a feature.
The cold chain specifically
One more boundary, because pharmacy buyers ask about it and it deserves a direct answer rather than a careful one. There is no temperature anywhere in this product. No reading, no log, no excursion record, no minimum and maximum, no alarm threshold, no integration with a data logger. Searching the entire application for temperature returns nothing but the sampling settings on the AI features.
So the register cannot tell you that a fridge held two to eight degrees overnight, cannot tell you it did not, and cannot hold the evidence either way. If your requirement is continuous temperature monitoring with an audit trail, that is a data-logger product and you should buy one. What the register can do alongside it is tell you which fridge, in which branch, in whose care, verified when — which is the question the data logger cannot answer.
What the asset register answers well
- Which branch holds which machine, right now
- Who signed for it, and when it changed hands
- What condition it was in at each hand-over
- When a person last physically confirmed it exists
- Which assets nobody has verified in six months
- What it cost, when it was bought, when the warranty lapses
- Whether it is out past its expected return date
What it does not answer
- When is this machine next due for service or calibration
- How many days was it out of service last year
- What was done to it at the last repair, and by whom
- Did anything warn us before the due date passed
- Has it held temperature since the last check
- Is its calibration certificate current, and where is it filed
How to test this in ninety seconds
This applies to us and to everyone else you are looking at. Maintenance scheduling is one of the easiest capabilities to imply and one of the easiest to check, and the check is the same regardless of whose demo you are sitting in.
Ask for these, in this order
- Show me an asset record with a next-service date on it — a real field, not a note.
- Now show me the screen that lists everything due in the next thirty days.
- Who gets told, through what channel, and can I see the message that was sent?
- Send an asset out for repair and bring it back. Show me the history afterwards, and tell me how many days it was out.
- Show me the repair itself recorded against the machine: what was done, by whom, what it cost.
- If the answer to any of these is a custom field, ask what happens on the morning the date arrives.
That last one is the load-bearing question, and it is the one that separates a register from a maintenance system. Storing a date is trivial and every product does it. Noticing that a stored date has arrived, deciding who cares, and telling them — that is the feature. When you ask it of us today, the answer is that nothing happens, and the reason is now fully written down above.
Built and verified in the code
- Custody, with attribution. Custodian, department, location and warehouse on every asset, changed only through dated movement rows that record who performed the action and, where your settings require it, where they were standing.
- Verification as a repeatable control. Recording a verification stamps the date and the user, captures condition before and after, and lays down a movement row. Asset reports count verifications in the last thirty days.
- Staleness flagging. The Asset Watch insight counts every non-retired asset never verified, or last verified more than a hundred and eighty days ago, and factors it into the register's health score.
- One forward-looking date. Warranty expiry is a real field, and warranties expiring within sixty days are counted and surfaced.
- Overdue returns. Assets still out past the return date they were checked out against are counted and put in front of you.
- Custom fields on assets. A date field for next service or calibration can be defined and will store, list, report, export, import, and appear in the API and the mobile app.
- A maintenance status. An asset can be marked as under maintenance, and the count of assets currently in that state is reported.
More we can add — each one verified against the code
- A service interval, next-service date or calibration date on an asset. There is nowhere to put any of them. The only place in the product holding a next-maintenance date is the older equipment register described above, which no part of the application reads or writes.
- A warning when an asset date arrives, for every asset date rather than warranty alone. An asset entry in the workflow event catalogue is what makes an asset workflow buildable and lets assets join a scheduled report; today a custom field date raises an event when someone edits it rather than when it falls due.
- A repair logged against a machine: a service record with parts, cost, engineer and certificate. The maintenance status overwrites today and leaves nothing behind.
- A recorded movement when an asset goes out for service. The two movement actions are declared in the code and nothing writes them today; the status changes by editing the asset, and downtime is not derivable from the history.
- Temperature: readings, an excursion log, thresholds and a data-logger integration.
- Depreciation. A purchase cost is stored and summed into a book value; it is not depreciated, and this is a custody register rather than a fixed-asset accounting module.
Where the line falls
- If your problem is knowing which branch has which machine and who is answerable for it, this is a strong fit today.
- If your problem is a preventive-maintenance calendar with reminders and a service history, this is not that product, and a dedicated maintenance system will serve you better. The two co-exist perfectly well.
- If your problem is temperature evidence for an inspector, you need a data logger regardless of what any inventory product tells you.
Service scheduling on assets is a well-shaped piece of work rather than a research problem: a due-date field, an asset entry in the event catalogue, and the relative-date trigger that already runs for batch expiry. If it is a requirement, raise it as one and we will scope it honestly.
Verified against the repository on 7 August 2026. Every item above was checked by searching for it, rather than by failing to remember it.
Anything above that you need, we can build for you
Everything listed above as something we can add describes what ships in the standard product today — it is a starting point, not a limit on what AWRA OpsHub can do for your organisation. Kenya's eTIMS integration and its maintained payroll engine are both in the product because clients needed them and commissioned them; neither appeared by itself, and the same door is open for whatever you just read about. One qualification so this is worth what it claims: a small number of things on this blog we deliberately leave to a specialist rather than build — a statutory ledger we will not sign our name to, a rule that would decide a tax question for you, a clinical or member-funds record that belongs in a regulated system — and where that is true the post says so in those words. Everything else is a scope, a timeline and a price.
The operational work, which is what most commissions actually are
An extra approval stage in a chain that does not match the standard one, a custom field set on employees or assets that only your sector needs, an expiry that has to block an order rather than send an email, a report your board asks for in a shape nothing produces, or a scanner or weighbridge feeding the goods-in door. These are the commissions we are asked for most often and the smallest ones we quote — and unlike a revenue-authority pipeline, none of them waits on a regulator.
The module-shaped additions, which are the ones readers ask for most often
A price list with real discount authority, a customer-facing quotation that expires, a bill of materials or recipe costing, a staff advance that is issued, acquitted and chased, a member or unit ledger, a matching rule that holds a payment. Each of these is a build rather than a setting, and each has been quoted before — a bigger piece of work than a custom field, with a written spec and a date instead of a roadmap slide.
The report, document or pack nothing currently produces
The board pack in the shape your board actually asks for, a donor or funder layout, an invoice or receipt template carrying what your regulator or your customer expects, a dataset the report builder cannot reach yet. Usually the fastest thing on this list to deliver, because the data is already in the system.
Systems, rails and hardware you already run
The accounting package, CRM, online store, core banking or custom database you intend to keep — connected through our API so a fact is entered once and appears everywhere it is needed. Plus the physical edge: a scanner, a scale, a weighbridge or a till peripheral feeding the door it belongs to.
How it works: you describe the requirement, we return a written scope, timeline and cost, and once agreed it is built into your environment and maintained as part of the product. Nothing here waits on a regulator or a published specification, which is why operational builds are the ones we quote fastest. Tell us the requirement that would otherwise rule us out — that is a better first conversation than a demo.
Tell us what your operation needsThe card on the fridge door is doing a job. Until the product does that job, the card stays — and the useful thing we can offer is a register that knows exactly which fridge the card belongs to, which branch it is in, who is responsible for it, and when a human being last stood in front of it. That is not the whole cold chain. It is the part that is usually missing, and it is worth having on its own terms.
Bring us the requirement, not the wish list
If you are evaluating for a pharmacy or a clinic group, send the actual equipment list and the actual inspection requirement. We will tell you which parts the register covers today, which parts need a second system, and which parts are worth building — and we will put it in writing before you commit to anything.
Talk to us about a pharmacy deployment