TL;DR
FEFO (First-Expired, First-Out) is an inventory rotation method that picks and ships the earliest-expiring lots first, regardless of when they arrived at the warehouse. To ensure FEFO for perishable inventory, you need three things working together: accurate date capture at the receiving dock (using GS1 barcode standards), a WMS configured with FEFO allocation rules and minimum shelf-life gates, and exception controls that quarantine anything that shouldn’t ship. This guide covers the full process from dock to dispatch, with the specific WMS settings, barcode standards, and KPIs that make FEFO actually stick.
What FEFO Means (and Why It’s Not the Same as FIFO)
FEFO stands for First-Expired, First-Out. It is an inventory rotation method where stock with the earliest expiration or best-before date gets picked and shipped first, regardless of when it was received into the warehouse. If a pallet that arrived on Monday carries a June 30 expiry, but a pallet that arrived the previous Thursday carries a July 15 expiry, FEFO sends the June 30 pallet out first.
This is different from FIFO (First-In, First-Out), which rotates stock based on receipt date. FIFO assumes the oldest-received inventory should move first. That assumption works for non-perishable goods, but it falls apart when different lots of the same SKU carry different expiration dates, which happens constantly in food, pharma, cosmetics, and supplements. LIFO (Last-In, First-Out) is a valuation method largely irrelevant to perishable rotation.
A useful rule: when two lots share the same expiry date, use FIFO as the tie-breaker (ship whichever arrived first). Your finance team can still use FIFO or weighted-average for cost valuation while operations runs FEFO for physical rotation. These are separate concerns.
Why FEFO Matters: Waste, Safety, Compliance, and Customer Trust
The waste problem is enormous
ReFED reports that food waste in the United States remains stubbornly high despite incremental progress, with tens of millions of tons of surplus food generated annually. Poor date rotation in warehouses and distribution centers is a direct contributor. Every expired case that gets written off instead of shipped is margin burned.
Regulators expect FEFO, not just recommend it
In pharmaceutical and healthcare distribution, FEFO is not optional guidance. The WHO Good Distribution Practices (GDP) explicitly require that stock be rotated so the earliest-expiring product ships first, with controls in place to prevent expired goods from reaching patients. The EU GDP mirrors this language: “Stock should be rotated according to the ‘first expiry, first out’ (FEFO) principle.”
For food operations, U.S. date labels like “Best if Used By” are mostly voluntary, with infant formula as the sole exception. This means you cannot rely on consumer-facing labels to manage safety. Operational FEFO controls are the actual safeguard.
Customers notice
A DTC customer who receives a protein bar expiring in two weeks, when a three-month lot was sitting in the same warehouse, will not reorder. B2B retail buyers will reject shipments and issue chargebacks. FEFO protects the relationship.
The Backbone of FEFO: Capturing Dates and Lots Correctly
Nothing downstream works if expiry data is wrong or missing at receiving. This is the single point of failure in most FEFO breakdowns.
GS1 barcode standards you need to parse
The GS1 system encodes expiration and lot data into barcodes using Application Identifiers (AIs):
- AI (17) encodes the expiration date in YYMMDD format
- AI (10) encodes the batch or lot number
- AI (01) is the GTIN (product identifier)
Your scanners and WMS must be configured to parse these AIs from GS1-128 and DataMatrix barcodes. A common failure: AI (10) is variable-length, so scanners must recognize the field terminator before reading AI (17). Practitioners on Reddit’s r/barcodes report that misconfigured parsers silently append lot characters to the expiry field, creating phantom dates in the system.
If your integration layer connects your WMS to platforms like Shopify or Amazon, expiry and lot data needs to flow cleanly across systems, not just live in the warehouse.
License-plate labeling (LPN/SSCC)
Assign a unique Serial Shipping Container Code (SSCC) to every pallet, tote, or carton at receiving. This “license plate” ties the physical unit to its lot, expiry, PO, and location in the WMS. The container then moves as one trackable object through putaway, storage, and picking.
GS1 defines the SSCC as the standard logistic-unit identifier. Practitioners on Reddit’s r/logistics emphasize that LPNs are critical for speed: instead of scanning individual items during picks, the system knows what’s inside each labeled container and directs pickers to the right one.
One warehouse operations manager shared on r/ManufacturingStack: “Treat expiry date as a first-class field at receiving. Print the license-plate label at the dock with lot, expiry, and PO baked in.” This reduces bad receipts and accelerates every FEFO pick that follows.
FEFO vs. FIFO in Real Life (and “Dynamic FEFO” for Cold Chain)
FIFO often fails as a proxy for FEFO in cold-chain environments. The assumption that the oldest stock will expire soonest breaks down when temperature isn’t uniform.
Research highlighted by the Foundation for Food and Agriculture Research (FFAR) shows that temperature gradients inside coolers and trailers can invert expected aging. Cases stored near the door of a refrigerated trailer experience more temperature variation than cases in the center. The edge cases may actually expire faster, even though they were loaded at the same time.
This concept, sometimes called “dynamic FEFO,” means allocation decisions should factor in condition data (temperature exposure, time at ambient) alongside printed expiry dates. For most operations today, this translates to tighter QA holds on temperature-excursion pallets rather than full predictive modeling. But the principle matters: oldest-in is not always earliest-to-expire.
Minimum Remaining Shelf-Life Rules: Where FEFO Meets Policy
Ensuring FEFO for perishable inventory goes beyond “ship the soonest-expiring lot.” Most channels and customers impose minimum remaining shelf-life requirements at receipt or dispatch. If you ship a FEFO-compliant lot that arrives with only 30 days left on a product where the customer requires 90, that’s a rejection.
Real examples operators face
| Channel/Customer | Minimum Remaining Life Requirement |
|---|---|
| U.S. DoD procurement | Often 85% of total shelf life at first government receipt |
| CVS (national brands) | 75% remaining at DC receipt (50% for store brands) |
| Amazon FBA | Typically 105+ days remaining at fulfillment center receipt |
| Export channels | Often total shelf life minus transit time, contract-specific |
These are not suggestions. Short-dated stock gets refused, disposed of, or charged back. Your WMS must encode these thresholds as hard allocation gates, not rely on pickers to do mental math.
How to Ensure FEFO for Perishable Inventory: The End-to-End Flow
Here is the step-by-step process, from dock to dispatch, that makes FEFO work consistently.
Step 1: Receiving, the make-or-break moment
Scan AI (01) GTIN, AI (10) lot, and AI (17) expiry for every inbound unit. Block putaway until the expiry date is captured in the WMS. Auto-print an LPN/SSCC label at the dock that associates the location, lot, expiry, and quantity.
Enforce inbound minimum remaining shelf-life thresholds by SKU. If a supplier delivers product with only 60% of its shelf life remaining and your rule requires 75%, segregate the load and flag it for return or disposition. This is where practitioners on Reddit stress that supplier SLAs matter more than warehouse heroics. If you accept short-dated product at the dock, you’ll spend the rest of its life fighting losses downstream.
Step 2: Putaway and slotting
Slot soon-to-expire lots near active pick faces so they get picked first. Flag short-dated inventory to special zones (clearance, markdown, alternate channel) to accelerate rotation. Expiry-aware slotting reduces unnecessary travel and makes FEFO the path of least resistance for pickers.
Step 3: Allocation and picking
Set FEFO as the default allocation rule in your WMS. Apply channel or customer overrides for minimum days remaining at ship. For example, a DTC snack brand might set a 14-day dispatch minimum for domestic orders (accounting for 1 to 5 days of transit) but a 45-day minimum for wholesale accounts.
The tie-breaker when expiry dates match: FIFO, ship whichever lot arrived first. If no lot can meet the customer’s minimum remaining life requirement, the system should block the allocation, not silently ship a short-dated unit.
Critically, FEFO must be allocation logic, not picker judgment. The handheld tells the picker exactly which LPN to grab from which slot. Practitioners on r/ManufacturingStack are clear on this point: “FEFO can’t be a training memo. It has to be a system rule.”
For operations that need to maintain speed alongside compliance (like Seller Fulfilled Prime workflows with same-day shipping cutoffs), system-directed FEFO picks are faster than manual date-checking, not slower.
Step 4: Exception holds and quarantine
Auto-quarantine lots that are recalled, damaged, involved in a temperature excursion, or have unverified expiry data. WHO GDP expects controls that prevent expired or unsuitable stock from shipping, with documented exceptions only.
Step 5: Alerts and liquidation triggers
Configure tiered alerts at category-appropriate intervals. For a product with a 12-month shelf life, 90/60/30-day alerts work. For a 30-day product, you might need 14/7/3-day triggers. Escalate to markdowns, alternate channels, donations, or return-to-vendor before expiry hits.
Step 6: Dispatch and documentation
Record lot and expiry on every shipment. Pick confirmations should verify that the dispatched product meets the customer’s shelf-life rules. WHO GDP requires batch and expiry capture at both dispatch and receipt for traceability and recall readiness.
For healthcare and other regulated SKUs, 4fillment supports FEFO with lot and expiry tracking, quarantine, and chain-of-custody workflows.
WMS Settings Checklist for FEFO
Getting FEFO right is a configuration problem, not a training problem. Many teams have FEFO “available” in their WMS but mis-configured. As one supply chain manager noted on r/supplychain, the fix is changing allocation rules and adding hard stops, not sending more training emails.
Master data (per SKU)
- Expiry-controlled: yes/no flag
- Total shelf life (days)
- Inbound minimum remaining life (% or days)
- Dispatch minimum life by channel or customer (% or days)
Scanning configuration
- Parse GS1 AIs 01, 10, and 17 from GS1-128 and DataMatrix
- Enforce manual data entry when barcode is missing or unreadable
- Reject malformed or implausible dates (e.g., expiry in the past)
Allocation rules
- Primary sort: FEFO (earliest expiry first)
- Tie-breaker: FIFO (earliest receipt date)
- Hard block: deny allocation below dispatch minimum life
- Route short-dated stock to clearance or alternate channels
Exception logic
- Location-level quarantine capability
- Temperature breach flags for cold-chain lots
- Hold codes for recalled, damaged, or unverified-expiry inventory
License-plate handling
- SSCC label generation at receiving
- Nested LPN support (pallet > case > each)
- Lot and expiry carried at container level for fast moves
Reporting
- Near-expiry inventory report (by zone, SKU, days remaining)
- Expiry write-off report by SKU and supplier
- Shelf-life compliance rate by channel
- Average remaining shelf life at dispatch
If you’re evaluating a 3PL partner and want to understand how onboarding and WMS configuration works in practice, ask specifically about these settings. A provider that can’t explain their FEFO allocation logic in detail probably doesn’t have it configured correctly.
KPIs That Prove FEFO Is Working
Configuring FEFO is step one. Proving it works, consistently, requires measurement.
Expiry write-off rate. Expired units as a percentage of total shipped or on-hand inventory, trended monthly. This is the headline metric. If it’s going up, FEFO isn’t holding.
Shelf-life compliance rate. The percentage of orders that meet the minimum remaining shelf-life requirement for their specific channel or customer. Track this by channel (DTC, retail, FBA, export) because each has different thresholds.
Average remaining shelf life at dispatch. Measured in days or as a percentage of total shelf life. A healthy FEFO operation shows this metric stable or improving over time, not eroding.
Near-expiry stock coverage. The value or days of supply sitting under your alert threshold. High and rising means you’re accumulating risk.
Receiving compliance. The percentage of inbound lots that pass your minimum remaining shelf-life acceptance check, broken out by supplier. Low compliance from a specific supplier is a procurement problem, not a warehouse problem.
Common Pitfalls (and How to Fix Them)
“We capture expiry after putaway.” This is the most common failure. If the lot is already racked before the expiry date hits the system, it’s invisible to FEFO allocation. Fix: capture at the dock, print the LPN with lot and expiry, block putaway until the data is validated.
“Our scanners don’t read the date.” Usually a parsing problem, not a hardware problem. GS1 AI (10) is variable-length and needs a field separator (FNC1) before the scanner reads AI (17). Confirm your scanner firmware and WMS parser handle this correctly.
“FEFO slows our pickers down.” It shouldn’t. If pickers are manually checking dates on shelves, that’s a slotting and allocation failure. System-directed picks with the correct LPN and slot eliminate date-checking entirely. The handheld tells them where to go and what to grab.
“The oldest product in our cooler isn’t expiring first.” This is the dynamic FEFO problem. Temperature variation within cold storage means FIFO isn’t a reliable proxy for expiry order. Address it with tighter temperature monitoring, QA holds on excursion pallets, and condition-based rotation where possible.
“We have FEFO turned on, but people override it.” Remove the ability to override without a documented exception and supervisor approval. WHO GDP allows FEFO exceptions but only with controls that prevent expired product from shipping. Soft overrides defeat the purpose.
Who Should Own FEFO in Your Organization
FEFO breaks down when accountability is spread too thin. A simple RACI:
- Receiving team: Date and lot capture, LPN creation, inbound shelf-life acceptance checks
- Inventory control: FEFO allocation configuration, cycle counts biased toward near-expiry zones
- QA/Regulatory: Hold and quarantine decisions, shelf-life standards by channel, audit trail reviews
- Operations analytics: Expiry forecasts, markdown triggers, supplier scorecards
Two Real-World Examples
Food DTC brand with short transit windows
A snack subscription company ships nationwide with 1 to 5 day ground transit. Their granola has a 90-day shelf life. They set a dispatch minimum of 30 days remaining, which ensures every customer receives product with at least 25 days of life even on the longest transit lanes. At receiving, they reject any lot with less than 60 days remaining. Their WMS runs FEFO allocation, routes anything under 35 days to a “flash sale” channel, and writes off anything that hits 14 days without a destination.
Healthcare distributor under GDP
A medical device distributor operates under WHO GDP. Every lot receives a license-plate label at the dock with GTIN, lot, expiry, and PO. The WMS allocates FEFO and records batch and expiry at dispatch. If a temperature excursion flag hits a pallet, it goes to quarantine automatically. Dispatch records include lot and expiry for every shipment to enable recalls within 24 hours.
Ensuring FEFO for Perishable Inventory Starts at the Dock
The pattern across every successful FEFO operation is the same: capture clean data at receiving, configure the WMS to enforce expiry-based allocation with hard stops, measure continuously, and hold suppliers accountable for delivering adequate shelf life. Everything else, the alerts, the liquidation paths, the reporting, is downstream of getting those fundamentals right.
If you’re running perishable inventory through a 3PL and need FEFO with lot tracking, quarantine workflows, and compliance documentation, explore 4fillment’s fulfillment services or request a proposal to get a FEFO readiness assessment.
For more on inventory management and compliance topics, visit the 4fillment blog.
Frequently Asked Questions
Is FEFO legally required?
For pharmaceuticals and medical products distributed under GDP/GMP frameworks, yes. Both WHO GDP and EU GDP explicitly require FEFO rotation. For U.S. food, FEFO is best practice rather than a statutory requirement, since most date labels (except infant formula) are voluntary. That said, retailer contracts, customer expectations, and waste reduction goals make FEFO effectively mandatory for any serious perishable operation.
What if my suppliers don’t include expiry dates on their labels?
Require GS1-compliant labeling as a condition of doing business. Enforce ASN (advance shipping notice) data that includes lot and expiry. At receiving, reject or segregate non-compliant loads. This is a procurement problem that needs a procurement solution, not a warehouse workaround.
How do I audit whether FEFO is actually working?
Pull pick transaction trails and compare the expiry dates of picked lots against what was available in inventory at the time of allocation. If a later-expiring lot was picked when an earlier-expiring lot was available and eligible, that’s a FEFO violation. Also track shelf-life at dispatch and verify that blocked picks below minimum thresholds are actually being blocked.
Can FEFO and FIFO run at the same time?
Yes. FEFO governs physical rotation (which lot ships first), while FIFO or weighted-average can govern financial valuation (how cost of goods sold is calculated). These are independent systems. Your WMS handles FEFO; your ERP handles cost accounting.
Does FEFO slow down warehouse operations?
Not when implemented correctly. FEFO should be system-directed allocation logic, not a manual process where pickers check dates on shelves. The WMS assigns the pick to the correct LPN and location. Pickers follow the handheld instruction. In many cases, proper FEFO slotting (short-dated product near active pick faces) actually reduces travel time.
What’s the difference between “minimum life on receipt” and “minimum life at dispatch”?
Minimum life on receipt (sometimes called MLOR) is the threshold a lot must meet to be accepted into your warehouse from a supplier. Minimum life at dispatch is the threshold a lot must meet to be shipped to a specific customer or channel. Both are needed. The first protects you from suppliers dumping short-dated stock. The second protects your customers from receiving product too close to expiry.
What is dynamic FEFO?
Dynamic FEFO accounts for real-world conditions (primarily temperature exposure) that affect actual remaining shelf life, rather than relying solely on the printed expiry date. In cold-chain environments where temperature varies by location within a cooler or trailer, two cases with the same printed expiry may have meaningfully different true remaining life. Dynamic FEFO uses condition data to adjust rotation priorities.
How quickly can a 3PL implement FEFO for my products?
It depends on the complexity of your SKU catalog and channel requirements. A 3PL with FEFO-capable WMS infrastructure can typically configure lot and expiry tracking, allocation rules, and shelf-life gates during standard onboarding. The critical question to ask is whether their system enforces FEFO through hard allocation logic or merely supports it as an optional setting.