A shipping platform, rescued
A shipping platform a business had built years earlier to move parcels for a larger warehouse system: several carriers, tracking numbers, package records. It ran, and nobody wanted to be the one to touch it.
Before
PHP 5.6. Years past end of life. The host could withdraw it on any date it chose.
One copy of the code. No source control. The version running in production, on the production server, was the only one anywhere.
Pages built by hand. HTML printed from echo statements with jQuery sprinkled on top. Every screen a one-off.
Not one test. Nothing automated. Whether a change had broken something was found out by shipping.
Keys in the code. Carrier credentials hard-coded into the application source.
Two carriers, copied and pasted. No core to speak of: the second carrier was the first one duplicated and edited. A third would have been a third copy.
The plan
Read it, then write down what it does. The business and user cases extracted from the code: shipping with several carriers, tracking numbers, storing and updating package records, tracking.
A roadmap in vertical slices. Milestones and phases, each ending in something usable. A backlog of real work items, not a phase called "rewrite".
One-week sprints. Something shipped and shown every week. The old platform kept moving parcels the whole time; nothing switched over on a weekend.
Replace, then extend. First the rework carrying every existing rule; only then the things the old platform could never have done.
the rework new carriers rate shopping old platform running something usable delivered
After
Four months. A working rework with every business rule, every user case and both carriers, and the old platform retired behind it.
One more month. Three new carriers: DHL, Purolator and Nationex. On the old code, each would have been another copy.
Two more months. Rate shopping across carriers — the feature the business had wanted for years.
| When | What | Delivered |
|---|---|---|
| Months 1–4 | The rework | Every rule and user case, both carriers, the old platform retired |
| Month 5 | New carriers | DHL, Purolator, Nationex |
| Months 6–7 | Rate shopping | Across all carriers |
The verdict
Modernization — the fourth way out — and not by reflex. The code was read first. With no source control, no tests, no core and credentials in the source, there was nothing to stabilise around; the honest answer was to rebuild in slices while the old platform kept running, which is what a rescue plan is for. On a system with a sound core the verdict would have been different, and the report would have said so.
Modernization. Gradually replace pieces of the old system while it keeps running — one module, one integration, one screen at a time. No switchover weekend, no bet-the-company rewrite. The four ways out · what the report that decides between them looks like.
Yours would start the same way. A health check reads the code first and says which way out fits, in a report you keep whether or not you continue.
Book a health check →