Who we are

About IT Horizon

A boutique technology house engineering enterprise systems with the precision of a luxury maison.

Our story
Odoo Partner

Comprehensive Odoo

End-to-end Odoo 20 Enterprise, implemented, customized, integrated and supported by our own senior team.

Become a client
Odoo apps

Every app, configured for the Gulf

Finance, sales, supply chain, HR, marketing and services apps implemented with the local tax, payroll and language rules each country needs.

All Odoo apps
What we do

Beyond ERP

Strategy, product engineering and customer-experience work that turns systems into advantage.

Talk to us
Sectors

Industry depth

Domain fluency across the sectors that define the GCC economy, and the regulations behind them.

Discuss your sector
Learn · grow · succeed

Insights

Real-world ideas, case studies and sessions to help your business work smarter with Odoo.

Browse the blog
Contact usالعربيةBook a consultation
Home/Blog/Odoo 20 · How-to
Odoo 20 · How-to · 8 min read

Lots, expiry dates and FEFO in Odoo 20 for distributors in Kuwait

Food and pharma distributors sell stock that expires, and the lot that leaves first should be the one that expires first. This guide sets up lots, expiry dates and First Expiry First Out (FEFO) picking in Odoo 20, with the details that matter for goods imported into Kuwait.

In Odoo 20, expiry dates live on lots and serial numbers. Each lot of a product carries an expiration date and three dates worked out from it: best before, removal and alert. With the FEFO removal strategy, Odoo reserves the lot with the earliest removal date for each delivery, stops offering lots past their removal date for sale, and asks for confirmation before anyone ships an expired lot.

The four dates on a lot

DateSet on the product asWhat Odoo does with it
Expiration DateDays after receiptMarks the lot as expired from that day. Delivering it needs a confirmation.
Best Before DateDays before expirationShown on the lot and printed in GS1 labels. It blocks nothing.
Removal DateDays before expirationSets the FEFO order. From this date the lot no longer counts as available to sell and is not reserved for deliveries.
Alert DateDays before expirationPuts the lot in the Expiration Alerts filter and gives the product’s responsible user a to-do.

An example: a yoghurt with an Expiration Date of 30 days, a Removal Date of 7 and an Alert Date of 10, received on 1 November, expires on 1 December, leaves the sellable stock on 24 November and raises an alert on 21 November.

Set it up in Odoo 20

  1. In Inventory → Configuration → Settings, Traceability section, tick Lots & Serial Numbers, then Expiration Dates, and save.
  2. In the same section, tick Display Lots & Serial Numbers on Delivery Slips and Display Expiration Dates on Delivery Slips if your customers check dates on the paperwork.
  3. On each perishable product, General Information tab, the type must be Goods. Set Tracking to By Lots.
  4. On the Inventory tab, Traceability section, tick Expiration Date and fill in the four day counts.
  5. In Inventory → Configuration → Categories, open the category of your perishable goods and set Force Removal Strategy to First Expiry First Out (FEFO). You can set FEFO on a stock location instead, under Logistics, but the category setting wins over the location.
  6. On the product’s Inventory tab, choose a Responsible user to receive the expiry alerts.

Receiving: use the date printed on the case

By default Odoo sets a new lot’s expiration date to the receipt date plus the product’s Expiration Date days. That fits goods you produce yourself. Imported goods arrive with the manufacturer’s date already printed, often after months of shipping and clearance, so the default overstates their shelf life.

  1. On the receipt, click Details on the product line.
  2. Enter the Lot/Serial Number and the Expiration Date printed on the case, one line per lot with its quantity.
  3. Validate. If you changed a date, Odoo moves the best before, removal and alert dates by the same number of days.

With a scanner it takes one scan per case. Set Barcode Nomenclature to Default GS1 Nomenclature in the Inventory settings, and the Barcode app reads the product (01), the lot (10) and the expiry date (17) from a GS1-128 label into the receipt. When a label carries only a best before date (15), Odoo adds the product’s Best Before days to get the expiry. See Zebra scanners with Odoo and Zebra barcode scanners.

Picking and delivery with FEFO

With FEFO, Odoo reserves lots in order of removal date, then of arrival date. A worked example: a distributor holds three lots of an infant formula and confirms an order for 300 tins.

LotOn handRemoval dateReserved for the order
L-041212020 December 2026120
L-051925015 February 2027180
L-060740030 April 20270

A lot already past its removal date is skipped, even when it is the oldest. It stays in On Hand but drops out of the free and forecasted quantities, so salespeople do not promise it and reordering rules order replacement stock in time. On a quotation, the stock shown for a line counts only lots that will still be before their removal date on the delivery date.

When someone ships an expired lot

A picker can still choose a lot by hand. If a delivery holds a lot that has expired or passed its removal date, Validate opens a confirmation that names it. Confirm ships it anyway, Proceed except expired removes the lines past their removal date and ships the rest, and closing the window takes you back to the delivery.

Alerts, reports and recalls

  • Expiration Alerts. In Inventory → Products → Lots/Serial Numbers, this filter lists every lot past its alert date. Add the Expiration Date and Removal Date columns from the optional columns menu, and group by product.
  • Daily to-do. When a lot with stock in your warehouse reaches its alert date, the daily scheduler gives the product’s responsible user an "Alert Date Reached" to-do, once per lot.
  • Recalls. Open the lot and click Traceability to see every receipt, transfer and delivery of it, with the customers who received it.
  • Delivery slips. With lots and expiry dates on delivery slips, your customers can match what they received to the lot you recall.

What we see go wrong in Kuwait

What happensCauseFix
Imported stock shows months more shelf life than the caseExpiry left to the default, receipt date plus daysEnter or scan the printed date at receipt
FEFO ignored on some productsFEFO set on the location, while the category forces FIFOSet FEFO as the Force Removal Strategy on the category
A customer refuses short-dated stockRemoval Date of 0 daysSet the Removal Date to the remaining shelf life your customers require on delivery
Old stock counted as sellableLots created without dates when tracking was switched onCount the stock again by lot and enter the dates
Alerts that nobody readsNo responsible user on the productName a responsible user on each perishable product

Supermarket chains and pharmacy groups often refuse deliveries below a minimum remaining shelf life. The Removal Date is how you hold that line in Odoo: stock that falls below it stops being reserved for orders.

We set up lot and expiry tracking for food, pharma and medical distributors in Kuwait and the Gulf: see Odoo for healthcare and pharma, Odoo Inventory and Odoo for trading and distribution.

What to do next

  1. List your perishable products and the remaining shelf life each customer requires on delivery.
  2. Switch on lots and expiry dates in a test database, set FEFO on one category, and run a receipt and a delivery through it.
  3. Book a consultation if you want help moving your stock to lots and expiry dates.
FAQ

Common questions

First Expiry First Out, a removal strategy that reserves the lot with the earliest removal date for each delivery. You set it on a product category as the Force Removal Strategy, or on a stock location.

Products of type Goods tracked by lots or by serial numbers. With the Expiration Dates setting on, tick Expiration Date on the product’s Inventory tab and fill in the day counts.

The expiration date is when the goods may become unsafe. The removal date comes a set number of days earlier: from then Odoo stops reserving the lot for deliveries and leaves it out of the quantity available to sell. FEFO uses it to order the lots.

Yes. With the Default GS1 Nomenclature, the Barcode app reads the lot (AI 10) and the expiry date (AI 17) from a GS1-128 label at receipt. If the label has only a best before date (AI 15), Odoo adds the product’s Best Before days.

Yes, but Odoo asks first. Validating a delivery with an expired lot, or one past its removal date, opens a confirmation where you can ship it anyway or ship everything except those lines.

Need help with your Odoo project?

Tell us what you are working on. A senior consultant will reply with how we would approach it.

Phone
+965 5015 3388
WhatsApp
Message us
Email
[email protected]
Office
Salem Al Mubarak Street, Salmiya, Kuwait
Hours
Sunday to Thursday, 8:00 to 19:00