Shop integrations moved off an old core system, with no downtime
Shiptimize’s shop and marketplace integrations lived inside the old Perl core that runs the whole business. We moved every one of them to a new service, one at a time, while merchants kept printing labels.
The situation
Shiptimize is a multi-carrier shipping platform for online shops. It is also sold as PakketMail and white-labelled for carriers across Europe. Shops send orders in; the platform picks the carrier, prints the label and tracks the parcel. Its core is a large Perl system that changes every week.
What made it hard
It could never stop. Labels print all day for live merchants, and a bug in an import does not show up as an error. It shows up as a parcel shipped twice, or an order that never arrives.
What we did
- Moved every shop and marketplace integration, including Shopify, eBay, Otto, Etsy, Kaufland and Mirakl, out of the Perl core into one new Node.js service. Each port matched the old behaviour exactly before anything was improved.
- Ran the new path in shadow against live orders before rollout, then moved traffic one workflow at a time, with the old path ready behind it.
- Wrote a catalogue of ways to break the service before merchants could: crashes mid-import, failing dependencies, races and duplicate deliveries. It caught defects that could have created duplicate parcels or silently lost an order.
- Kept every existing check on the old system passing.
- Made deployment fit the servers Shiptimize already runs, so a FreeBSD host deploys with a git pull and no build step.
- Added a health check, a service script and clear exit codes, so a restart loop never wakes anyone for nothing.
Before and after
What we would do differently
The break-it catalogue arrived partway through the migration, and it found defects in code we had already moved. On every migration since, it is the first thing we deliver, written before a single endpoint moves.
Built with
Perl · Node.js · Fastify · SQLite · FreeBSD
More for Shiptimize
One pickup map for every checkout
The last screen before a shopper pays had been copied into every plugin, and each copy had drifted. Now one phone-first widget serves every platform and brand, and a fix lands everywhere at once.
One click turns any shop’s order page into a shipment
Merchants without a plugin typed every address by hand. Our browser extension reads the order on screen with AI vision, then books the shipment and prints the label.
Ready to build something great?
Tell us what’s breaking, or what you need built. You talk to the engineer who does the work.
