How can custom software reduce picking errors, food waste, and reconciliation work in cold-chain distribution?
At 2:40 a.m., the operations director of a regional food distributor received a call from the warehouse. Two restaurants had changed their steak specification after the evening pick list was printed. Sales had acknowledged the changes in a customer chat, but the revised screenshot never reached the night shift. The truck was already loaded, so the team had to reopen insulated cartons and check the route again.
The regional distributor served about 180 restaurant locations. Its physical operation was mature: temperature-controlled storage, refrigerated vehicles, reliable suppliers, and experienced staff. Its information flow was not. Customers ordered through chat, account managers copied messages into spreadsheets, buyers planned replenishment from another workbook, warehouse staff picked from printed summaries, drivers collected signatures on paper, and finance reconstructed the month from dispatch notes, return photographs, and bank records.
The arrangement had once felt flexible. As customers and SKUs grew, flexibility turned into dependency on memory. A single order could exist as voice notes, screenshots, spreadsheet rows, and handwritten changes. Nobody could reliably answer which version the warehouse had executed. The central problem was not inattentive staff; every function saw only its own part of the transaction.
The project began with the operating lifecycle, not a storefront
The distributor also assessed the cost of duplicate entry, mismatches, waste, and reconciliation. The software project budget guide provides a useful structure for comparing continued manual work, packaged tools, and custom development on the same demand assumptions.
Management initially requested a customer ordering mini program. Field discovery showed that the order entry screen was only one junction. A restaurant might submit tomorrow's order at 4 p.m., add cases at 9 p.m., accept a substitute after a stock check, and reject damaged cartons at delivery. The quantity to bill could differ legitimately from the quantity first requested.
The team therefore mapped six connected stages: demand capture, commercial confirmation, inventory commitment, picking and verification, delivery, and settlement. Every stage had an owner, editable fields, a cutoff, and an exception route. Orders became versioned business records. When a customer added cheese, the original request, amendment, time, requester, and approver all remained visible. Warehouse staff worked only from the current confirmed version.
The design also allowed multiple entry channels. Larger chains could upload templates or integrate directly. Self-service customers used the mini program. Account managers entered chat orders into the same workspace for customers who did not want a new tool. Once confirmed, every order followed one shared fulfilment process. The distributor gained structured operations without forcing every customer to change overnight.
Product and inventory records became operational controls
Before automation, the same steak appeared under several names in sales, purchasing, and warehouse files. The implementation team established one SKU identity with specifications, pack sizes, unit conversions, storage zones, shelf-life rules, and approved substitutes. Customer terminology could remain on the customer-facing view, but it mapped to one internal record.
Inventory was recorded by warehouse, location, batch, production date, and status. Goods awaiting inspection were unavailable. Damaged goods were held. Near-expiry stock triggered review. Sales saw inventory that could actually be promised, not an undifferentiated accounting balance.
The system recommended batches using first-expiry-first-out rules and each customer's remaining-shelf-life requirements. Warehouse supervisors retained authority to change the batch, but had to record a reason and rescan it. Picking work was grouped by route and temperature zone. Carton codes connected the order, customer, product batches, and operators, which made later investigation practical.
The first handheld workflow was too slow because it required scanning each small unit. Instead of blaming adoption, the project team redesigned confirmation around packaging levels: sealed cases used a case code, while split quantities required item confirmation. Normal picking returned to its former pace and rework fell.
Delivery exceptions became structured work rather than disappearing messages
The driver app displayed stops, time windows, carton counts, contacts, and temperature requirements. At delivery, drivers confirmed actual cartons. Shortages, visible damage, temperature disputes, and customer returns required a reason and supporting evidence. Photographs were bound to the time, location, user, order version, and carton rather than left as unsearchable chat attachments.
Each exception had a distinct next step. A shortage could generate redelivery. A rejected quantity could adjust settlement. Returned goods generated a reverse-receipt task and entered a controlled inspection state. Customer service saw exceptions while vehicles were still on the route.
During the pilot, a driver found two leaking yoghurt cartons at the third stop. The system identified the later orders affected by the same stock. Dispatch located replacement stock on a nearby vehicle and scheduled a follow-up delivery. Sales informed the customer before the customer called. Five or six disconnected phone calls became one shared incident record.
Route planning remained decision support rather than a black box. Distance alone did not capture opening hours, unloading restrictions, vehicle types, temperature zones, or driver knowledge. Dispatchers could amend the proposed route and record why. Historical unloading times and delays were incorporated only after enough reliable data had accumulated.
Finance was designed into the transaction
The distributor served prepaid, weekly, monthly, and payment-on-delivery accounts. Some chains reconciled each location separately. The system kept ordered, dispatched, accepted, and billable quantities as distinct facts. Approved free goods, delivery damage, price adjustments, and later redelivery could no longer overwrite one ambiguous quantity.
Customer statements linked every difference to its source record. A customer could challenge a specific line instead of returning an entire spreadsheet. Automated invoicing was deliberately postponed until master data and billing rules had survived two complete cycles. During the first month, the system produced draft invoice lines for finance review. Automation followed demonstrated accuracy.
A route-sized pilot created adoption
The distributor piloted one route for two settlement cycles. The old spreadsheet remained a comparison source, not a competing instruction channel. Fifteen-minute end-of-day reviews dealt with concrete issues from that day's work.
The pilot revealed constraints that meeting rooms had missed: gloves made small controls difficult; metal shelving interrupted connectivity; underground loading areas prevented uploads; day and night deliveries used different contacts. Larger controls, offline task caching, background synchronisation, and time-based contacts solved practical obstacles.
Training followed roles. Account managers practised amendments and confirmations. Warehouse staff handled scans and exceptions. Drivers ran simulated acceptance, rejection, and redelivery tasks. Finance rebuilt the previous month from redacted records. Historical corrections used reversal entries, so managers could not silently alter the evidence chain.
Success was measured in business terms
The distributor recorded a four-week baseline and repeated the measurement after stable adoption. After three months of stable operation, version-related mismatches fell from roughly 18 per week to fewer than three. A batch trace that took about 40 minutes took around two. More than 90% of delivery exceptions were classified on the same day, compared with fewer than half before. Monthly reconciliation preparation fell from seven working days to two.
Waste did not improve immediately. The system initially exposed more near-expiry stock because previously it remained hidden until a count. Purchasing changed replenishment frequency and operations introduced an approved near-expiry sales process. By the third month, expiry write-offs were about 20% below baseline. The software made the issue visible; procurement and warehouse decisions created the result.
Some customer relationships also improved. Store managers did not necessarily sign in every day, but they valued concise confirmations listing specifications, delivery timing, and changes. Account managers spent less time arguing about message history and more time on replenishment advice.
Three decisions stayed human-led: emergency capacity for strategic customers, complex substitutions, and major quality disputes. The software assembled evidence, showed consequences, and preserved the decision. This boundary increased trust and generated cleaner data for future improvement.
The enduring asset was not a collection of screens. It was a shared operating language: orders had versions, stock had batches and states, deliveries produced evidence, exceptions had owners, and invoices had traceable reasons. Businesses considering a similar project should first agree when an order becomes binding, how inventory is committed and released, how delivery differences affect redelivery and billing, and who closes each exception. Once that loop works reliably, forecasting and optimisation have something dependable to build on.
Teams comparing packaged and bespoke options can use the custom-software decision framework to shape the first release.