Upgrade without stopping the business — old data kept, new capabilities gained.
Before you read: Written from live engineering practice — the money-moving, million-user work our team runs on our own products, set down so anyone building something can learn from it.
01 · What it is
Replacing a system that runs the business is a risk most companies can't take in one jump, and we don't ask them to. We start with an honest audit of what exists and what it actually costs to keep, then migrate in phases that keep the business running the whole time: wrapping the legacy behaviour behind modern APIs so new features build on clean ground, carrying the data across preserved, validated and understood, and retraining staff with documentation they can actually use. We deliver in steps with the business live throughout — not a big-bang rewrite that bets the company on a perfect launch.
What a legacy system modernization build covers:
Legacy modernization is surgery on a patient that must stay awake: the old system carries the business today, and stopping it to rebuild is not a plan, it is a gamble most organisations cannot afford to take. The work we deliver keeps the running system running while the replacement grows around it — one wrapper at a time, one route at a time — until the new core has proven it can carry the load and the old one can be retired with its honour intact. What survives the move matters as much as what changes: old records stay trustworthy, old rules stay enforced, and the business never has to choose between improving and operating. This is not a rewrite in one jump; it is a strangler-fig replacement where every step is reversible and nothing the company depends on is ever left to chance.
What we do
How we do it
02 · The full discipline
Every company eventually meets its own history in the form of a running system: software that was built for ten users now carries ten thousand, the developer who understood its dark corners left years ago, and the fear of breaking it grows in step with the cost of replacing it. Modernization is usually framed as a single all-or-nothing leap — stop the business, switch platforms, pray the launch is perfect. That framing is why so many modernization projects never start, and why the ones that do start wrong. The old system is not just old code. It is an accumulated memory of decisions, exceptions, business rules and fixes that no design document fully captures.
We modernize the systems Kenyan businesses and institutions actually run on — and we do it with the discipline of a shop that runs its own live money platform. KodiiPay itself did not arrive finished; it was wrapped, migrated and rebuilt in phases while real money kept moving through it — M-Pesa on Daraja as the home-market lived example, with PayPal, Stripe, PayStack, cards and bank transfers held to the same verification, idempotency and reconciliation discipline on every rail. That experience set the standard: nothing that makes money is retired on a schedule; it is retired when the new thing has proven it can carry the load. We bring the same patience, the same test-and-verify discipline and the same respect for the running system to every legacy modernization we take on.
Below is how modernization is really done — the honest audit of what the legacy holds, the strangler fig wrap that grows the new around the old, the data that survives the move, the handshake that keeps the two worlds agreeing, the live payment flows that never stop, and the limits we tell you about before you commit. Every section covers what it is, why it matters, and exactly how it is engineered.
03
A legacy system rarely starts as a bad decision. It starts as the right decision for its time — and then the business grows, the rules accumulate, and the code accretes so many patches that nobody can tell which behaviour is intentional and which is a scar. The system does not fail loudly; it fails slowly, as every improvement becomes harder and every new developer becomes afraid of it.
A legacy system is not a technology problem with a business wrap; it is a business problem wearing a technology coat. The honest audit has to start from that admission.
04
Before we touch anything, we study the legacy the way an archaeologist studies a site: layer by layer, with respect for what each layer was built to do. The goal is not a report that justifies throwing everything out. It is a truthful inventory of what the system actually does, what it actually holds, and what it would actually cost to lose.
The audit produces a document we both sign: what the legacy is, what it holds, and what we will and will not disturb. That document is the foundation of every phase that follows.
05
The case for modernization is usually sold on the claim that the new system will be better. The sharper case is arithmetic: what the old system costs every month that it stays. Once the audit has priced it, the decision stops being emotional and starts being an expense the board can read.
When the numbers are on the table, the question stops being whether we can afford to modernize and becomes what it has been costing us not to.
06
The most valuable thing a modernization partner can say is often the word don't. Some systems should be wrapped and left, some should be left entirely, and some should be deleted. Recommending modernization to every client is how consultancies make money; recommending it only when it earns its price is how you keep clients.
Our honest test is simple: we modernize when the arithmetic, the risk and the appetite all line up, and we say so out loud when they do not.
07
The strangler fig is a real tree that grows around an older one and gradually replaces it, until the old tree is gone and the fig stands where it stood. We apply the same pattern to software: new capability grows around the legacy, routes move across one at a time, and the old system is retired only when the new one is demonstrably carrying its share.
A big-bang rewrite is a bet that the business can survive a perfect launch — which is to say, a bet that survives only until the inevitable imperfection. The strangler fig spreads the risk until there is no single moment that can break the company.
08
The fastest win in any modernization is not to rewrite the legacy but to put a modern surface on it. We wrap legacy behaviour behind a clean, versioned API so that everything new builds against the wrapper, while the legacy keeps performing the behaviour it has performed for years.
The wrapper is the tolerant middle ground: the new world gets clean interfaces today, the legacy keeps running until it is genuinely drained, and no feature waits for the rewrite before it can exist.
09
The most valuable thing in a legacy system is rarely the code or even the data — it is the rules. Which status may follow which, who approves above a threshold, how interest is computed, which discount applies when a customer complains. These rules are the company accumulated judgement, and the worst outcome of a modernization is a new system with newer code and older decisions because the rules were never written down.
Modernization that preserves features but loses rules has moved the furniture and lost the house. We preserve the accumulated judgement as rigorously as the stored data, and we prove it with tests.
10
A migration that moves data but drops behaviour has only half-migrated: the new system holds the records but not the way the business treats them. Preservation means both — the rows arrive complete and understandable, and the way the operation responds to them arrives too.
The business story lives in both halves — the rows and the responses. We carry both, and we prove the carrying.
11
The architecture of a modernization is really a schedule of decisions: which slice moves when, how it is verified, who signs it off, and what runs the moment it fails. Phasing is how the risk of the whole operation is spread across many small, absorbable moments instead of one defining one.
A phased migration converts a project with one terrifying moment into a series of small, tedious, verifiable wins. Tedious is exactly what we are going for — boring, proven, never on fire.
12
Money flows are the hardest slice of any modernization, which is why they are the very slice we are most practised at: KodiiPay own ledgers paid for their modernization one verified transaction at a time. Migrating a live payment flow is not a data move — it is moving a promise about money while people are relying on it, and it obeys the rules of payment engineering, not the rules of a normal cutover.
A live money flow can be modernized — it absolutely can — but only with the machinery that payments demand: atomics, idempotency, terminal states, escrow and reconciliation. It costs more care, and it is worth exactly that.
13
For most of a modernization, the new system and the legacy are both alive, and both carry parts of the truth. The handshake is the layer that makes the two worlds agree: something written in the new system appears in the old one, and vice versa, until the handoff is complete. A poor handshake is where modernizations quietly come apart.
The handshake is honesty between two systems: each side says what it did, the other side verifies, and any disagreement is visible the moment it happens.
14
A modernization succeeds or fails at the keyboard of the person who has been doing the job their own way for years. New software that ignores how people actually work gets abandoned for the old system — or worse, for the notebook. So the change plan is a people plan as much as a technology plan, and it is built around the work, not the screens.
Systems do not get adopted because they are modern; they get adopted because they are easier on the person doing the work. We build the two together — software and the humans who run it — or we do not really modernize anything.
15
Every phase of a modernization has a moment when the new system becomes responsible for real work, and that moment deserves evidence, not optimism. Post-move verification is not a wrap-up activity; it is a formal gate with named checks, named owners and a signed agreement that the old system job has genuinely transferred.
Sign-off is the difference between thinking it worked and verifying it and taking responsibility for it. We deliver the second kind of cutover, phase by phase.
16
The end of a modernization is not the moment the new system goes live — it is the moment the old system can be switched off with confidence. Retirement is a deliberate act: the legacy is kept warm while the new system proves itself over a real period, and only then is it decommissioned, with its data archived so history stays answerable forever.
Retiring a legacy is not an act of disrespect to the system that carried the business; properly done, it is the highest respect, because the old system is allowed to stop, having verified that its work continues elsewhere.
17
Modernization is not the goal; a specific, describable target is the goal. Before the first phase we agree what the end state looks like, so every phase moves toward something concrete instead of a vague notion of more modern. The target is shaped by what the business actually needs, not by fashionable architecture for its own sake.
The architecture you move toward is the one you will live in for the next decade. We design it to be boring in the right way: reliable, understandable, and owned by the business, not by a single developer or a single vendor.
18
Because we have run the scar tissue ourselves — on KodiiPay and on client systems — we are direct about what modernization cannot promise. It will not recover data that was never captured, cannot resurrect a rule that no one can remember or evidence, and cannot make an organisation that resists change adopt software that threatens its routine. Those are not engineering failures; those are honest physics.
Modernization is disciplined change, not magic. We promise the discipline — the audit, the phases, the verification, the honest warnings — and we deliver the change that survives the year after it lands.
The toolchain
Modernization is not a single tool; it is a discipline of discovery, wrapping, migration and retirement. This is the toolkit we bring to take a legacy from sacred and fragile to wrapped, migrated and retired — with the business running throughout.
01
Know exactly what the legacy is before touching it
02
Modern APIs over legacy behaviour
03
The truth carried, verified and reconciled
04
The clean ground new features grow on
05
Parity proven, not promised
06
Change that the business can absorb
07
The humans who have to live in the new system
Lifecycle
Every modernization we run follows the same disciplined arc: audit, wrap, prove, migrate, train, sign off and retire. The business stays live throughout — that is the point of the method, not a constraint on it.
01
Map what the legacy is, what it holds, what it costs and who depends on it, from evidence, not memory.
02
The audit conclusion: what gets wrapped, what migrates, what retires and what is deliberately left alone.
03
The first slice of legacy behaviour exposed as a modern, versioned API with parity tested.
04
The wrapper certified — new output equals old output, replay-safe and observable.
05
Slices of data extracted, transformed, validated and reconciled against the source of truth.
06
Old and new worlds sync continuously; every exchange is logged and reconciled on both banks.
07
New features grow on the modern ground while the legacy drains one responsibility at a time.
08
Users, branches and features move across gradually, each shift measured and reversible.
09
Parity, integrity and user acceptance evidenced; a named owner signs each slice.
10
Staff trained on real cases; documentation written from the work, kept current as reality corrects the design.
11
The shadow period ends, access is cut, secrets rotated and data sealed into a queryable archive.
12
The new system is monitored and supported; the lessons become the next modernization map.
Closing
Legacy system modernization is not a rewrite with a marketing layer — it is the disciplined replacement of a running system without stopping the business that runs on it. That includes:
Modernization is not magic and it is not free of risk — it is managed change with the risk spread across phases instead of concentrated in a launch night.
We modernize the way we ran our own modernization — with the money moving, the people working and the proof verifiable at every step. The business never stops; it only improves.
Previous capability
Integrations
Next capability
Data Migration
The discipline above is what we run on our own products every day. If it would help on yours, our door is open.