All posts
Functional4 min read

Managing Product Expiry Dates and FEFO in Odoo

Configure Odoo to track product expiry dates by lot - enforcing FEFO picking, alerting on near-expired stock, and preventing expired goods from being sold or used in production.

Expiry Date Management in Odoo Inventory#

For food, pharmaceuticals, and other perishable products, expiry date tracking is both a quality requirement and a regulatory obligation. Odoo enforces FEFO (First Expiry First Out) picking and alerts you to near-expired inventory automatically.

Prerequisites#

Inventory → Configuration → Settings → enable:

  • Lots & Serial Numbers
  • Expiration Dates

Configuring Expiry Tracking on a Product#

Product → Inventory tab:

  • Tracking: By Lot (required for expiry tracking)
  • Expiration Time: number of days the product is valid from the production/receipt date
  • Best Before Time: advisory date (product is still safe but quality degrades)
  • Removal Date: Odoo removes this lot from FEFO consideration (for over-aged stock)

Recording Expiry Dates at Receipt#

When receiving a lot-tracked product:

Receipt → Detailed Operations tab → Lot/Serial Numbers:

  • Lot Number: LOT2027-09-001
  • Expiration Date: 2028-03-31 (enter manually or from vendor label)
  • Best Before Date: 2028-02-28

If a lot is received without an expiry date: Odoo calculates it automatically using the product's Expiration Time setting: Receipt Date + Expiration Days.

FEFO Picking Enforcement#

Inventory → Configuration → Locations → WH/Stock → Removal Strategy: FEFO

When a delivery is generated:

  • Odoo selects lots by expiry date (soonest expiry first)
  • Picker assigned to the lot that expires first - regardless of when it was received
  • This prevents accumulation of expired stock behind newer stock

Near-Expiry Alerts#

Inventory → Configuration → Settings → Removal Date → enable email alerts:

  • Alert X days before expiry (e.g., 30 days)
  • Notification: "Lot LOT2027-09-001 of Product X expires on 2028-03-31 - 25 units remaining"

Expired Lot Quarantine#

Inventory → Products → Lots/Serial Numbers → [Lot] → when past expiry date:

  • Status: Expired (Odoo prevents this lot from being auto-picked)
  • Manual transfer required: move to Quarantine for disposition
  • Disposition: scrap or return to vendor

Reporting on Expiry#

Inventory → Reporting → Expiration Dates:

  • All lots sorted by expiry date
  • Filter: expiring in next 30/60/90 days
  • Stock value at risk of expiry (valuable for write-off provisioning)

Try ERPeek on your own Odoo module - ask questions, scaffold tests, and explore your codebase in plain language.

Get started free