Tracking Expiry Dates and Batch Numbers in Your Pharmacy

Short answer: Expiry control in a pharmacy rests on three habits that the system must enforce: record the batch and expiry date on every item received, sell the batch that expires first (FEFO), and review a near-expiry report every week so items can be returned, transferred or promoted before they become a loss. Odoo handles all three with lot and expiry tracking, and adds the ability to find every unit of a recalled batch in seconds.
Expired stock is one of the most visible losses in a pharmacy, and one of the most avoidable. This article explains how to set up expiry control so it works every day, not only at the annual count.
The four parts of expiry control
1. Capture batch and expiry at receipt
When the distributor's delivery arrives, each line is recorded with its batch number and expiry date. If this step is skipped, nothing after it can work. Odoo can make batch and expiry mandatory for medicines, so a receipt cannot be validated without them.
2. Sell first-expiry, first-out (FEFO)
The system should decide which batch leaves the shelf, not the cashier. With FEFO removal, each sale takes stock from the batch that expires first. The shelf arrangement should follow the same rule.
3. Watch what is coming
A weekly near-expiry report per branch, for example items expiring in the next 90 days, gives time to act:
- Return to the distributor if the agreement allows near-expiry returns.
- Transfer to a branch that sells the item faster.
- Prioritise the item at the counter.
4. Handle recalls quickly
When a regulator or manufacturer recalls a batch, you must find every unit of it: which branch, how many, and which have already been sold. With lot tracking this is a single search.
Setting it up in Odoo
| Item | Purpose |
|---|---|
| Lots and serial numbers enabled | Track each batch separately |
| Expiration dates enabled | Store expiry, best-before and alert dates per lot |
| Product tracked "by lots" | Forces batch entry for that medicine |
| Removal strategy FEFO | Picks the earliest-expiring batch automatically |
| Alert date per product | Flags lots a set number of days before expiry |
| Scheduled report | Sends the near-expiry list to each branch manager weekly |
Common mistakes
- Entering one "general" batch for everything to save time at receipt.
- Importing opening stock without batches and expiry dates.
- Allowing cashiers to override the batch at sale.
- Reviewing expiry only at the annual stock count.
Frequently asked questions
What about items sold by strip?
Strips come from a box with a known batch, so the batch follows the strip. Stock is kept in both units correctly.
Can we import our current stock with expiry dates?
Yes, if your current system or a physical count provides batch and expiry per item. This is worth doing carefully at go-live.
Does this help with regulators?
Yes. Batch-level records make it much easier to respond to recalls and inspections, and they are the base for track-and-trace requirements.
See expiry control in a real pharmacy flow
ExtraMile's pharmacy solution on Odoo includes batch, expiry and FEFO control for single pharmacies and chains.
Book a pharmacy demo or message us on WhatsApp: Egypt · Gulf
This article was drafted with AI assistance and reviewed and edited by the ExtraMile implementation team.
