A former colleague reached out with a project proposal. “Absolutely, let’s work together again,” I said—and just like that, our journey began.
The good part
We started by defining the project objectives. Standard stuff, a lot of work, but everything was familiar.
- Migrate servers from on-premise to the cloud (SaaS solution)
- Upgrade/rewrite legacy .NET applications to .NET Core
- Enhance application performance and maintainability
- Improve system reliability and scalability
- Elevate UX/UI
- Improve SEO score
- Improve integrations with third-party systems
- Setup automated deployment for faster delivery of new versions
- Add support for multi-tenancy
The bad part
We assessed vulnerabilities and risks. These issues weren’t surprising—after all, there’s a reason the client wanted a rewrite. Here’s what we found:
- Original developers who built the code were no longer available
- System was riddled with hacks, temporary solutions, workarounds, patches
- No documentation existed
- The application server was outdated and hadn’t been maintained
- The database lacked indexes on foreign keys
- No backup procedure was in place for the database
- Deployment was manual
- There were no test or staging environments
The ugly part
Now, for the real challenges.
- The client had very limited budget (1 senior engineer, 1 junior)
- They lacked an IT department, and stakeholders weren’t familiar with software development processes
- The old system was live and in every day use. We had to do migration ‘under the hood’ without disrupting day-to-day operations
Migration strategy
Our approach focused on minimal disruption and maximum reuse.
- Reuse existing database, with minimal alterations
- Set up resources on Azure
- Enable rapid version delivery with automated deployment
- Keep both old and new platforms running in parallel
- Replace applications gradually:
- Replace the Backoffice first
- Add multi-tenancy support to the new platform
- Build a new frontend application for the new tenants
- Replace the legacy frontend application for the old tenant
- Retire old solution
And finally - the results
We did it! The Client is satisfied, their business is thriving, and the new platform enables them to:
- Attract new subscribers with a modern, fast UI
- Streamline data entry for quicker, more accurate processing
- Add new brands and tenants quickly to support business expansion
- Roll out new functionalities swiftly
- Keep monthly cloud costs manageable without compromising performance
Lessons learned
Rather than a big-bang rewrite, we opted for a gradual migration. We recognized that this will take more time than a full rewrite from scratch. We recognized this would take more time than starting fresh, and we knew that some compromises need to be made. But we also realized that the benefits would far outweigh the drawbacks.
- The client maintained business continuity throughout the migration.
- Data migration wasn’t necessary since we reused the existing database, eliminating the need for heavy scripts and late-night data migrations.
- There was no strict cutoff date to stop using the old system and switch to the new one.
- Employees didn’t need to waste time testing the new system in parallel with daily tasks. Instead, they could work in either system and immediately see the effects in both. This enabled gradual adjustment without the need for intensive training.
- The client-facing part of the platform could be rolled out one brand at a time. End users could switch between the old and new sites, giving them time to adjust to the new layout.
What’s in it for you
We’re proud of what we achieved and we’re ready to do it again. If your goals include:
- Migrating to the cloud
- Consolidating multiple brands onto a single platform
- Streamlining data entry processes
- Minimizing costs and maintenance efforts
- Boosting system stability and reliability
- Creating a visually stunning platform
Contact us - let’s do it together.