A wholesale bakery client came to me with a very specific complaint: their previous system could not tell them, on a Tuesday morning, whether the flour they'd receive from a new supplier lot would push a batch of croissants past its sell-by date before it even shipped. That is a lot-tracking-plus-shelf-life problem, and it is exactly the kind of thing Acumatica's Manufacturing Edition is built for — provided you set up lot classes and BOMs correctly, which most bakery implementations do not.
Manufacturing Edition, not Distribution Edition
The instinct with a bakery is to reach for Distribution Edition because the daily workflow looks like "receive ingredients, ship finished goods." That is wrong the moment there is a recipe involved. A croissant is a manufactured item with a Bill of Material (flour, butter, yeast) and a routing (mix, proof, bake, cool, pack), even if the "factory" is a single kitchen. Acumatica's Manufacturing Edition gives you BOMs, production orders, and material issue against a batch — Distribution Edition does not have any of that. I have seen two bakery implementations limp along on Distribution Edition with inventory kits standing in for BOMs, and both eventually needed a rebuild once the client wanted real batch costing.
Lot classes carry the expiry logic
Acumatica supports defining shelf life on an item's lot/serial class, with expiration dates tracked per lot and first-expired-first-out (FEFO) picking available at issue time. That is the feature that answers "will this be stale before it ships." The setup that actually works for a bakery:
Lot/Serial Class: BAKE-FRESH
Numbering: Auto (per production date)
Track Expiration Date: Yes
Shelf Life (days): 3 (croissants), 21 (packaged rusks), etc — one class per shelf-life band
Issue Method: FEFO (First Expired, First Out)
Assign a lot class per finished-good item, not one generic class for the whole catalogue — a bakery makes items with wildly different shelf lives, and lumping them into one class means the FEFO picking logic is meaningless for the items where it matters most.
This is a known gap, not a rumor: FEFO picking suggests the right lot, but nothing in stock Acumatica hard-blocks a warehouse worker from manually overriding to an expired lot on a shipment. For food safety-critical operations I add a customization — a PXAction validation on the Shipments screen that checks the selected lot's expiration date against the current date and throws a hard stop, not just a warning, before the shipment can be confirmed. That is maybe 40 lines of C# in a graph extension, and it is the single highest-value customization I build for bakery clients.
Daily batch production, not discrete manufacturing
Out of the box, Acumatica's production order flow assumes discrete orders raised against demand — reasonable for a furniture shop, awkward for a bakery baking the same 40 SKUs every morning regardless of confirmed orders. The pattern I use is a small scheduled job (or a manually-triggered mass-create screen) that generates the day's production orders from a standing production schedule rather than from sales orders, using Acumatica's Production Order Maintenance API. It is closer to a "make to forecast" pattern than "make to order," and it is not something the base product templates for out of the box — you are building a thin scheduling layer on top of standard AM screens.
Wrapping up
A bakery is a manufacturing business wearing a retail counter, and the Acumatica fit follows from that: Manufacturing Edition, lot classes tuned per shelf-life band, and a hard stop on expired-lot shipments because the platform will not enforce that for you. The gap that surprises people is not a missing module — it's that FEFO is advisory, not mandatory, until you make it mandatory yourself.
Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.