Every food distributor rotates stock, but there are two different rules for deciding what ships next, and they only look alike until a product's shelf life gets involved. FIFO — first in, first out — ships the oldest received stock first. FEFO — first expired, first out — ships whatever expires soonest, regardless of when it arrived. For dry goods those are usually the same pallet. For perishable food they often aren't, and the gap between them is measured in spoilage.
Why receipt date and expiration date drift apart
FIFO assumes the oldest stock is the closest to expiring. That holds when every lot of a product has the same shelf life. But food doesn't cooperate: a lot received today may have been produced weeks ago and carry a nearer expiration than a lot you received last week from a fresher production run. Two deliveries of the same item can arrive in one order and expire in the opposite order. Rotate by receipt date and you ship the fresher-arriving-but-sooner-expiring lot last — straight into a write-off.
FEFO is the food-safe default
FEFO fixes this by ignoring when a lot arrived and sorting purely by expiration. The pick list always pulls from the lot that will expire first, so product leaves in the order it will actually go bad. That is the behavior you want for anything with a use-by, sell-by, or best-by date: dairy, produce, meat and seafood, and most refrigerated and frozen goods. It minimizes spoilage, keeps customers from receiving short-dated product, and — because it's lot-driven — it lines up with the traceability you already have to keep.
Where FIFO still makes sense
FIFO isn't wrong; it's just narrower. For shelf-stable dry goods with long, uniform shelf lives, receipt order and expiration order are effectively identical, and FIFO is simpler to run. Some operations also use FIFO for non-food supplies where expiration is irrelevant. The point isn't to abolish FIFO — it's to stop applying it to perishable inventory where it silently costs you.
The catch: FEFO only works if the system knows expiration at the lot level
FEFO is a great rule that fails without the data to run it. To pick by expiration, the warehouse system has to capture an expiration (or production date plus shelf life) on every lot at receiving, hold it at the lot level, and feed it into pick-list generation. If expiration lives on a paper label or in a spreadsheet the picker can't see, FEFO becomes a hope rather than a rule. This is why FEFO is really a systems question: it's only as good as the lot record behind it.
CDXAI enforces FEFO as part of the pick, because the same lot record that carries expiration also carries the traceability lot code — so rotating by expiration and staying traceable are the same operation, not two. You can see how that fits together on the warehouse management and FSMA 204 traceability pages.
The short version: if you handle perishable food, default to FEFO, keep FIFO for the genuinely long-and-uniform-shelf-life items, and make sure your system carries expiration at the lot level — because a rotation rule the pickers can't act on isn't a rule at all.