Short answer: In Odoo Inventory, FEFO (First Expired, First Out) suits products governed by expiry dates — medicines, reagents, packaged food — while FIFO (First In, First Out) fits goods that age without expiring, like spare parts. Odoo implements both through the removal strategy on each location, driven by lot expiry dates; the distributor’s job is to set the policy per product, configure it, and test that picks consume the right lot.
This article walks through a scenario — a pharmaceutical distributor — to show how FEFO and FIFO are configured, operated, and tested in Odoo. It covers the operational mechanics of lot tracking, expiry dates, and picking policy. It is not guidance on pharmaceutical regulatory certification or compliance.
When does FEFO suit a distributor — and when is FIFO enough?
A pharmaceutical distributor lives and dies by expiry dates. A box of amoxicillin that expires in March cannot be treated the same as a box that expires in December, even if the March box arrived last. Ship the December box first and the March box comes back — or worse, it reaches a pharmacy shelf too close to expiry to be sold. That is the core argument for FEFO: the lot that expires first leaves the warehouse first, regardless of when it arrived.
FIFO earns its place elsewhere in the same warehouse. Packaging materials, promotional inserts, and device accessories without a sterile expiry degrade or become obsolete with age, but no pharmacist rejects them on a date. For those, first-in-first-out keeps stock fresh enough without the overhead of expiry management.
The practical rule I use with distributors: if a product carries an expiry date that affects whether it can be sold or used, it gets FEFO. If it doesn’t, it gets FIFO. Mixing the two inside one location is where confusion starts — so in Odoo, the decision is made per product category and enforced per storage location.
What is the real difference between FEFO and FIFO?
People conflate the two because both deal with “oldest first,” but they measure different things:
Note the subtle trap in the picking row: under FEFO, a lot that arrived yesterday can legitimately jump the queue ahead of a lot that arrived last month. Warehouse staff who learned FIFO by habit will fight this — which is why the scenario below includes a testing step.
How do you configure lots, expiry dates, and removal strategies in Odoo?
Here is the reproducible setup I walk through with the distributor’s warehouse lead. Every step is standard Odoo Inventory — no custom module required.
Step 1 — Enable lot tracking with expiry dates. In Inventory settings, turn on “Lots & Serial Numbers.” On each pharmaceutical product, set tracking to “By Lots” and enable the expiry date option. From that point on, Odoo refuses to receive the product without assigning a lot, and every lot carries an expiry date field.
Step 2 — Capture expiry dates at receipt. When a purchase receipt arrives, the operator assigns (or scans) the lot number printed by the manufacturer and enters the expiry date from the packaging. This is the single most important data-capture moment in the whole process: everything downstream — picking, alerts, KPIs — depends on this date being correct. The walkthrough includes a validation where the supervisor spot-checks a sample of receipts against the physical labels.
Step 3 — Set the removal strategy per location. Open the warehouse locations. The finished-goods stock location for medicines gets removal strategy “FEFO.” The packaging and consumables area gets “FIFO.” This per-location split is the key design decision: one warehouse, two policies, each enforced by the location the stock sits in.
Step 4 — Define routes for expiry exceptions. Create a quarantine location for lots approaching expiry (say, under 90 days) and for expired lots awaiting disposal or vendor return. A scheduled internal transfer moves short-dated stock out of the pickable location so it never gets suggested for a sale. Whether the 90-day threshold is a push rule or a weekly review is a business decision — but it must be a decision, written down, not something the system “probably handles.”
Step 5 — Respect minimum shelf-life clauses. Distributor contracts often require a minimum remaining shelf life on delivery. The walkthrough covers reserving specific lots on sales orders when the contract demands it, and letting Odoo’s availability check enforce which lots qualify — so the sales team never promises a lot that is too short-dated.
What should picking behavior look like on the warehouse floor?
With FEFO configured, the delivery order suggests lots automatically: earliest expiry first. The picker’s handheld shows lot numbers in that order, and the walkthrough has the picker run three test orders — one where the earliest-expiry lot arrived most recently (the FEFO jump-the-queue case), one normal case, and one where the earliest-expiry lot is short-dated and should trigger the quarantine rule instead of being picked.
Under FIFO in the consumables area, the behavior is simpler: oldest receipt first. The point of testing both side by side is to show the team that the location — not the product alone — determines the behavior, which prevents the classic support ticket: “the system picked the wrong lot.”
Which expiry controls need testing before go-live?
Expiry management fails silently, so the scenario includes a test script that the distributor runs in a staging database before go-live:
- Receipt without an expiry date: attempt to receive a tracked product with no expiry date — Odoo should block it.
- Sale of an expired lot: try to deliver a lot past its expiry — the system must refuse or warn, depending on configuration.
- Short-dated quarantine: age a lot to within the threshold and confirm it moves out of the pickable location (or is flagged, per the agreed design).
- Minimum shelf-life clause: create a sales order requiring, say, 12 months of remaining shelf life and confirm Odoo only allocates qualifying lots.
- FEFO vs FIFO side by side: run identical picks in both locations and confirm the suggested lots follow the location’s strategy.
Each test gets a pass/fail recorded in the implementation workbook. Skipping this step is how distributors discover, six months after go-live, that expired lots were quietly shipping.
How do you track expiry exceptions as a KPI?
Once live, the distributor watches two numbers. The first is expiry write-off value: the cost of stock that expired in the warehouse, reviewed monthly and broken down by product. The second is short-dated interception rate: how much stock the quarantine process caught before it became unsellable. Both come from standard Odoo inventory reporting once lots carry expiry dates — no custom report needed for the basics.
The operational habit matters more than the dashboard. A short weekly review — what expired, what is about to, and whether purchasing ordered too much of it — is what turns expiry tracking from a report into a working control. This is the point in the scenario where I remind the team that Odoo enforces the policy they designed; it does not design the policy for them.
Frequently asked questions
Can one Odoo warehouse run FEFO and FIFO at the same time?
Yes — the removal strategy is set per location, not per warehouse. Keep FEFO products and FIFO products in different locations and each follows its own rule.
What happens if a lot has no expiry date under FEFO?
Treat it as a data error, not a system choice. Configure receipts so the expiry date is mandatory for FEFO-tracked products, and fix the receipt process rather than letting dateless lots float through picking.
Does FEFO slow down picking?
Marginally — the picker follows the system’s lot suggestion instead of grabbing the nearest box. In practice, barcode scanning makes the suggested-lot flow fast, and far cheaper than an expiry write-off.
Do we need a custom module for expiry alerts?
Usually not for the fundamentals. Odoo’s lot expiry dates, removal strategies, and quarantine locations cover the core flow; alerts and dashboards can be built with standard reporting and scheduled actions, and anything beyond that gets scoped as a small customization.
Review your expiry-stock setup before it costs you
FEFO vs FIFO is a ten-minute decision in a workshop and a six-month headache if you get it wrong. The distributor scenario above shows the full shape of getting it right: expiry dates captured at receipt, removal strategies set per location, quarantine routes for short-dated stock, and a test script that proves the system picks correctly before real orders depend on it.
If expiry stock matters in your warehouse, review your expiry-stock setup with Implementation Mode — a structured walkthrough of your lots, locations, and removal strategies is the fastest way to find the gaps while they are still cheap to fix.




