We used to argue about which link in the chain broke a load. Now we know before the truck reaches the dock, and most of the time we can still save the margin.
VP of Operations, regional fresh-produce distributor
Results
The challenge
A regional fresh-produce distributor was carrying spoilage write-offs at roughly 9% of inbound volume — high enough to be the single largest controllable cost on the P&L, and stubborn enough that three years of operational initiatives had failed to move it more than a point in either direction.
The deeper problem was not the spoilage rate. It was that nobody could explain it. Grower load tickets lived in one system. Reefer telemetry from the carrier fleet streamed into a second. Cross-dock scans sat in a WMS that did not share keys with either. DC putaway and pick events lived in the ERP. When a lot of strawberries showed up soft, the post-mortem started with four people on a call trying to reconcile timestamps and shipment numbers across four systems, usually three or four days after the fact, by which point the lot was gone, the truck was elsewhere, and the answer was always “could have been any of a dozen things.”
The cost of that ambiguity was not just the write-offs themselves — it was that operations had no leverage to change anything upstream, because they could not credibly assign cause.
The approach
We treated the canonical shipment ID as the deliverable, not any dashboard. The first six weeks of work were upstream of any visual:
- Negotiated a shared shipment identifier across the grower portal, the carrier telemetry feed, the WMS, and the ERP. Where the carrier feed could not emit it natively, we matched on a composite key (origin, departure window, trailer, route) and back-filled.
- Stood up a shipment-grain fact table: one row per lot per shipment, with the full chain of custody attached — pickup conditions, in-transit temperature curve and breach events, dwell time at any cross-dock, receiving condition score, and downstream sell-through or write-off outcome.
- Built a feature library on top of that fact table. Cumulative time-above-threshold by commodity. Compounding effects of pickup-temperature plus dwell. Grower-by-route interaction effects that no single dashboard had ever surfaced because the data had never been in one place.
Only then did we build the operational layer. A risk score per in-transit shipment, refreshed every fifteen minutes against the live telemetry, with a calibrated threshold per commodity. Anything crossing the threshold raised an alert into the receiving DC’s morning huddle queue, with the underlying breach evidence attached, so the team could decide before the truck arrived whether to reroute the lot to a closer customer, reprice it for fast-flow, or accelerate it through cross-dock to compress remaining shelf life.
The results
Within two quarters of the operational layer going live, the numbers we set out to move all moved:
- Spoilage write-offs as a percentage of inbound volume fell from 9.1% to 6.6% — a 27% relative reduction, and the largest single-year movement on that metric in the company’s history.
- Mean time to root-cause a bad lot dropped from roughly four days to about six hours, because the chain of custody was already assembled by the time anyone went looking for it.
- The receiving DCs are now flagged on roughly 140 at-risk lots per week, the large majority of which are saved through reroute or repricing actions that simply were not possible when the data arrived after the truck did.
- Reefer temperature breaches caught before the truck reached the receiving dock rose 83%, which is mostly a story about the alert layer existing at all rather than about better sensors.
The harder-to-quantify result is the conversation with growers. Operations now walks into grower reviews with shipment-grain evidence — this lot, this route, this temperature curve, this outcome — instead of aggregate complaints. Two of the three growers most associated with elevated risk changed their pickup procedures within a quarter of being shown the data.
What we would do again
The sequencing was load-bearing. The instinct in the room — and the one we pushed back on — was to start with a spoilage dashboard. A dashboard on top of unjoined data would have reproduced the same arguments in a prettier interface. The canonical shipment ID, owned upstream of any visual, is what made every downstream analysis cheap. The in-transit alert layer is what turned the analytics from a post-mortem tool into a margin-saving one, and we would build it on day one again.