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.

Client
Shiptimize
Sector
Logistics
Kind of work
MaintenanceOps

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

  1. 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.
  2. 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.
  3. 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.
  4. Kept every existing check on the old system passing.
  5. Made deployment fit the servers Shiptimize already runs, so a FreeBSD host deploys with a git pull and no build step.
  6. Added a health check, a service script and clear exit codes, so a restart loop never wakes anyone for nothing.

Before and after

BeforeAfter
An old Perl coreOne Node.js service
Integrations buried inside itEvery integration moved, no downtime
Failure modes untestedA break-it catalogue, run before release
Builds on the serverDeploy with a git pull

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

Ready to build something great?

Tell us what’s breaking, or what you need built. You talk to the engineer who does the work.