Track stock by batch (lot) number and expiry date so you always sell or dispense the earliest-expiring stock first, and can see at a glance what is about to expire. Essential for pharmacies, food, chemicals, and anything date-sensitive.
Before you start
- The item must be marked "Manage expiration" in its setup (Products & Services → open the item → tick Manage expiration / batch tracking). Only those items ask for a batch when stock moves; everything else behaves as before.
- Drugs turn this on automatically. Any item you give a drug schedule (OTC / POM / Controlled) — including everything imported through the AI Drug Catalog — is set to Manage expiration for you. You can still untick it on a specific item.
- Batch balances are calculated from stock movements, not typed in — you can trust the on-hand shown against each lot.
- The same report is reachable from Inventory → Batch Expiry Report and from Pharmacy → Expiry & Batch Report — it's one report in two places.
Steps — reading the Batch Expiry Report
- Open Inventory → Batch Expiry Report (
/inventory/expiry). - Pick a Department (or leave All departments) and a Horizon — the next 30, 60, or 90 days, or All dated lots.
- The grid lists every lot with stock on hand that is expired or approaching
expiry, with a coloured status pill:
- Expired (red) — remove from sale immediately.
- ≤ 30 / 60 / 90 days — plan a discount, promotion, or return to supplier.
- The top-right shows a count of expired lots on hand. Sort by Expiry to work oldest-first, or use the search box to find a specific item or batch.
Steps — entering batches when stock moves
When you add or remove stock for a batch-tracked item, the quantity cell shows a "⋯ lots" button instead of a plain number. Click it to open the batch panel:
- Receiving stock (purchases, opening/added adjustments, customer returns): add one row per lot — batch number, expiry date, manufacture date, quantity. The line quantity is the sum of the lots you enter.
- Issuing stock (sales invoice, consumption, transfers out): the panel lists available lots earliest-expiry-first. Click Auto FEFO to fill the requested quantity automatically, or type the quantity to draw from each lot. Expired lots are blocked and cannot be dispensed.
- Returning stock to a supplier (return outward): pick the lot(s) you are sending back. Here expired lots CAN be selected — returning expired stock for credit is a normal reason to do a supplier return.
Press Apply — the total flows back into the line, and the lot breakdown is saved with the document.
At the POS / till — it's automatic
You don't pick lots at the till. When a batch-tracked drug is sold on the POS, the system silently draws the earliest-expiring stock (FEFO) for you, so the sale stays fast. If the only stock that could cover the sale is expired, the sale is blocked — clear or write off the expired lot first. (Selling through the full Sales Invoice screen still gives you the "⋯ lots" panel if you want to choose lots by hand.)
Tips
- FEFO = First-Expiry-First-Out. Auto FEFO always drains the lot that expires soonest, so nothing sits long enough to expire when it didn't have to.
- Lots with no expiry date are used last (they never expire).
- Batch tracking never changes your stock balances or accounting — it only records which lot each movement used. Your on-hand and ledger stay exactly as they were.
Common problems
- "No stock lots available for this item in this department." → There is no on-hand batch to issue from. Receive stock first (purchase or opening adjustment) so a lot exists.
- A lot is greyed out / marked EXPIRED. → It is past its expiry date and cannot be dispensed. Remove it via a stock adjustment (supervised write-off).
- The "⋯ lots" button doesn't appear. → The item isn't marked Manage expiration. Open the item in Products & Services and enable it; existing stock keeps working, new movements will ask for a batch.
- Auto FEFO says "Only N available." → Non-expired on-hand is less than the quantity you asked for. Reduce the quantity, or receive more stock. Any expired quantity is shown separately and is deliberately excluded.