Free AuditEnterprise AIShelfSense
Back to Blog
GroceryJan 202610 min read

FIFO vs FEFO: Why First-In-First-Out Is Costing You Money

FIFO tracks arrival date. FEFO tracks expiry date. That distinction costs the average grocery store thousands in preventable waste annually.

FIFO vs FEFO: the inventory rotation rule you learned on day one is quietly bleeding you dry

There is a piece of received wisdom in warehouse operations that is so deeply embedded it has become invisible, like gravity or the assumption that your POS system is probably fine. The rule is FIFO: First-In, First-Out. The oldest stock ships first. You learned it during onboarding, your warehouse staff have it tattooed on their operational subconscious, and your inventory system almost certainly enforces it by default. FIFO is one of those ideas that sounds so self-evidently correct that questioning it feels a bit like questioning whether you should wash your hands before handling food. Of course you rotate by arrival date. What else would you do?

Well. There is something else you could do, and for a large category of products — basically anything that expires — the something else is meaningfully better. It is called FEFO (First Expiry, First Out), and the reason most food and beverage operators have not adopted it is not that FEFO is wrong or complicated or expensive. It is that FIFO was designed for a world that no longer exists, and the software industry has been remarkably slow to notice.

Free Tool

Not sure how much you're losing to expiry?

Run a free inventory waste audit — find your bleeding SKUs in 60 seconds. No sign-up required.

Run free audit

How FIFO became the default (and why it stuck for seventy years)

FIFO emerged as inventory orthodoxy in an era when most warehoused goods did not carry expiration dates at all. If you are managing barrels of flour or crates of canned goods in a 1940s distribution center, the logic is airtight: the barrel that has been sitting longest has had the most exposure to humidity, temperature variation, and the general indignities of warehouse life. Ship it first. This is not controversial.

When computerized inventory systems arrived in the 1970s and 1980s, they inherited this assumption wholesale, and for entirely pragmatic reasons. A receipt date is trivially easy to record — it is literally the date you received the purchase order. You do not need to inspect individual items, you do not need to capture batch-specific data, you do not need to train your receiving crew to do anything they were not already doing. One timestamp per receipt. Done. The entire data model for FIFO fits on an index card, which is (not coincidentally) roughly the sophistication level that most inventory software has aspired to ever since.

FIFO also has powerful friends in the accounting department. GAAP accepts it. The IRS accepts it. It produces clean, predictable cost-of-goods-sold figures that auditors can follow without squinting. There is a reason that when your CFO and your warehouse manager agree on something, it tends to become permanent institutional policy regardless of whether it is actually optimal. FIFO is the rare operational practice that makes accountants happy, and the accounting profession's satisfaction has historically been sufficient to end most discussions about whether there might be a better way.

The specific and expensive ways FIFO fails

Here is the scenario that should make you uncomfortable, because it is not hypothetical — it happens in dairy coolers, deli cases, and pharmaceutical warehouses every single day.

Your distribution center receives two shipments of Greek yogurt from the same manufacturer. Shipment A arrives on January 3rd with an expiration date of February 10th — a generous 38 days of remaining shelf life. Shipment B arrives on January 8th, five days later, with an expiration date of January 25th — only 17 days of remaining shelf life. Under FIFO, your system ships Shipment A first, because it arrived first. Meanwhile, Shipment B is sitting on the rack burning through its 17 days of shelf life while your pickers dutifully work through A. By the time B reaches the front of the queue, it has insufficient remaining shelf life for retailers to accept it (Walmart and Kroger typically require 60-70% of total shelf life remaining at delivery), or it has expired outright. You throw it away.

If you are thinking "well, that seems like a weird edge case, surely receipt date and expiry date usually line up," I have some bad news. Variable shelf life within the same SKU is not an edge case; it is the normal condition of perishable supply chains. Production batch differences, raw ingredient variability, manufacturing line conditions, time in transit from different distribution points, and (this is the one people forget) seasonal factors all cause expiration dates to vary across shipments of the identical product. In dairy, the swing can be 5 to 14 days for the same SKU from the same manufacturer. In pharma, different production lots of the same drug routinely carry expiry dates months apart. Your FIFO system treats all of these as interchangeable because it literally cannot tell the difference — it does not have the data to distinguish them.

There are a few recurring patterns that generate this mismatch, and they are worth understanding because they are structural, not accidental. Supplier variability is the most common: you source the same product from two different facilities (or the same facility runs different production lines), and the resulting shelf lives differ by a week or more. Seasonal shelf life differences are another — dairy products manufactured in summer months often have shorter shelf lives due to higher bacterial counts in raw milk and more aggressive thermal processing. And then there are mixed-date pallets, which are the warehouse equivalent of a junk drawer: a pallet arrives with cases from two or three production runs jumbled together, each with different expiry dates, and your receiving system records exactly one receipt date for the whole lot and calls it a day.

How FEFO actually works in practice

FEFO — First Expiry, First Out — is conceptually simple: instead of ordering the pick queue by receipt date, you order it by expiration date. The unit closest to expiring ships first, regardless of when it arrived. This requires exactly one additional data point per batch at receiving: the expiration date. That is the entire conceptual difference. One field.

But that one field changes everything operationally, and it is worth being honest about what "everything" means. At receiving, every inbound shipment now needs to be logged not just with the SKU and quantity (which you were already doing) but with a batch or lot number and the expiration date associated with that batch. If your suppliers use GS1-128 barcodes — and most large food manufacturers do — the lot number and expiry are already encoded in the barcode, and a scan captures both in a single pass. If they do not, someone is keying in dates manually, which works fine for a 15-SKU artisanal cheese operation but becomes a meaningful labor cost at scale.

Put-away changes too, though less dramatically than people fear. Under FIFO, the rule is beautifully simple: new stock goes behind old stock. Under FEFO, new stock goes behind stock with a later expiry date, which is usually the same thing but critically not always. Your shelf labels need to show expiry dates rather than (or in addition to) receipt dates. Ideally your warehouse management system assigns bin locations based on expiry sequence so that pickers do not need to think about it — they just pick from the location the system tells them, and the system has already sorted the math.

Picking itself becomes a non-event if your WMS supports FEFO logic: the pick list says "pick from bin 14-C, batch 2847, expires January 25" instead of "pick from bin 14-C," and the picker scans to confirm. Without system support, you are relying on humans to visually check dates across multiple bins and make the right call under time pressure, which (as anyone who has managed a warehouse crew at 5 AM on a Monday can attest) is a policy that works right up until it doesn't.

The waste reduction math

Let me work through the numbers on a concrete example, because the abstraction of "FEFO reduces waste" is less persuasive than the specific dollars involved.

Take a mid-size grocery store doing $18,000 per week in dairy sales across 120 SKUs. That is roughly 4,000 units per week at an average retail price around $4.50. Industry data from FMI puts dairy shrinkage at 3-5% of sales for well-managed stores, and I will use 5% because most stores are less well-managed than their operators believe (this is not a criticism — it is a structural feature of managing perishable inventory with inadequate tools). That is 200 units wasted per week, and at roughly $3.00 cost per unit, you are looking at $600 per week in cost-of-goods destroyed, which annualizes to $31,200.

Now, what fraction of that waste is attributable to rotation errors — cases where stock was shipped or shelved by receipt date when expiry date should have governed the decision? Conservative industry estimates put this at 20-30% of dairy shrinkage. Call it 25%, because I would rather understate the case and be credible than overstate it and be dismissed. Twenty-five percent of $31,200 is $7,800 per year, from a single store, in a single department. A 15-location regional chain is looking at $117,000 annually. A 200-store operation is at $1.56 million. And that is just dairy — add deli, bakery, fresh juice, and prepared foods and the number roughly doubles.

I should note that these figures come with honest caveats: not all rotation errors would be caught by FEFO (some are simple human mistakes that no system fixes), and the 25% attribution figure is an industry estimate, not a controlled experiment. But even if the real number is half of what I have described, you are talking about a five-figure annual improvement per location for a problem whose fix is, at bottom, recording one additional data field at receiving.

The regulatory angle (which is less optional than you think)

Neither the FDA nor the USDA uses the word "FEFO" in most of their regulatory text, which has allowed a surprising number of operators to convince themselves that FIFO satisfies their regulatory obligations. This is, to put it diplomatically, an optimistic reading of the regulatory landscape.

The FDA's Food Safety Modernization Act requires preventive controls for human food, including proper stock rotation as part of a food safety plan. FSMA does not spell out the specific rotation method, but the intent — ship product in a way that minimizes the risk of expired goods reaching consumers — aligns with FEFO, not FIFO. In pharma, FDA 21 CFR 211.150 requires distribution procedures ensuring that the oldest approved stock is distributed first and that expired products never ship. "Oldest approved stock" in practice means nearest expiry, not oldest receipt date, which is definitionally FEFO whether the regulation uses that term or not.

The USDA's FSIS Directive 5000.1, covering meat, poultry, and egg products, expects proper rotation and date management as part of HACCP compliance. And if you operate under any GFSI-benchmarked standard — SQF, BRC, FSSC 22000 — your auditors will routinely check that product with the nearest expiry date is dispatched first. If your system runs FIFO and an auditor finds a case where a later-received batch expired before an earlier-received batch that shipped first, that is a nonconformity. It does not matter that your SOP says "FIFO" and your team followed the SOP perfectly. The auditor cares about outcomes, not acronyms.

The practical reality is this: regulators and auditors expect you to ship the soonest-to-expire product first. If your FIFO system accidentally achieves that outcome because receipt date and expiry date happen to align, you are fine. When they diverge — and they will diverge, routinely, for the structural reasons described above — you are exposed. Health department inspectors are increasingly aware of this distinction, particularly for prepared foods and deli operations where shelf lives are measured in days, not months.

Why your current system probably cannot do this

Here is the uncomfortable truth about the state of food and beverage inventory technology: most systems were designed around the SKU as the atomic unit of inventory. Your POS knows you have 48 units of Brand X Whole Milk. It does not know that 24 of those units expire on the 15th and the other 24 expire on the 22nd. It cannot do FEFO because it does not have the data, and it does not have the data because no one designed it to capture batch-level detail for what was historically considered a grocery-store-level operation.

Mid-tier inventory systems sometimes support lot tracking, but "lot tracking" in these systems typically means recording a lot number as a text field — not necessarily the expiration date, and almost never with pick-queue logic that reorders by expiry. You end up with the worst of both worlds: the data entry burden of batch tracking without the operational benefit of FEFO routing. Enterprise ERPs like SAP and Oracle can do FEFO, but the configuration is involved (SAP's Batch Management with shelf-life features requires setup across Materials Management and Warehouse Management modules), and these systems were not designed for a 12-location grocery chain — they were designed for the kinds of organizations that have dedicated SAP administrators on staff.

The core architectural issue is that FEFO requires batch-level data capture at receiving, and most inventory systems were built for SKU-level operations. Retrofitting batch tracking into a SKU-level architecture is a bit like adding a second story to a house that was built on a slab foundation: theoretically possible, structurally awkward, and the kind of project that tends to reveal unpleasant surprises about what is load-bearing and what is not.

When FIFO is still perfectly fine

I want to be clear that this is not an argument for FEFO everywhere, for everything, regardless of context. FIFO remains entirely adequate for shelf-stable canned goods with 2-5 year shelf lives (the odds of two shipments having meaningfully different expiry dates in a way that causes waste are negligible), for frozen goods with 12-24 month shelf lives where inventory turns are reasonable, and for non-food dry goods where expiration is not a factor at all. Nobody needs FEFO for paper towels.

The practical dividing line is this: if the product expires, and if you have ever received two shipments of the same product with different expiry dates (which, for any perishable category, you almost certainly have), then FEFO is the operationally correct rotation method. For everything else, FIFO is fine, and the additional data capture burden is not worth the marginal benefit. Most well-run operations will end up with a hybrid approach — FEFO for perishables and date-sensitive categories, FIFO for everything else — which cuts the data entry overhead substantially while capturing the vast majority of the waste reduction.

The difference between operations that claim to do FEFO and operations that actually execute it consistently comes down to whether the system enforces the rotation logic or relies on human discipline. People forget, skip steps under time pressure, and make judgment calls that seem reasonable in the moment but are statistically suboptimal across thousands of picks per week. An expiry tracking system that directs pickers to the soonest-expiring batch, fires alerts at configurable intervals before expiry, and maintains a complete audit trail of every batch-level pick does not forget, does not skip steps, and does not make judgment calls. It just does the math, every time, which is (when you think about it) exactly the kind of work that should have been delegated to software decades ago.


ShelfLifePro builds batch-level inventory tracking with native FEFO logic, automated expiry alerts, and the shelf-life reporting your auditor wishes you already had. If you are running FIFO on perishables and wondering where the shrink is coming from, [/food-beverage](/food-beverage) is a reasonable place to start.

See what batch-level tracking actually looks like

ShelfLifePro tracks expiry by batch, automates FEFO rotation, and sends markdown alerts before stock expires. 14-day free trial, no credit card required.