Rebuilding a single-tenant freight platform as multi-tenant SaaS
SaaS product development for a logistics software provider whose growth had stalled on its own architecture: forty-one customer-specific deployments were consolidated into a single multi-tenant platform, cutting onboarding from weeks to hours and making one release serve every customer.
41
Customer-specific deployments consolidated into one platform
4 hours
New customer onboarding, down from an average of three weeks
1
Release train serving all tenants, replacing per-customer branches
71%
Reduction in monthly infrastructure spend per customer
The Challenge
The provider had grown by saying yes. Every early customer got a deployment of its own, and most got a few bespoke changes with it. Five years later that meant forty-one production environments, each on a slightly different version of the codebase, several with customer-specific branches that had never been merged back.
Onboarding a new customer took around three weeks of engineering time, which put a hard ceiling on sales. The company could not close deals faster than it could provision them, and the provisioning work fell on the same engineers who were meant to be building the product.
Shipping a feature meant deciding which of the forty-one environments should receive it and when. In practice most received it late or not at all, so the product the sales team demonstrated and the product most customers actually used had quietly diverged.
Infrastructure cost scaled linearly with customers rather than with usage, because every tenant carried an idle baseline of its own. Gross margin was moving in the wrong direction at exactly the point investors were looking at it.
The objectives were straightforward and hard: consolidate to a single multi-tenant platform, keep every existing customer live throughout, reduce onboarding to a self-service action, get to one release train, and preserve the genuine customer-specific behaviour that was worth keeping while retiring the rest.
The Solution
The first phase was not engineering. It was a systematic diff of all forty-one deployments to separate real product variation from accumulated drift. Around a fifth of the customer-specific code turned out to be configuration in disguise; most of the remainder was dead, superseded, or duplicated.
That analysis produced the tenancy model. Genuine variation was reclassified into three tiers: tenant configuration held as data, feature flags held per tenant, and a small set of extension points where a customer could genuinely need different behaviour. Anything that did not fit one of those three was either brought into the core product or retired with the customer’s agreement.
The platform was then rebuilt as a shared application tier with tenant-scoped data isolation, tenant context resolved at the edge and carried through every layer, and per-tenant rate limiting so one customer’s integration load could not degrade another’s experience.
Migration ran one tenant at a time, smallest first. Each tenant was replayed onto the new platform in parallel with its existing deployment, with data and outputs compared before any traffic moved. No tenant was cut over until its own data reconciled.
Onboarding became a provisioning workflow rather than an engineering task: create tenant, apply configuration profile, load reference data, invite users. The three-week engineering effort became a form.
Alongside the platform work, the delivery model changed. Trunk-based development with feature flags replaced long-lived customer branches, and a continuous delivery pipeline with automated tenant-aware test suites made a single weekly release across all tenants a routine event rather than a risk.
Architecture Highlights
Timeline
Deployment audit and tenancy model
All forty-one deployments diffed against each other to separate genuine product variation from drift. Output was a tenancy model with configuration, feature flags, and a bounded set of extension points.
Multi-tenant platform build
Shared application tier, tenant context propagation, row-level data isolation, versioned public API, and the provisioning workflow built and load-tested against projected multi-tenant volumes.
Tenant migration
Tenants migrated smallest first, each running in parallel with reconciliation before cutover. Legacy deployments decommissioned only after a full billing cycle of clean operation.
Release model and handover
Trunk-based development, feature-flag rollout, and a single weekly release train established. Platform ownership handed to the provider engineering team with runbooks and architecture decision records.
Technology Stack
“We knew the architecture was the problem long before we could justify fixing it. What made the case was onboarding. Once sales could see a customer live the same afternoon instead of three weeks later, the rest of the business stopped arguing about it.”
Chief Product Officer, A Freight Visibility Software Provider
Let's build the system your business will run on next.
Tell us where it hurts. We'll bring the architects, engineers, and delivery model to fix it — and scale it.