Your Data Migration Isn't Slow. Your Cutover Plan Is Wrong.
For: A CTO or engineering lead at a mid-market enterprise who has spent six months preparing a data migration, has the new system ready, and is now paralyzed deciding whether to do a big-bang cutover over a weekend or a phased migration — because every guide treats this as a risk-tolerance question when it is actually a data-consistency question they haven't answered yet
If your six-month data migration is stuck in the go-live decision, the problem isn't your scheduling window or your rollback tolerance. It's that you haven't defined which records can be written to both systems simultaneously and which system wins on conflict. Until that decision exists in writing, big-bang and phased cutovers will both fail — for the same underlying reason. Pick either one; the outcome depends on the consistency contract you haven't drafted yet.
I've watched too many mid-market teams spend a quarter arguing big bang vs phased, when the actual blocker is that nobody on the migration steering committee can answer this question: during the transition window, if a customer updates their shipping address in the legacy system and a support agent updates it in the new system 40 seconds later, which value is canonical at hour 12? At hour 72? At final cutover?
That's the whole game. Everything else is logistics.
The debate you're having is the wrong debate
The way most guides frame it: big-bang cutover is fast, risky, needs a maintenance window; phased migration is safer, slower, and reduces blast radius. Then they hand you a decision matrix based on your risk tolerance and downtime budget.
This framing is useless because it treats the two approaches as fundamentally different when they're not. Both require you to answer the same three questions:
- During the migration window, which records are being written by both systems?
- When those writes conflict, which system wins — and how does the other system learn about the resolution?
- At what moment does write-authority transfer, and how do downstream consumers (reports, integrations, webhooks, analytics) know which system to trust?
In a big-bang cutover, you're claiming the answer to (1) is "none, because we freeze writes." In a phased migration, you're claiming the answer to (2) is "we've designed for it." Both claims are almost always partially false in production, and the failure modes look identical when they show up: duplicate customers, ghost orders, stale inventory, reconciliation reports that don't reconcile.
Why big-bang "freezes" leak
The big-bang plan assumes you can freeze the source of truth for a defined window — usually a weekend. In theory, no writes happen, you copy the final delta, flip DNS or feature flags, done.
In practice, here's what leaks through the freeze:
- Async jobs that were queued before the freeze but execute during it. Your payment webhook processor doesn't care about your migration calendar.
- Third-party integrations that write via API. Stripe, HubSpot, Segment, your ERP — they'll happily push updates into whichever endpoint is live.
- Human workarounds. Operations teams who "just need to fix this one order" will find a way. They always do.
- Read replicas that lag. Your "final delta" snapshot may not include writes committed to primary in the last 90 seconds before you took it.
Every one of these produces a record that exists in one system with a state that contradicts the other. Without a pre-defined conflict-resolution rule, your ops team resolves them by intuition on Monday morning — which means you have no audit trail and no data integrity guarantee.
Why phased migrations rot silently
Phased migrations acknowledge dual-write is happening and try to design for it. Usually with one of three patterns: strangler fig (route new features to the new system, old features to the legacy), tenant-by-tenant (migrate customers in cohorts), or entity-by-entity (customers first, then orders, then invoices).
These fail differently. They fail slowly. You go live, everything looks fine for six weeks, and then someone in finance notices that the monthly revenue report from the new system is off by 2.3% from the legacy one. Now you're doing forensic reconciliation across two systems that have been drifting for a month and a half, and nobody remembers which cohort was migrated on which date.
The rot happens because phased migrations often ship without an explicit write authority map — a per-entity, per-field specification of which system owns the write during each phase, and what happens when the non-owning system receives a write anyway. Without that map, developers make local decisions. Local decisions diverge. Data diverges.
The consistency contract you should be writing instead
Before you commit to big-bang or phased, produce a document that answers, for every major entity:
- Write authority during transition: legacy-only, new-only, or dual-write.
- Conflict resolution rule: last-write-wins by timestamp, legacy-wins, new-wins, or manual queue.
- Reconciliation cadence: real-time, hourly diff, end-of-day batch — and who owns the diff report.
- Read authority: which system serves reads to which consumer (UI, API, reports, downstream integrations).
- Rollback semantics: if we roll back at hour 36, which writes get replayed where.
Once this document exists, the big-bang vs phased choice becomes trivial. If your contract says "zero dual-writes, freeze window is 4 hours, all integrations paused," you're doing a big-bang and the plan tells you exactly what infrastructure and comms you need. If it says "customer entity dual-writes for two weeks with new-system-wins and hourly reconciliation," you're doing phased and the plan tells you what pipelines to build.
What you're choosing between isn't strategies. It's consistency contracts. The strategy falls out of the contract.
Two examples of what this looks like in practice
Example 1: an e-commerce platform moving from a monolithic legacy ERP to a modern OMS. The obvious dual-write surface is orders. The non-obvious one is inventory decrements — because the warehouse scanner integration writes to legacy, but the storefront now writes to the new OMS. Without a contract saying "inventory decrements: legacy-only until warehouse integration is cut over on date X, new system consumes a Kafka stream of decrements," you will oversell inventory within 48 hours of go-live. This is not a big-bang vs phased question. It's an authority question.
Example 2: a lending business migrating a loan ledger. Loan disbursals are one-way (once a loan is booked, the ledger doesn't accept edits to principal), but repayment allocations are mutable — a payment can be reallocated across principal, interest, and fees for weeks after receipt. If you migrate mid-month, you'll have loans booked in legacy with repayments being reallocated in the new system. The contract needs to say: "repayment allocations for pre-cutover loans remain legacy-authoritative for 60 days, then are copied forward." Without it, your interest income line drifts, and drifts on a regulated ledger are not a fun conversation. Teams working on lending platforms with real-time credit and KYC workflows learn this early or learn it painfully.
The honest counter-argument
The strongest pushback: "We don't have time to write a consistency contract for every entity. We have 400 tables. We need to ship."
Fair. You don't need a contract for every table. You need one for every entity that is (a) written by more than one upstream source, or (b) read by a downstream system that assumes strong consistency (finance, compliance, external partners). For most mid-market migrations, that's 8 to 15 entities. A working session per entity with the domain owner, the integration owner, and someone from data engineering gets you a first draft in a couple of weeks. That is faster than the reconciliation project you'll otherwise run for a quarter post-go-live.
The other honest counter: some migrations really are simple enough that a maintenance-window big-bang works. If your source system has a single writer, no async jobs, no external integrations, and read consumers that tolerate a few hours of downtime — go, do the big-bang, don't overthink it. But if that describes your system, you probably aren't six months into paralysis reading this essay.
What to do Monday
Stop the big-bang vs phased debate in your next steering meeting. Replace it with this exercise: on a whiteboard, list the top 10 entities in your data model by write volume. For each, write down which system(s) will accept writes during the transition, which wins on conflict, and how the other one finds out. If the room can't answer for even one entity without argument, your cutover plan isn't the problem — your consistency contract doesn't exist yet, and no cutover strategy will save you until it does.
Once the contract is drafted, the go-live plan writes itself. The infrastructure needed — CDC pipelines, dual-write proxies, reconciliation jobs, feature flags — becomes a checklist rather than an argument. You'll also discover which parts of your migration were never actually ready, which is uncomfortable but strictly better than discovering it at hour 14 of a weekend cutover. Teams that treat legacy modernization as a data-consistency problem first ship migrations that hold up under audit. The rest ship migrations that hold up until the first finance close.
Frequently Asked Questions
Is a big-bang or phased migration better for a legacy-to-cloud migration cutover?
Neither is inherently better. The right choice falls out of your consistency contract: if you can genuinely freeze writes across all sources and integrations for a bounded window, big-bang is simpler. If you can't, phased is the only honest option — but phased requires an explicit write-authority map per entity, or it will drift silently for weeks post-go-live.
What is a data consistency contract in the context of migration?
It's a written specification, per major entity, that defines which system accepts writes during transition, how conflicts are resolved, how reconciliation happens, and which system serves reads to which consumer. It's the artifact that makes your data migration cutover strategy testable rather than aspirational.
How do we achieve zero downtime data migration?
Zero downtime requires dual-write with a clear conflict-resolution rule, change data capture (CDC) from the source system, a reconciliation pipeline that catches divergence in near-real-time, and a controlled read-cutover per consumer. It's achievable for most mid-market systems but the engineering cost is real — often larger than the migration itself.
What is the biggest reason data migrations fail at go-live?
Undefined write authority during the transition window. Teams focus on data movement and schema mapping, then discover at cutover that multiple systems and integrations are writing to overlapping records with no rule for which wins. This is why the big bang vs phased migration debate is a distraction — both fail on this same variable.
How long should we plan for post-cutover reconciliation?
That depends on entity volatility, integration count, and regulatory posture — this is a scoping conversation, not a formula. For a personalized assessment of your migration risk profile and reconciliation window, talk to CodeNicely.
Found this useful? CodeNicely publishes engineering and product playbooks weekly. Browse the archive or tell us what you're building.
_1751731246795-BygAaJJK.png)