FIFO vs FEFO: Which Stock Rotation Is Right for Your Product?
FIFO ships the oldest-received stock first; FEFO ships the soonest-to-expire stock first. If your products carry an expiry or best-before date and lots can arrive out of date order, you need FEFO, and it only works if lot and expiry are captured at receiving. Everything without a date runs fine on FIFO. Neither has anything to do with the FIFO your accountant uses to value inventory.
FIFO and FEFO answer the same question, which unit should leave the shelf first, with two different clocks. FIFO (first in, first out) picks the stock that arrived earliest. FEFO (first expired, first out) picks the stock that expires earliest. For most warehouses the choice follows from one fact about the product. If it carries a date that matters to your customer or your regulator, run FEFO. If it doesn't, run FIFO and don't pay for data you won't use.
Where FIFO and FEFO give different answers
If every delivery of a product arrived with a later expiry date than the one before it, FIFO and FEFO would pick the same case every time. Warehouses are not that tidy. The two methods split apart whenever a later-received lot carries an earlier date, which happens more often than the tidy version suggests:
- Two suppliers for the same SKU, one of whom ships from older stock.
- A return or a store transfer that puts an older lot back into the pickable pool after newer lots arrived.
- A promotional buy or a spot purchase that comes in short-dated at a discount.
- Split shipments or backorders that arrive days apart, so the case that reaches your dock second was picked from an older lot than the first.
Under FIFO, the picker takes the case that has sat longest, which in these situations is the longer-dated one. The short-dated lot waits, gets closer to its date, and ends as a write-off, a markdown, or a delivery with less remaining shelf life than the customer's contract allows. Under FEFO the short-dated lot ships first, whenever it arrived.
That is the whole argument for FEFO. It is also why FEFO cannot be bolted on at the pick face. The picker can only sort by expiry if the system knows the expiry, and the system only knows it if someone captured it when the stock came in.
What FEFO requires that FIFO doesn't
FIFO needs one piece of data most WMS already capture: the receipt date on each license plate or receipt line. If your system only holds a SKU total, what you have is location-order picking, and calling it FIFO is generous. FEFO needs four things, and the first one decides whether the other three matter.
1. Expiry captured at receiving. Every receipt of a dated product has to record the lot (or batch) and the date. The GS1 system defines standard data fields for this, usable at any packaging level: Application Identifier (10) is the batch or lot number, variable length, up to 20 alphanumeric characters; AI (15) is the best-before date and AI (17) the expiration date, both six digits as YYMMDD; AI (7003) carries an expiration date and time for products that need it. When a supplier concatenates these identifiers into one GS1-128 symbol, a single barcode scan populates lot and date together; when they are printed as separate bars it is two or three scans, still faster than keying. When the label carries none of them, the date has to be typed, which is the step that gets skipped on a busy dock.
One trap worth testing before go-live: in AI (17) the day may be given as "00", which GS1 defines as the last day of the month. A receiving parser that rejects "00", or reads it as the first, moves every affected lot up to a month in the wrong FEFO position. (For regulated healthcare products GS1 has required a real day of the month since 1 January 2025, so the "00" form is disappearing there, but food and consumer goods labels still use it.)
2. Inventory held by lot, not only by SKU. "Twelve on hand" is enough for FIFO. FEFO needs "seven of lot A expiring in March, five of lot B expiring in June," per location. This is what lot-level inventory means, and it changes how counts work: a cycle count of a dated SKU has to confirm the split between lots as well as the total.
3. Pick logic that sorts by date. The system directs the picker to the earliest-expiring lot that meets the order's requirements. Many systems can sort allocation by expiry once lots exist, but recording a lot's expiry and allocating on it are different features. Ask your vendor to demo an actual FEFO pick before assuming it.
4. Minimum remaining shelf life rules. Many channels will not accept product below a shelf-life threshold at receipt: a retail distribution center, a marketplace fulfillment program, a food-service customer. Your FEFO rule has to know the threshold per customer or channel and refuse to allocate lots that would arrive under it. Otherwise FEFO ships the shortest-dated lot to the customer most likely to reject it.
If you can't do step one reliably, you don't have FEFO. You have FIFO with an expiry column that nobody trusts.
The rules moving more products onto expiry tracking
Three rules shape what your suppliers and customers will ask of you, including one that isn't a rule at all.
Food traceability in the US. The FDA's Food Traceability Rule (FSMA Section 204) requires businesses that handle foods on the Food Traceability List to keep records of Key Data Elements at Critical Tracking Events, including a traceability lot code assigned when a food is initially packed or transformed, and to make those records available to the FDA within 24 hours of a request, or within a reasonable time the agency has agreed. The original compliance date was January 20, 2026. The Continuing Appropriations and Extensions Act of 2026 directs the FDA not to enforce the rule before July 20, 2028, and the FDA has separately proposed extending the compliance date itself by 30 months, to the same date. The extension is proposed, the non-enforcement is law, and the record-keeping design is unchanged. Lot-level receiving is the foundation of it.
Pharmaceutical distribution in Europe. The European GDP Association reads the EU's Good Distribution Practice guideline (2013/C 343/01) as preferring FEFO rotation, with exceptions allowed only when documented and justified. If you distribute medicinal products in Europe, plan for FEFO as the baseline and expect to document any lot you ship out of expiry order.
Date labels are mostly voluntary, which cuts the other way. In the United States, federal law does not require date labels on most foods; infant formula is the exception. FDA and USDA's Food Safety and Inspection Service jointly recommend the phrase "Best if Used By" to signal a quality date rather than a safety cutoff. For a warehouse this means the date you rotate on is frequently a quality date set by the manufacturer, and the rule you enforce should be the one your customer or channel actually cares about, which is why step four above exists.
FIFO on the floor is not FIFO in the ledger
FIFO and FEFO are physical rotation rules: they decide which case the picker touches. FIFO, LIFO and weighted-average cost are accounting cost-flow assumptions: they decide which purchase price is charged to cost of goods sold when a unit is sold. The two do not have to match, and in most companies they don't.
Under IFRS (IAS 2), the cost of interchangeable inventory may be measured using FIFO or weighted average, and LIFO is prohibited. Under US GAAP (ASC 330), all three are permitted, and some companies elect LIFO for tax reasons. None of those standards says anything about how your picker walks the aisle. A warehouse can rotate stock FEFO for freshness while the finance team values it at weighted-average cost; a US company can report on LIFO while physically shipping its oldest cases first. When someone says "we're a FIFO warehouse," ask which FIFO they mean. The answer decides whether the conversation belongs to operations or to accounting.
Choosing, product by product
Rotation is a per-product decision, and it is normal for one warehouse to run both methods side by side.
Product profile | Rotation | Why |
|---|---|---|
Undated hardgoods (apparel, tools, housewares) | FIFO | Nothing to sort on; FIFO keeps receipt dates meaningful so an aging report can flag slow movers |
Dated consumables from a single supplier, steady cadence | FIFO with an expiry guard | Arrival order and date order usually agree; block any pick that violates a shelf-life minimum |
Dated goods from multiple suppliers, returns, transfers | FEFO | Later lots regularly carry earlier dates; FIFO will strand them |
Anything on the FDA Food Traceability List | FEFO with lot-level records | FSMA 204 requires traceability lot codes and lot-level records regardless of rotation; once inventory is held by lot, FEFO costs almost nothing more |
Medicinal products in EU distribution | FEFO | Read by the European GDP Association as the guideline's preferred principle; exceptions documented |
Serialised electronics, warranties | FIFO plus serial capture | Rotation matters less than knowing which unit shipped |
"FIFO with an expiry guard" is a legitimate third method: pick by arrival, but never allocate a lot that would breach the customer's minimum remaining shelf life. It costs you the same capture step at receiving as FEFO. The reason to stop short of full FEFO is not the dock; it is that FEFO fragments pick faces into lot-specific locations. If arrival and date order agree 95 percent of the time, the guard catches the other 5 percent without reorganising the rack.
Putting it into practice
Whichever method you choose, the sequence of work is the same, and it starts at the dock.
- Decide per SKU. Tag each item as undated, dated-guard, or dated-FEFO. This is a product attribute, and it belongs with the people who own the product data.
- Fix receiving first. For dated items, make lot and date required fields on the receipt and receive by lot. Scan GS1-128 labels where suppliers provide them; the same GS1 Company Prefix that sits inside their GTINs is what makes their lot codes unambiguous to you. For suppliers who don't label lot and expiry, put it into your vendor compliance terms at the next renewal, with a scorecard or chargeback behind it. Asking rarely changes anything on its own.
- Store so lots stay separate. Mixed lots in one bin make counting slower and picking error-prone, because the picker has to read dates instead of trusting the location. One lot per license plate or bin is the simplest rule; on pallets, an SSCC label gives each one a scannable identity.
- Set shelf-life thresholds by channel. Write down what each customer or marketplace requires at receipt and put it in the allocation rule.
- Count by lot. Cycle counts of dated items verify the lot split as well as the total. The maths of inventory accuracy doesn't change, but the unit of count does, and so may how often you count short-dated lines.
- Report against the thresholds. A weekly view of stock bucketed against each channel's shelf-life minimum (already at risk, at risk next month, safe) turns FEFO from a picking rule into a purchasing signal.
The whole effort rests on one moment: the scan or the keystroke at receiving that records which lot arrived and when it expires. Get that right and the remaining work is configuration. Skip it and no rotation rule can save the stock.
Frequently asked questions
Is FEFO the same as FIFO?
No. FIFO orders picks by the date stock arrived; FEFO orders them by the date stock expires. They agree only when the earliest-arriving lot is also the earliest-expiring one. As soon as a later delivery carries a shorter date, which happens with mixed suppliers, returns and transfers, FIFO ships the longer-dated lot and strands the one that expires first.
Do I need FEFO if my products don't expire?
No. FEFO needs a date to sort on, and it costs you a data-capture step at receiving. If nothing you sell carries an expiry, best-before or shelf-life limit, plain FIFO keeps stock turning and keeps the dock simple. Revisit the decision the first time you take on a dated product line, because the receiving process is where FEFO succeeds or fails.
How do I capture expiry dates at receiving without slowing the dock down?
Scan them where you can. Suppliers whose labels carry the lot and expiry Application Identifiers (AI 10 for batch or lot, AI 17 for expiration date, AI 15 for best-before) let receiving scan the date instead of typing it; ask for a sample label, because not every GS1-128 label includes them. For the rest, make lot and date required fields on the receipt and receive by lot. Either way the capture happens once, at the door.
Plan the route. We deliver the rest.
See how Binlogic powers last-mile logistics — routing, tracking, and the platform that turns the plan into the package on the doorstep.
Book a callback