Context
A leading bottling company, with several warehouses distributed throughout the country. Critical operation for large B2B clients —supermarkets, distributors, and wholesalers— where a stockout or a picking error is costly. The warehouse management system had been dragging on for years and had become a ceiling for growth.
The Problem
The legacy WMS was not designed for the current scale of the operation nor for the regulatory demands of the industry. Locating a batch in response to a customer claim or an audit could take 4 hours: reviewing spreadsheets, consulting multiple operators, cross-referencing data by hand. Picking errors were at 2.4% of the total shipped and were transferred to products on the street, resulting in costs for replacements and claims.
Internally, the operations team lived with a system that did not integrate with production or quality control. Every inventory closure was manual, every reconciliation took hours, and any new business requirement ended up living in a spreadsheet parallel to the system.
What We Did
We built a custom WMS in .NET to replace the legacy system, without halting operations. We designed batch-level traceability directly from the data model: every movement (production → warehouse → loading → dispatch) is linked to a unique batch identifier queryable in seconds. On top of that core, we built modules for picking, truck loading, quality control, and integration with existing systems.
Traceability by design. Every stock movement writes to a batch event model from the first record. The traceability query is resolved directly on that model in a single operation.
Warehouse-by-warehouse migration, in parallel with the old system. We migrated one warehouse at a time, keeping the legacy WMS running as a backup. This allowed for adjustments against real operations before scaling to the rest of the network.
Picking guided by physical proximity. The system sequences picking by location within the warehouse instead of following the entry order of the orders. This reduced assembly time and errors.
Truck loading optimized by product and destination. The module distributes pallets considering weight, fragility, and unloading sequence. Fewer reorganizations en route, fewer breakages.
Why It Worked
Traceability written into the data model from the first record.
Warehouse-by-warehouse migration in parallel with the old system: zero days without operations.
The warehouse operator did not have to change their way of working.
Stack
.NET
Razor
Entity Framework
SQL Server
Azure DevOps
Results
From 4 hours to 30 seconds: locating a batch during a claim, audit, or recall.
From 2.4% to 0.3% picking errors (−87%).
Automated daily inventory closure, with no manual reconciliation.
Integration with production and quality control systems without rewriting them.
Food and beverage regulatory compliance secured directly from the data model.
