Batch, expiry and FEFO: what actually needs tracking
FEFO is not FIFO, and tracking every batch is how tracking stops being done. What really needs batch and expiry tracking, and how to ship what expires first.
For pharmacies, food, cosmetics, chemicals — and anyone told they need batch tracking · 3 min read · updated
In short
- FEFO picks the earliest expiry; FIFO picks the earliest arrival. They differ exactly when it matters.
- By common convention the stamped expiry date is the last sellable day.
- Batches suit interchangeable units recalled by lot; serials suit individually warranted units.
- Tracking everything leads to staff picking any batch to get served, which produces a fictional trail.
- Whether expired stock can be sold is a policy setting; whether it is recorded should not be.
FEFO is not FIFO
FIFO ships the oldest arrival. FEFO ships the earliest expiry. Most of the time they are the same crate, which is why the distinction gets lost — until the day a supplier sends you short-dated stock.
A batch received in March expiring in June should go out before a batch received in January expiring in December. FIFO sends the January one and leaves you holding stock that expires first. On perishables that is not a rounding error, it is written-off inventory.
If you sell anything with a date on it, you want FEFO for picking. You can still value at moving average — costing and picking are different questions.
What the stamped date means
This sounds trivial and it is a real source of disagreement between systems: is stock expiring on 30 June sellable on 30 June?
The common convention, and ERPNext’s, is yes — the stamped date is the last good day. A batch is expired from the following day. Whatever your system does, find out, because a report that treats the boundary differently from the person on the floor will produce arguments nobody can settle.
Batch or serial: choose one, mostly
A batch is a group that shares a history — one production run, one consignment, one expiry. A serial is one physical unit with its own identity.
Batch is right when recall is by lot and the units are interchangeable: medicine, food, paint, chemicals. Serial is right when each unit is individually warranted or regulated: phones, laptops, machines, firearms.
Tracking both on the same item is occasionally necessary and usually a sign that somebody switched on every option. Each one adds a field the person at the counter has to fill in correctly at the moment they are busiest.
What to track, and what not to
Track batches where a recall is plausible, where expiry drives write-offs, or where a regulator will ask. That is a smaller list than it first appears.
Do not track batches on consumables, packaging, spares or anything you would never recall and never write off for age. Every tracked item is a decision at the till; make people make it on the things that matter and they will keep making it.
The failure mode of over-tracking is not extra work. It is staff selecting whatever batch is first in the dropdown to get the customer served, which produces a trail that looks complete and is fiction.
Blocking expired stock
Whether expired stock can be sold at all should be a setting, not a rule. A pharmacy must never; a hardware shop selling sealant a week past a conservative date reasonably might.
What should never be optional is the record. If expired goods leave, the ledger should say so, because the alternative is stock that vanishes with no document — and that is indistinguishable from theft when somebody looks at it in six months.
Common questions
- Can I use FEFO and moving average together?
- Yes, and it is the usual combination. FEFO decides which physical batch leaves; moving average decides what it cost. They are independent choices and conflating them is a common source of confusion.
- Do I need batch tracking for GST?
- No. GST does not require batch-level records. Batch tracking is driven by recall, expiry and sector regulation — drugs and cosmetics rules, food safety rules — not by tax.
- What is the difference between FIFO and FEFO?
- FIFO sends out whatever arrived first; FEFO sends out whatever expires first. They pick the same batch until a supplier delivers stock with a shorter date than what you already hold, which is exactly when the difference costs money.