Webneuron
Representative Case Study — SaaS Product Development

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

Tenancy was resolved at the edge from the request host and authentication token, then carried as an immutable context object through every service call and into the data layer. No query anywhere in the application can execute without a tenant scope attached, which is enforced at the persistence layer rather than left to developer discipline.
Data isolation used a shared database with row-level security and tenant-scoped keys, with a separate-database option retained for the small number of enterprise tenants whose contracts required physical separation. Both options run the same application code.
The API surface was versioned and published with OpenAPI definitions, because most of these customers integrate the platform into their own transport management and ERP systems. Backward compatibility guarantees became a product commitment rather than an informal one.
Real-time shipment telemetry arrives at high volume and irregular cadence. It was moved onto an event stream with per-tenant partitioning, so ingestion spikes from one large shipper are absorbed without affecting query latency for anyone else.
The platform runs on Kubernetes with horizontal autoscaling driven by queue depth and request latency rather than raw CPU, which is what allowed infrastructure cost to track usage instead of customer count.
Observability was made tenant-aware from the start. Every trace, log line, and metric carries a tenant identifier, so support can answer the question that actually gets asked — is this slow for everyone, or only for this customer.

Timeline

Weeks 1–10

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.

Months 3–8

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.

Months 9–16

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.

Months 17–18

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

TypeScriptNode.jsNext.jsPostgreSQLApache KafkaRedisKubernetesAWSTerraformOpenAPIGitHub ActionsOpenTelemetryGrafana

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.