Product expiry management

Track expiration dates, lot or serial records, FEFO, and alerts to control perishable stock in the warehouse.

The product_expiry module adds an expiration-management layer for short-life products such as food, pharmaceuticals, and chemicals. Odoo can automatically compute several date milestones from the receipt date, surface alerts, and exclude expired stock from usable availability.

Combined with lot or serial traceability and FEFO, it helps businesses reduce waste, ship the right batches first, and respond to at-risk stock before it creates sales or compliance issues.

Expiration Date
Lot
Serial Number
FEFO
Alerts
Inventory

Core business value

Key points

  • • Track Expiration Date, Best Before Date, Removal Date, and Alert Date on each lot or serial number.

  • • Automatically compute date milestones from product setup instead of manually entering every batch.

  • • Prioritize outbound moves with FEFO so batches with the earliest Removal Date go first.

  • • Create warnings when lots reach the alert threshold so warehouse or product teams can act early.

  • • Exclude lots past their Removal Date from available quantity and forecasted stock for more realistic operations reporting.


Important dates and fields

FieldsTrường dữ liệuDescription
Use Expiration DateSử dụng ngày hết hạnEnables expiration tracking on the product.
Expiration DateNgày hết hạnThe date after which the product should no longer be consumed or used.
Best Before DateSử dụng tốt nhất trước ngàyThe quality threshold before the product becomes truly expired.
Removal DateNgày loại bỏThe date after which the lot should be removed from usable stock and automatic reservation.
Alert DateNgày cảnh báoThe date when Odoo should begin warning users about the lot.
Available QuantitySố lượng có sẵnUsable stock after non-eligible lots are excluded.

Configuring products with expiry control

Steps

  • 1. Go to Inventory → Products → Products and open the item that needs expiration tracking.

  • 2. In the Inventory tab, find the Traceability section and enable Use Expiration Date.

  • 3. Enter Expiration Date as a number of days after receipt.

  • 4. Enter Best Before Date, Removal Date, and Alert Date as offsets before expiration.

  • 5. Save the product and validate the date logic with a sample receipt.

Meaning of each date setting

FieldHow it is enteredOperational meaning
Expiration DateDays after receiptDefines the true expiration milestone of the batch
Best Before DateDays before expirationRepresents the recommended quality window before expiry
Removal DateDays before expirationStops the batch from counting as usable or reservable stock
Alert DateDays before expirationStarts the early warning workflow

Managing lots and serial numbers

When a receipt creates a lot or serial number for a product that uses expiration control, Odoo computes the date milestones from the product setup. Users can still override the dates if a specific batch behaves differently in reality.

Key points

  • • The lot list can show Expired or Expiring badges so warehouse users can spot problems quickly.

  • • Some flows also support pasting multiple lots together with expiration dates for faster intake.

Steps

  • 1. Create a receipt in Inventory → Operations → Receipts.

  • 2. Add a product with Use Expiration Date enabled and open Detailed Operations.

  • 3. Enter the Lot or Serial Number for each received line.

  • 4. Review the dates calculated by Odoo and adjust them if the real batch differs from the default logic.

  • 5. Validate the receipt so stock is recorded together with the expiry metadata.


How FEFO works

FEFO stands for First Expiry First Out. In practice, Odoo often sorts by Removal Date so the batch that should leave usable stock first is prioritized during reservation.

Steps

  • 1. Go to Inventory → Configuration → Locations.

  • 2. Open the location where the rule should apply, usually the main stock location for perishable goods.

  • 3. In Logistics, set Removal Strategy to First Expiry First Out (FEFO).

  • 4. Save the location and validate the behavior on a sample delivery order.

How FEFO affects reservation

StepWhat Odoo doesExpected outcome
1Find lots that still have stock in the locationBuild the candidate batch set
2Exclude lots past Removal DateAvoid using stock that should no longer be shipped
3Sort remaining lots by ascending Removal DatePrioritize the batch that needs to move first
4Reserve in sequence until the quantity is metReduce the chance of leaving older stock behind

Alerts and near-expiry handling

Key points

  • • A daily CRON can find lots that reached their Alert Date and have not been flagged yet.

  • • Warnings often appear as activities or through an Alert Lots filter on the lot list.

  • • Once alerted, operations teams can prioritize shipment, discounting, transfer, or scrap depending on policy.

  • • If users need to verify quickly, they can jump from the product form to Lots/Serial Numbers through the smart button.


Expired stock handling and reporting

Steps

  • 1. When validating a delivery that contains expired lots, read the confirmation wizard carefully before proceeding.

  • 2. If stock must be removed, use Inventory Adjustment or Scrap according to internal control rules.

  • 3. Open Inventory → Reporting → Stock or Forecasted Inventory to review how expired lots affect usable quantities.

  • 4. Use Lots/Serial Numbers grouped by Expiration Date to monitor upcoming expiry waves by month or by product.

Common operating situations

SituationRecommended actionGoal
Lot reached Alert DatePrioritize shipment or discountingReduce waste before expiry
Lot passed Removal DateStop automatic reservation and review stockAvoid shipping stock that is no longer operationally valid
Lot already expiredScrap or handle through quality proceduresMaintain safety and compliance
Available quantity looks lower than expectedCheck lot dates and stock reportsUnderstand why stock is no longer counted as usable

Operating notes

Key points

  • • Removal Date and Expiration Date are not the same: removal supports warehouse control, while expiration is the true end-of-life date.

  • • If the day offsets are configured poorly, Odoo still computes dates, but FEFO and alerting will guide the team incorrectly.

  • • Stock reports may exclude lots past removal or expiry from available quantities, so users need to understand that logic before reconciling numbers.

  • • It is worth testing receipt, reservation, and delivery behavior on sample data before enabling the flow broadly for perishable product families.