An overhead view of a warehouse worker with a tablet among conveyors and parcels

Legacy Supply Chain SaaS Modernization and Cloud-Native Re-Platforming

Industry
Manufacturing
Technologies
.NET, Azure, ASP.NET, Angular.js, Microservices

Summary

We modernize long-lived supply chain SaaS for order fulfillment and warehouse management, moving legacy products toward cloud-native architecture without interrupting operations. Software of this type sits at the operational center of a distributor or manufacturer: it receives and allocates orders, manages inventory across locations and bins, drives picking, packing and shipping, prints labels and documentation, exchanges messages with carriers and trading counterparties, and feeds billing and reporting. It commonly runs alongside ERP, MES and quality modules sharing master data on items, locations and counterparties.

The Challenge

Downtime is not tolerable, because a stalled platform stops physical work on a warehouse floor. Meanwhile the product itself resists change. Long-lived systems of this type accumulate layers: Classic ASP pages, Web Forms with heavy view state, stored procedures carrying business rules, scheduled jobs nobody owns, and integrations wired directly into database tables. Behavior that users depend on is frequently undocumented and discoverable only from the code, which rules out a rewrite in one move.

The failure modes are well known. Big-bang rewrites overrun and never cut over. New services reach straight into legacy tables instead of going through defined contracts, so the old schema becomes permanent. Migrations validated by sampling rather than full reconciliation lose records that nobody notices until an audit. Observability added after cutover leaves the first production incident undiagnosable. Multi-tenant behavior deserves separate attention, because a change that is safe for one tenant configuration can break another that relies on a legacy default.

The Solution

Incremental replacement behind stable seams

The workable approach is incremental replacement, with old and new running together while the seam holds. Front ends for modules such as inventory and shipping move to a component framework and are redesigned as independently deployable services while the original back end stays in service. That requires purpose-built endpoints on the legacy side answering the new interface in the shape it expects, rather than forcing new screens to imitate page-based post-backs. Authentication and session state bridge both worlds, usually through a token exchange at the edge, and routing lets a user move between old and new screens without a visible seam. Parity is verified screen by screen, because legacy forms hide behavior in validation quirks and keyboard workflows warehouse staff depend on.

Cloud-native back-end services

  • Bounded services on .NET, sized around business capabilities rather than around existing tables.
  • Asynchronous messaging through a service bus for work that must not block a request.
  • A document store for high-volume flexible records and a relational store where transactional integrity is required.
  • Infrastructure described as code, containers orchestrated on managed Kubernetes, and pipelines gating every change with automated tests.

Data migration and cutover

Migration runs as an extract, transform, verify and cut-over sequence with reconciliation counts and checksums at every stage, dual-write or change-data-capture during the overlap, and idempotent handlers so replays do not duplicate records. A lossless cutover is a design requirement rather than a hope: it depends on proving that every source record reached the target, and on a rehearsed rollback path.

The integration hub

The hub is the module through which the platform talks to external systems, services and APIs, and its configuration interface is what operators actually use. It needs clear connection definitions, credential handling, retry and backoff parameters, transformation mapping, replay of failed messages, and visibility into queue depth and error classes. Weak tooling here turns every counterparty onboarding into an engineering ticket.

Working inside the product team

We work as embedded .NET engineers comfortable in both the old stack and the current one, taking part in backlog refinement, sprint planning, standups, reviews and retrospectives alongside in-house developers and testers. Work is sequenced so that defect fixes and small functional additions in legacy modules such as reporting and billing continue in parallel with structural modernization.

What This Delivers

The product keeps running while its architecture changes underneath it. Modernized modules ship independently instead of waiting for a whole-platform release, integrations become configuration work rather than engineering work, and the operational history survives the move intact. Warehouse staff keep the workflows they rely on, and the platform gains room to grow.

Technologies and Tools

.NET and ASP.NET on the service side, Angular for replaced front ends, a microservices architecture on Microsoft Azure, managed Kubernetes with containerized workloads, a service bus for asynchronous messaging, document and relational data stores, and infrastructure as code with automated delivery pipelines.