Nobody ever calls us because things are going well.
The call usually starts the same way: "We need to replace our payment system, but we can't afford any downtime." And then the next sentence: "Also, we process a few hundred million a day through it."
Right.
There's a reason legacy payment systems stick around longer than they should. It's not because the people running them are naive. It's because the systems work — badly, held together with duct tape and manual processes, but they work. Money moves. Merchants get paid. The reconciliation person stays late, but the books close.
The moment you propose replacing that system, you're asking the business to trust something that has never processed a real transaction over something that has processed millions of them. That's not a technology decision. That's a trust decision.
And trust is earned in production, not in a demo.
We stopped believing in staging environments for payment systems a long time ago. You can mock bank APIs, simulate transaction volumes, fabricate edge cases — and your staging environment will still lie to you. It will tell you everything works. Then you go live and discover that one bank sends their settlement file with a trailing space in the reference field, and your parser chokes on it at 4:47 PM on a Friday.
Shadow mode is the antidote. The concept is straightforward:
The old system keeps running. It's still the system of record. Operators still use it. Money still moves through it. Nothing changes for anyone on the operations floor.
But behind the scenes, the new system receives the same inputs. Every incoming transaction, every bank statement, every payout instruction — duplicated to the new platform. The new system processes everything, produces its own outputs, and then we compare.
No risk. No downtime. Just data.
The gaps that show up during shadow mode are never the ones you expected. In our experience, it's almost never the core logic that breaks. The matching algorithms work. The ledger balances. The dashboards look right.
What breaks is the stuff nobody thought to document:
You can't spec this. You can only observe it.
People always ask this. The answer is: long enough to see a month-end close. Ideally two.
Daily operations might look clean within a week. But payment systems have cycles — daily batches, weekly reconciliation, monthly closes, quarterly reporting. You need to see at least one full cycle before you trust the new system with real money.
We typically run shadow mode for 6-8 weeks. Not because we're cautious by nature, but because that's how long it takes to catch the things that only happen once a month.
Shadow mode gives you confidence. The parallel run gives you proof.
In a parallel run, both systems are processing real transactions. The old system is still the primary — it's still the one the bank acts on. But the new system is now generating real outputs: real payout files, real reconciliation reports, real dashboards.
Every morning, someone sits down and compares. If the new system says you owe a merchant €2.3M and the old system says €2.3M — good. If there's a discrepancy, you investigate it before the new system ever touches real money.
The parallel run is operationally expensive. You're running two systems, and someone has to compare them daily. That person is going to complain. They should — it's tedious work. But it's the difference between a controlled migration and a prayer.
There's no magic number. But we look for three things:
Zero unexplained discrepancies for 10 consecutive business days. Explained discrepancies are fine — timing differences, rounding, known gaps. Unexplained ones mean you're not ready.
Operators prefer the new system. This sounds soft, but it's the strongest signal. When the recon person starts checking the new system first and the old one second, you're close.
The business owner signs off. Not the CTO. Not the project manager. The person who's responsible when money goes to the wrong place. They need to look at the outputs, understand what they're seeing, and say "yes."
The actual cutover is the least interesting part, which is how it should be. By the time you get here, you've already proven the system works. The cutover is logistics.
But logistics still matter:
Pick a quiet day. Not month-end. Not the day after a public holiday when transaction volumes spike. Tuesday or Wednesday of a normal week.
Brief the operators the day before. Not a training session — they've been using the system in parallel for weeks. Just a "tomorrow morning, we flip. Here's what changes, here's what doesn't, here's who to call."
Keep the old system running in read-only mode for two weeks. Don't decommission it immediately. If something goes wrong on day three, you want the option to check the old system's view of the same transaction. This is your safety net, and it costs almost nothing.
Have a rollback plan you've actually tested. "We'll just switch back" is not a plan. What happens to the transactions processed by the new system during the window? How do you reconcile them? Who does it? Write it down. Walk through it. Then hope you never need it.
Every migration teaches us something. But the meta-lesson is always the same: the technology is the easy part. The hard part is earning the trust of the people who've been keeping the old system alive with their knowledge, their workarounds, and their late nights.
Those people are not obstacles to your migration. They're the reason it will succeed. They know where the bodies are buried. They know which bank sends corrupt files on Mondays. They know that "miscellaneous" isn't actually miscellaneous.
Listen to them. Build shadow mode around what they tell you. Run the parallel long enough for them to believe. And when they say "it's ready," it probably is.
Zenlime builds payment infrastructure for financial services companies. If you're planning a system migration and want to talk about how to do it without breaking things, start a conversation.