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.
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
| Fields | Trường dữ liệu | Description |
|---|---|---|
| Use Expiration Date | Sử dụng ngày hết hạn | Enables expiration tracking on the product. |
| Expiration Date | Ngày hết hạn | The date after which the product should no longer be consumed or used. |
| Best Before Date | Sử dụng tốt nhất trước ngày | The quality threshold before the product becomes truly expired. |
| Removal Date | Ngày loại bỏ | The date after which the lot should be removed from usable stock and automatic reservation. |
| Alert Date | Ngày cảnh báo | The date when Odoo should begin warning users about the lot. |
| Available Quantity | Số lượng có sẵn | Usable 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
| Field | How it is entered | Operational meaning |
|---|---|---|
| Expiration Date | Days after receipt | Defines the true expiration milestone of the batch |
| Best Before Date | Days before expiration | Represents the recommended quality window before expiry |
| Removal Date | Days before expiration | Stops the batch from counting as usable or reservable stock |
| Alert Date | Days before expiration | Starts 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
| Step | What Odoo does | Expected outcome |
|---|---|---|
| 1 | Find lots that still have stock in the location | Build the candidate batch set |
| 2 | Exclude lots past Removal Date | Avoid using stock that should no longer be shipped |
| 3 | Sort remaining lots by ascending Removal Date | Prioritize the batch that needs to move first |
| 4 | Reserve in sequence until the quantity is met | Reduce 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
| Situation | Recommended action | Goal |
|---|---|---|
| Lot reached Alert Date | Prioritize shipment or discounting | Reduce waste before expiry |
| Lot passed Removal Date | Stop automatic reservation and review stock | Avoid shipping stock that is no longer operationally valid |
| Lot already expired | Scrap or handle through quality procedures | Maintain safety and compliance |
| Available quantity looks lower than expected | Check lot dates and stock reports | Understand 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.