Skip to main content
Case Studies

Zero Downtime ERP Migration — Migrating an ERP System Used for 8 Years Without Even a Second of Downtime

A case study of migrating an 8-year-old ERP system handling 15,000 transactions per day to a new platform with zero downtime — from data migration strategy and dual-write patterns to a cutover no one noticed.

13 Mar 202610 min
ERP MigrationZero DowntimeData MigrationLegacy SystemDigital TransformationERP

"The legacy system was like a ticking time bomb — every day we delayed migration, we were putting the business at risk. But every day we migrated incorrectly was a day the business could stop running."

That was the first thing the client’s CTO said to us in the kickoff meeting.

If you have ever been in a situation where you had to migrate an ERP system that is "live every day" — a system used by 350 people, running 24/7, processing 15,000 transactions per day — and then been told "you cannot take the system down for even a second," you know this is not just a technical challenge. It is a zero-failure game.

This is a real story from 2025.


The Problem: A System Close to Failure, But Impossible to Shut Down

The client was a mid-to-large manufacturing company that had been using the same ERP system for 8 years — and frankly, it was a miracle the system had survived that long.

What We Found

  • Average response time of 4.2 seconds — every click an employee made required a 4-second wait. Multiply that by 15,000 transactions a day and the lost time becomes obvious.
  • Average monthly downtime of 12 hours caused by bugs that were "fixed, then came back again" — in a factory running 3 shifts, 24/7, 12 hours of downtime per month translates into millions in lost revenue.
  • 200+ accumulated customizations built over 8 years — with incomplete documentation, and in some cases, the original developers had already left.
  • Annual maintenance cost of THB 3.5 million — and rising every year because specialists who could support the legacy system were becoming harder to find.
  • Two previous upgrade attempts over the prior 3 years — both failed due to compatibility issues with years of accumulated customizations.

What made this project especially difficult: the factory operated 24/7, with 350 employees using the system continuously across production, warehouse, procurement, and finance — there was no maintenance window at all.


The Challenge: What the Client Needed

Goal Details Difficulty Level
Zero Downtime No system downtime allowed during migration, not even a second Very High
100% Data Integrity 12 million records across 8 years had to be migrated with nothing missing Very High
Continuous Access for 350 Users No work stoppage, no "please wait a moment" messages High
Migrate 200+ Customizations Assess which customizations were still necessary and which could be retired Medium-High
Reduce Maintenance Cost Cut annual cost from THB 3.5 million to below THB 1.5 million Medium
22-Week Timeline The client only had budget approval for 6 months High

Given these requirements, the first option we ruled out was a Big Bang Migration — shutting down the old system on Friday night and going live with the new one on Monday morning. Textbooks may call it the "simplest" approach, but in the real world, it is often the one most likely to fail.

According to Gartner, 55–75% of ERP projects fail to deliver on expectations, and the Big Bang approach is one of the major reasons.


The Approach: 3 Core Strategies

1. Strangler Fig Pattern — Replace Gradually, Not All at Once

This pattern gets its name from the strangler fig tree, which slowly grows around an existing tree until it effectively becomes the new tree — while the old one disappears almost unnoticed.

We applied the same idea: migrate one module at a time, not the entire system at once. As each new module became ready, we gradually shifted traffic to it until the legacy system slowly lost its role.

The key advantage: if any module had a problem, we could roll it back immediately without affecting the others.

2. Dual-write Pattern — Write to Both Systems Simultaneously

During the transition period, every transaction was written to both the legacy system and the new system at the same time, ensuring 100% data consistency at all times.

If the new system encountered an issue, all data still existed completely in the old system — we only needed to switch traffic back.

3. Shadow Traffic — Test with Real Traffic, Not Test Data

This was what gave us confidence before cutover: we sent 100% of real traffic to the new system for processing, but continued returning results from the old system to users. Meanwhile, we automatically compared the outputs of both systems for every transaction.

If results did not match → immediate alert → the team investigated.


The 4-Phase Process

Phase 1: Data Assessment & Mapping (Weeks 1–4)

What we discovered when assessing the legacy system:

  • 847 tables in the database (we had expected around 500)
  • 23 tables with serious data quality issues, such as duplicate data, null values where nulls should not exist, and inconsistent date formats
  • 67 tables that were no longer used but still consumed storage
  • 12 million records that needed to be migrated
  • Of the 200+ customizations, only 127 were actually still necessary; the rest were workarounds for old bugs that were no longer needed in the new system

This phase alone took a full 4 weeks, but it was the most critical phase of the project. If data mapping is wrong from the beginning, everything that follows will also be wrong.

Phase 2: Module-by-Module Migration (Weeks 5–16)

We migrated modules in this order:

Order Module Record Count Weeks Reason for Sequence
1 Inventory 3.2M records Weeks 5–8 Few dependencies; good for validating the pattern
2 Purchasing 2.1M records Weeks 7–10 Directly connected to Inventory
3 Sales 4.3M records Weeks 10–13 Largest module; needed strong confidence before migration
4 Finance 2.4M records Weeks 13–16 Most critical; migrated last to reduce risk

Notice that the timeline overlaps — we did not wait for one module to be 100% complete before starting the next. We began the next module once the previous one had passed defined milestones.

Phase 3: Shadow Testing (Weeks 17–20)

For 4 weeks, the new system ran alongside the old one while receiving 100% of real traffic:

  • Week 17: Found a 0.3% discrepancy in the Sales module — caused by different rounding logic
  • Week 18: Fixed the rounding issue, reducing discrepancy to 0.008%
  • Week 19: All modules had discrepancies below 0.001%
  • Week 20: Zero discrepancy for 7 consecutive days — we were ready for cutover

Phase 4: Cutover (Weeks 21–22)

This is the part we are most proud of: not a single user knew the cutover had happened.

We gradually shifted traffic from the old system to the new one:

  • Day 1: 10% of traffic → new system
  • Day 3: 25% of traffic
  • Day 5: 50% of traffic
  • Day 7: 75% of traffic
  • Day 10: 100% of traffic → fully on the new system

At any point, if the error rate exceeded 0.1%, traffic would automatically roll back to the legacy system immediately — but throughout the 10-day cutover, we never had to roll back even once.


The Failed Round 1: A THB 4.7 Million Lesson

We will not pretend everything went smoothly from the start, because it did not.

Week 8 — the Purchasing module failed

When we started dual-write for the Purchasing module, everything looked fine for the first 3 days. But on day 4, the Finance team reported that some PO values "looked strange."

When we investigated further, we found:

  • 2.3% of all POs had mismatched item prices between the two systems
  • Root cause: the currency conversion logic in the old system calculated values one way, while the new system used a different method — the difference was small per transaction, but in total it amounted to THB 4.7 million
  • The most concerning part was that without the Dual-write Pattern comparing both systems continuously, we might not have discovered the issue until financial close

What We Did

  1. Immediately paused migration of the Purchasing module — the Inventory module that had already been migrated continued operating normally in the new system
  2. Spent 2 weeks analyzing every currency conversion rule in the legacy system (which had no documentation at all)
  3. Built a reconciliation layer to automatically verify every PO amount before it was saved
  4. Ran regression tests on 2 years of historical data to ensure the logic matched 100%

The result: the timeline slipped by 2 weeks (from 22 to 24 weeks), but we did not lose a single record. Most importantly, the legacy system continued operating normally throughout, with no impact on users.

This is exactly why we chose Strangler Fig instead of Big Bang — if this had happened during a Big Bang go-live weekend, it would have meant the entire factory coming to a halt.


Results: Before vs After

Metric Before Migration After Migration Change
Average Response Time 4.2 seconds 380 milliseconds 11x faster
Monthly Downtime 12 hours 0 hours (first 6 months) -100%
Data Integrity Never validated 12M records verified, 99.9997% match —
User Satisfaction 3.2/10 8.7/10 +172%
Annual Maintenance Cost THB 3.5 million THB 1.2 million Saved THB 2.3M/year
Time to Generate Report 45 minutes 3 minutes 15x faster
Bug Tickets/Month 23 tickets 4 tickets -83%

One especially interesting figure is the 99.9997% data match rate — out of 12 million records, there were only 36 records with minor discrepancies (fractional rounding differences), which the Finance team confirmed were "acceptable and far better than expected."


Cost Analysis: How Much It Cost and When It Pays Back

Item Amount
Total Migration Project Cost THB 8.5 million
Previous Annual Maintenance Cost THB 3.5 million
New Annual Maintenance Cost THB 1.2 million
Annual Savings THB 2.3 million
Annual Value of Avoided Downtime ~THB 1.8 million (estimated from lost production output)
Total Annual Savings THB 4.1 million
ROI Break-even ~25 months

If you look only at the number, 25 months may feel long. But it is important to remember that the old system also carried substantial hidden costs — time employees lost waiting 4 seconds per click, reports that took 45 minutes to generate instead of 3 minutes, and missed business opportunities because the system could no longer support growth.


5 Lessons from the Field

1. Strangler Fig Beats Big Bang Every Time

No matter how urgent the timeline is, no matter how much pressure stakeholders apply, do not do a Big Bang Migration on a live production system. The risk is simply too high, and the cost of failure is always greater than the cost of moving more slowly.

2. Data Assessment Always Takes Longer Than Expected

We planned for 2 weeks and it took 4. We found 847 tables where we expected 500, and 23 data quality issues no one knew about. If we had not invested the time here, we would have faced those problems in production — where they would have been far harder to fix.

3. Dual-write Is an Essential Safety Net

Without dual-write, we would not have found the currency conversion bug until it was too late. The nearly lost THB 4.7 million is exactly the kind of cost the Dual-write Pattern helped us avoid.

4. Do Not Trust Legacy System Documentation

Of the 200+ customizations the client originally reported, only 127 were still actively used. The available documentation was outdated across the board. What we did instead was build understanding from the real system, not from the documents.

5. Shadow Traffic Means Testing Against Reality

Test data will never cover as much as real traffic. We found a 0.3% rounding discrepancy in the Sales module that test data had never detected, because the test dataset did not include edge cases involving product prices with multiple decimal places.


What Still Needs Improvement

We do not want to pretend everything is perfect. There are still areas we are actively improving:

Multi-region Failover

The new system currently still runs in a single region. If that region has an issue, downtime is still possible. We are currently planning a multi-region setup to ensure the zero-downtime capability we achieved can be sustained over the long term.

Legacy API Deprecation Timeline

There are still 3 external systems connected to the legacy system’s APIs. We need to migrate these API consumers within 6 months before the legacy system can be retired permanently.

AI-powered Anomaly Detection

During migration, we built a rules-based manual comparison system for validating data between the two platforms, and it worked well. But in the long term, we want to use AI/ML to detect data anomalies automatically so issues can be identified faster and more comprehensively than with rule-based checks alone.


Conclusion

Zero Downtime ERP Migration is not easy, but it is not impossible. What made this project successful was not the technology itself, but the thinking and process behind it — choosing Strangler Fig over Big Bang, using dual-write as a safety net, and validating with real shadow traffic before cutover.

If your organization is facing a legacy system migration, do not be afraid — but do have a plan. A good plan is one with a fallback at every stage, not one that simply assumes "nothing will go wrong."


If you would like to discuss ERP migration planning or digital transformation for your organization, the Enersys team would be glad to hear your requirements — Talk to us


Sources

Continue with guides on related topics.

How to Implement Odoo Effectively in 2026: Seven Principles from a Silver Partner That Keep ERP Projects from Failing

Panorama Consulting's 2026 report finds that more than a quarter of ERP projects exceed budget. The primary causes are not technical. They are scope creep, unnecessary customisation, and data migrated without cleaning. This piece sets out seven principles the Enersys team uses, as an Odoo Silver Partner, on real client engagements. The ideas are process before module, phased rollout, configuration at 90 percent with custom capped at 10, data migration as a parallel workstream, change management with equal investment, executive sponsorship per module, and a 30 to 60 day hypercare phase after go-live.

Read article

Odoo ERP for Service and Project Businesses — How CodeVelocity Went from "Guessing" to "Knowing Every Baht" in 90 Days

CodeVelocity, an IT consulting firm with THB 220 million in annual revenue, used to send invoices 25 days late and had no idea which projects were profitable until after they closed. After implementing Odoo ERP, billing cycle dropped to 3 days, utilization rose from 58% to 78%, and revenue increased by 18%.

Read article

Why Software Projects Fail — 7 Real Causes from the Front Lines, Not the Textbook

Standish Group reports that 83.9% of IT projects fail partially or completely, while McKinsey found that large IT projects exceed budget and schedule by an average of 45%. This article breaks down 7 real-world causes we see again and again, along with practical ways to prevent them.

Read article
Browse all Insights

"Empowering Innovation,
Transforming Futures."

Contact us to make your project a reality.