Skip to main content
Stock is not held as a single number per product. It is held per lot, each with its own quantity, its own location and its own expiry date. Every sale, script and adjustment draws from a specific lot, and the choice of lot is made for you: first expiring, first out.

What FEFO does

When something is sold or dispensed, ClinikEHR picks the lot with the earliest expiry date first. A lot with no expiry date recorded is picked by its age — the date it was received — so old undated stock sells before newer dated deliveries rather than sitting on the shelf. When stock for one item sits in more than one location, the draw prefers the location holding the soonest-expiring stock. The till and the dispensing sheet both show which lot was used, so the person at the counter can check it against the pack in their hand. This applies to every draw the same way: POS sales — including sales made offline, which follow the same rules when they sync — prescription dispensing, lab, radiology and service consumption, transfers and reservations.
An undated lot still cannot be flagged as expiring. Picking it by age keeps it moving, but the expiry alerts have no date to warn you about — the first anyone learns it expired is finding it on the shelf. Turn on Require expiry date on new lots under Settings › Inventory › Receiving quality so a delivery cannot be received without one.
Leaving that setting off is a decision to accept undated lots. If you must receive one — a repack with no printed date, say — record the date you were given by the supplier rather than leaving the field empty. Scanning the pack avoids the problem entirely: Scan package (GS1) on the Receive sheet reads the lot number and expiry off the DataMatrix, so neither is typed and neither is skipped.

What you’re looking at

The tab reads Alerts on its own when nothing is open, and Alerts ({n}) when something is — so the count is the first thing you check, before you open anything. A line above the tab strip repeats it: “{n} open inventory alerts — see the Alerts tab.” A pharmacy with nothing outstanding sees the table’s empty state, “No open alerts. You’re all stocked up.” Above the table sit four panels.

Expiry risk

Expiry risk is a projection, not a calendar. It reads your last 90 days of sales per lot and works out which lots will not sell through before they expire — headed with the money at risk, “projected to expire unsold”, and a badge for how many lots are involved. Each row is tagged Dead stock (“No sales in 90 days”) or Won’t sell through, with a suggested action: Return to supplier or transfer, Discount to clear, or Transfer or return. Acknowledged alerts stay quiet for 30 days. Alerts close themselves. An alert is open only while the thing it warns about is still true. Receive or adjust stock above the level, change or remove the item’s Low-stock threshold, correct a lot’s expiry date, use a lot up, dispose of it, or archive the item, and its alert leaves the Alerts tab on its own — no refresh, and the tab count drops with it. If the item is still short, a low-stock alert becomes an out-of-stock one (or the reverse) instead of disappearing. The expiry-risk projection is recalculated overnight, so those rows clear the next morning. The projection itself needs the Professional plan — without it the panel shows a dashed card reading “Available on Professional and above”. The branch recommendations behind Check branches, which find the branch still selling the item, need Business. See Change your plan. When there is nothing to worry about the panel says so outright: “No stock at risk — every dated lot is on track to sell through before it expires.”

Expiry alert horizons

Up to four day-values — 90, 60 and 30 is the usual set — each of which raises an alert when a lot crosses it. Add a horizon, then Save horizons. The field takes a whole number of days between 1 and 365, and refuses a fifth horizon.

Dispense enforcement and ledger reconciliation

Dispense enforcement controls how strictly the till and the dispensing form are held to the lot they were given. Ledger reconciliation compares recorded movements against on-hand quantities so a drift is found by the system rather than by a count.

The alert table

Everything raised sits in one table: expiring within a horizon, low stock, temperature breach, count variance, controlled-drug count due and recalls. Each row takes Acknowledge, which is a record that a person saw it — not a fix.

The reorder strip, and what it deliberately leaves out

Above the table, a strip counts the items at/below threshold and offers Draft PO from these. When some of those items are also flagged as at risk of expiring, the button says so — it skips them, and it tells you how many it skipped. That exclusion is the point. An item is at or below its threshold and projected to expire unsold when it is not selling, and ordering more of something that is not selling only enlarges the write-off. Order those by hand if you have a reason to; otherwise deal with the stock you already hold. See Purchase orders and suppliers.

Recalls

A recall quarantines the affected lots and surfaces everyone who received stock from them, so you can contact them. Opening one takes a Recall # (FDA), a Severity, the Item, an optional Vendor (optional), a Description (“Reason for recall”) and the Affected lots you tick. You must select at least one lot — “Select at least one affected lot” — and the confirmation tells you how many people were affected. The recall stays open until you close it. Closing it releases the quarantine, so close it only when the stock has actually been dealt with.

Reconciliation and the POS shortfall

If Selling without stock is enabled, the till will complete a sale for something the system does not think you hold. That is intentional — it keeps a queue moving — but it leaves a shortfall, and this tab is where shortfalls are cleared. The POS oversells panel lists each one as Open, Settled or Written off. Switch on Show resolved to see the ones already cleared, and use the page controls underneath when there are more than fit on one page.
  • Settle from stock draws the shortfall against stock you have since received. It asks you to confirm first, because it records a stock movement. It reports how many units it settled, or tells you plainly when it could not: “No stock available to settle against — receive stock first, or write the shortfall off.”
  • Write off records that the units will never be made whole. It takes an optional note of up to 500 characters, and it is the honest ending when the stock was never there. A shortfall can be written off once; if someone else settled or wrote it off first, you are told and the list refreshes.
  • If the list cannot load, the panel says so and offers Try again. It never shows an empty list for a failed load.
An empty tab reads “No oversells to reconcile”, with “Every sale has been covered by recorded stock (or already reconciled).” underneath. A second panel, Dispense reconciliation, does the same job for prescriptions dispensed without drawing stock: Mark reconciled records who dealt with it and when, with an optional note, and an entry can be reconciled only once. After Link all exact matches in Link medicines, the list refreshes so rows for medicines that are now linked are no longer offered Link to stock.

Who can do this

Role decides whether Inventory opens; a Cashier / Till Operator never reaches it. Permission decides what you may do with what you find here. Where View cost prices and margin is missing, the catalogue and valuation figures read “Hidden — needs authorisation from your clinic owner.” — never a zero, because a zero at risk reads as good news rather than as a permission boundary. That gate does not reach the Expiry risk panel, which returns its money figures to anyone the plan lets in. Three stock toggles were removed in August 2026. Receive deliveries into stock, Adjust stock counts and Transfer stock between branches used to appear on a person’s permissions sheet and nothing in the product ever checked them, so switching one off restricted nobody. They are gone rather than left in place — a switch that governs nothing tells you a job is done when it is not. Reaching Inventory is the gate on all three. The stock permissions that are enforced on the server are Manage suppliers and purchase orders and, whenever a countersignature is actually recorded, Witness a controlled-drug dispense. Two behaviours surprise people:
  • Enforcement is opt-in, per person. Somebody never saved in the permissions sheet is unrestricted, and the sheet warns “Saving starts enforcing”.
  • A denied action is recorded; an allowed one is not. Acknowledging an alert is a record that a person saw it, not a record that anything was fixed.
See Staff permissions.

Check it worked

  • A newly received lot appears on the Stock tab with its expiry date filled in, not blank.
  • Once a lot crosses a horizon, it is listed on Alerts and the tab count rises.
  • After you receive stock above the threshold or correct a lot’s expiry date, the alert is gone from Alerts without you acknowledging it.
  • After settling a shortfall, its row on Reconciliation moves from Open to Settled.
  • After closing a recall, the quarantined lots are sellable again.

Common issues

Check the earlier lot’s expiry date. A lot with an empty date is skipped by oldest-first picking, and a lot at a different location is not in scope for that sale.
Either the lot has no expiry date, or no horizon covers it yet. Check Expiry alert horizons, and check the lot on the Stock tab.
The projection is a Professional feature — the card reads “Available on Professional and above”. A plan that has lapsed out of active or trialing loses it too.
A horizon has to be a plain whole number of days. Decimals, zero and blanks are refused.
Four is the maximum. Remove one before adding another.
A recall must name the lots it quarantines. Tick them under Affected lots — a recall with no lots would quarantine nothing and tell nobody.
There is nothing on hand to settle the shortfall with. Receive the delivery first, or Write off the shortfall if the units are never coming.

FAQ

No. It records that a person saw it and quietens it for 30 days. The lot is still expiring, the stock is still low. Acknowledge after you have decided what to do, not instead of deciding.
Draft PO from these deliberately leaves out anything also projected to expire unsold, and tells you how many it skipped. Ordering more of a line that is not selling only enlarges the write-off. Order those by hand if you have a reason to.
Expiry Risk is the future: what is on your shelves now that will not sell through in time, with no period picker at all. Expiry & Waste is the past: what was actually written off in a window you choose. See Reports and analytics.
Only while Require expiry date on new lots is off. It is worth turning on: an undated lot is invisible to oldest-first picking and to every expiry alert, so it sits there until somebody finds it out of date on the shelf.
The affected lots stay quarantined and unsellable indefinitely. That is the safe failure, but it also means stock you have since cleared is still off the shelf — close the recall once the stock has actually been dealt with.