Lots and expiry dates, only where they matter
Turn them on per product. A tin of paint does not need a lot number; a pallet of yoghurt does, and the difference should not cost you two extra columns everywhere.
Each product carries two switches: lot required and expiry required. Stock of a product with those switches on cannot be registered without the data, which is what makes the field trustworthy later. Products without them stay simple.
An expiry date is only useful if it reaches the person doing the picking. The dashboard counts what expires within thirty days and the stock list filters to exactly those lines, each with its lot and its location — so the weekly question, what has to go out and where is it, takes one click rather than a sort and a walk.
The dashboard counts what expires within the next thirty days, and the stock list has an “expiring soon” filter, so the question “what do I need to move this week?” has an answer that takes one click rather than a sort and a squint.