FEFO — first-expired, first-out — picks stock by expiry date, not by receipt date. It is not a refinement of FIFO. The two give different answers whenever a later delivery has a shorter remaining life, which in fresh grocery is an ordinary week, not an edge case.
FEFO against the alternatives
| Method | Picks by | Result in fresh categories |
|---|---|---|
| FIFO | Receipt date | Ships older stock that may expire later. Newer, shorter-dated stock spoils. |
| FEFO | Expiry date | Shortest-dated stock moves first. Correct for anything perishable. |
| Nearest bin | Whatever the picker reaches | What happens by default when the system does not direct the pick. |
That third row is the real comparison. Most FEFO failures are not a wrong configuration; they are a correct configuration that only exists in a report while the pick itself stays undirected.
Catch-weight
A case of chicken is sold as one case and priced by the kilogram. Both numbers are real, and they are not derivable from each other — the actual weight of that case is what the customer is charged for.
So the system has to carry two units through every step: inventory in cases, valuation and invoicing in weight, captured from the scale at pick. Implementations that store a nominal weight per case and invoice from it produce a margin error on every single line, in whichever direction the nominal is wrong.
Markdowns before the write-off
Stock approaching expiry has a value that falls to zero on a known date. The only question is how much is recovered before then.
- Set the markdown trigger by category — dairy and produce need different windows.
- Trigger on days remaining, not on a manual review that competes with everything else in a store.
- Report recovery rate: value sold at markdown against value written off. That ratio is the whole measure of whether the policy works.
A markdown taken three days early costs margin. One taken a day late costs the entire item plus the disposal. The asymmetry is the argument for automating the trigger.
Across stores
Multi-site grocery adds one more move worth having: transferring short-dated stock from a store where it will not sell to one where it will. This only works if expiry is visible at the batch level across sites, which is the same data FEFO already requires.