Work Kaiho Freight
Thirty years of paper moved online without a single day of downtime
Customs, capacity and reconciliation lived across four systems and a great deal of Excel. We replaced all of it in nine months while shipments kept moving.
- Industry
- Logistics
- Year
- 2025
- Stack
- Cloudflare Workers · D1 · React · Design system
−63%
time per shipment
The problem
Four systems, none of which agreed. The same shipment had one number in customs and another in reconciliation. Errors were not caught — they were absorbed by hand at month end, and absorbed means nobody knew how many there had been in a year.
The constraint
This is a company that ships every day. "Two days of downtime for the cutover" is a request to stop trading for two days, so from the first week the premise was that the old system and the new one both had to be correct at the same time.
The approach
We established a single shipment identity first, then moved traffic across one module at a time. Any given week was a safe place to stop — not out of caution, but because on a nine-month project one of those weeks will go wrong.
One decision
No big-bang data migration. The two systems ran in parallel for four months, every shipment written to both, with an automated daily comparison. For the first six weeks the comparison found differences every day, and that list of differences was everything the specification had missed.
The trade-off
Parallel running costs something real: a second write path to maintain, another reconciliation report, roughly thirty per cent more engineering time. We judged it worth paying, because the failure mode of the alternative was halted shipping.
The outcome
63% less handling time per shipment, and month-end close went from five days to same-day. Nine months, no interrupted shipping, and no rollback.
Since then
A year after handover they added two new customs categories themselves, without asking us. That is how we judge whether a system was built correctly.