Enterprise .NET
Carving a decade-old ERP into .NET Core, without stopping the business
Finance, inventory, and HR migrated one seam at a time, with the old system running until the new one had earned trust.
- TypeLegacy modernization
- DomainsFinance, inventory, HR
- Core stack.NET Core, C#, Kafka
- EngagementPaid audit, then fixed price
The brief
A decade-old ERP sat at the center of the business: finance, inventory, and HR all ran through one aging .NET Framework monolith with a shared database and no meaningful test coverage. Every change had become a risk calculation, hiring for the old stack was getting harder each year, and the vendor options on the table were a multi-year rewrite or an expensive off-the-shelf migration that fit the business badly.
The one non-negotiable: the company runs on this system every day. There would be no freeze, no big-bang cutover, and no month where invoices went out late because of a migration.
What we built
The project started with a short paid audit that mapped the system as it actually was, not as anyone remembered it: which modules touched which tables, where the real seams were, and which order of extraction would ship value earliest. That map became the fixed-price roadmap.
Services were then carved out one seam at a time onto modern .NET Core, starting where the pain was worst. Before each seam moved, characterization tests pinned down the existing behavior, quirks included, so the new service could prove it matched the old one before taking traffic. Kafka carried events between the monolith and the new services, letting both run side by side, and Azure hosted the new estate with infrastructure defined as code.
Each domain, finance, inventory, then HR, followed the same rhythm: extract, run in parallel, compare outputs, cut over, and only then decommission the old path. Weekly demos showed real transactions flowing through the new services, which is a different kind of reassurance than an architecture diagram.
Why it worked
Rewrites fail when trust is demanded up front. This one never asked for it: the legacy system remained the safety net until each replacement had earned its place in production with matching outputs on real data. The business kept operating through the entire engagement, the risk arrived in weekly slices instead of one terrifying weekend, and the client ended up with a modern .NET estate its own team can hire for and extend.
Building something like this?
Yours won't match this build exactly, which is what the free scope call is for. Quote in writing 48 hours after it.