Capability 31 · Legacy System Modernization

Legacy System Modernization

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:

  • Honest audit of what exists & what it costs to keep
  • Phased migration that keeps the business running
  • Legacy behavior wrapped behind modern APIs
  • Data preserved, validated & carried across correctly
  • Staff retraining & documentation that match reality
  • Delivered in steps, never a big-bang bet
What we do · How we do it — as TGJOF Enterprise

This is how we do Legacy System Modernization

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

  • A live-world handover — the old system keeps running through every phase while the new core grows around it, so the business is never asked to trust an unproven replacement with everything at once.
  • The strangler-fig sequence — new capability wraps the legacy, routes move across one slice at a time, and the retire switch is pulled only when the new side is demonstrably carrying the load.
  • Records that stay trustworthy — history, statuses and references retain their meaning across the swap, so the ledger, the files and the audit trail of the old world are still the truth in the new one.
  • Rules preserved as tests — the accumulated business logic that everyone feared to touch is harvested, signed off by its owners and turned into automated checks the new system cannot silently regress.
  • A retire-able end state — the target is not merely newer code but a modular core with clean interfaces, real constraints and observability, owned by the business rather than by a single developer.

How we do it

  • Wrap first, rewrite never first — legacy behaviour is exposed behind a versioned API before any internals are touched, so everything new builds against a modern contract the old world can still honour.
  • Every slice is reversible — each phase moves one feature, one data slice or one user group with a defined rollback, so a decision that proves wrong costs a step back, not the whole programme.
  • Parity gates the move — the two worlds are compared on volumes, hashes and real outputs before a route is accepted; a slice passes on measured agreement, never on a slide.
  • Live money cutovers stay exact — where the legacy moves funds, the switch carries idempotency keys, terminal states and daily reconciliation, so a replayed callback can never settle a payment twice.
  • Retirement is documented, not assumed — credentials are rotated, data is sealed into a queryable archive and the decommission is written down, so history stays answerable after the old system stops.

02 · The full discipline

Replacing the system that runs the business is a risk no company should take in one jump — so we never take it in one.

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

Why legacy systems harden into cages

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.

  • Working code, no map — the system runs reliably enough that no one dares touch it, yet no one can fully explain how it runs; that is the definition of a cage that works.
  • Knowledge that walked out — the developers and the operators who built it have moved on; the undocumented decisions live in the code and in memories no longer in the building.
  • Features nobody dares touch — a fifteen-year-old fix that contradicted an old requirement is now sacred, and the implementers avoid it entirely.
  • Deployments that cost the day — a release is a ceremony with checklists and prayers, because a decade of drift means no one trusts the process anymore.
  • Expensive on every axis — hosting, licensing, a shrinking talent pool that still knows the stack, and the opportunity cost of every feature that could have shipped but did not.
  • The floor feels it most — staff work around the system with notebooks, WhatsApp groups and side spreadsheets because the official tool is slower than the workaround.
  • Everyone agrees it must change — and everyone also agrees nobody can be the one to start, because a wrong move can cost the whole operation its week.

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

The honest audit — what the legacy really holds

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 real feature map — every workflow, screen, integration and report the system performs today, traced from evidence like logs, tickets and usage, rather than from the stale spec that described it ten years ago.
  • The hidden rulebook — the business rules that live as code comments, conditional branches and the phrase that everyone says: we just always do it this way; each one written down before a single line of the new system is designed.
  • The data truth — table counts, row volumes, quality issues, orphaned records and the fields everyone claims to understand but no one actually does.
  • The integration inventory — every external system it talks to: the banking file format, the payment gateway endpoints — M-Pesa/Daraja and whatever cards, wallets and bank rails the business runs — the supplier portal, the Excel export that feeds finance.
  • The cost of keeping — hosting, licensing, maintenance, the payroll of the people who can still operate it, and the compound cost of features deferred while fear dominates.
  • The cost of losing — what breaks if a table is dropped, a rule is missed or a report is orphaned; the risks ranked so mitigation follows the money.
  • The appetite — not every core system deserves modernization; the audit concludes with what should move, what should be wrapped in place, and what should be left alone.

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

What it actually costs to keep the old system

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.

  • Hosting and licensing — the old stack platform fees, often rising as the vendor pushes a sunset price scale for a product it no longer sells.
  • The talent premium — engineers who still know the surviving generations of the framework charge above-market rates and are hard to replace.
  • Workaround wages — the staff hours spent double-keying, re-exporting and manually reconciling because the system cannot connect; paid every single week.
  • Integration drag — every new partner, bank file, API or payment rail — M-Pesa/Daraja, cards, PayPal, Stripe, bank transfers, whichever the business adopts — costs extra because the legacy needs adapters instead of standards.
  • Deferred growth — the revenue from features that never shipped because the platform could not carry them; the largest line item in the calculation.
  • Risk exposure — the regulatory, security and outage consequences of un-patchable software running the business core.
  • The debt compounds — every month that passes adds more workarounds, more undocumented fixes and more distance from any modern alternative.

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

When not to modernize

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.

  • Small, stable, near-zero-cost systems — if the legacy costs little, runs fine and touches nothing, modernizing it is solving a problem that does not exist.
  • Retiring systems — a system on its way to decommission should be kept quiet and stable, not rebuilt for the last two years of its life.
  • Systems where data cannot follow — if the source data cannot be extracted with its meaning intact, the modernization is really a new build wearing old data as a costume.
  • No leadership capacity — modernization changes how people work; without someone internal championing the change through the ugly middle, it stalls and becomes the most expensive failed project in the room.
  • A business that cannot absorb the change — right before a merger, an audit or a hard season is the wrong moment to re-platform the core.
  • The new thing is not clearly better — if the new platform is different but not measurably cheaper, faster or safer, the risk is being spent on novelty.
  • When the honest advice is modernize in place — some systems are better wrapped with a modern API than rewritten; the audit should say so plainly.

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 — wrap, migrate, retire

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.

  • Small, reversible steps — each phase moves one feature, one data slice or one user group; each step is reversible, because reversible decisions need no heroics.
  • The legacy keeps running — the business is never asked to trust an unproven system with the whole operation at once.
  • The new proves itself incrementally — a feature only wins when it has carried real work with verified results, not when a slide says it should.
  • Routes move gradually — a billing flow, a reporting path, a user segment; each migration of responsibility is a controlled experiment with a rollback.
  • Old and new run together — the two systems share the truth through a handshake layer while confidence builds.
  • The retire button is earned — the legacy is switched off piece by piece as the new system defect rate drops below the old one.
  • The business never sees the scar — from the operator seat, work continues the whole way through; the change is felt as improvement, not as downtime.

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 wrapper: modern APIs over legacy behaviour

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.

  • Behaviour becomes a service — the legacy calculation, its lookups and its rule enforcement are exposed as callable endpoints instead of buried inside its screens.
  • New features build on the wrapper — a modern frontend, a mobile app or a partner API all talk to the same interface the legacy now speaks through.
  • Parity is the acceptance test — before a wrapper is certified, we prove that calling the API produces the same result as driving the old screen, byte for meaningful byte.
  • The fragility is hidden — timeouts, retries and circuit breakers sit at the wrapper, so the old system quirks stop leaking into every new screen.
  • The wrapper is versioned — consumers pin to a contract; the wrapper can evolve, or later be replaced by a native implementation, without breaking them.
  • It is a path, not a destination — the wrapper exists to let the new world grow while the old world shrinks; the goal is to make the wrapper thinner over time.
  • Safely, one endpoint at a time — a rule that once lived in an obscure stored procedure becomes a disciplined service with its own tests, observability and owner.

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

Preserving business rules

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.

  • Rules harvested, not assumed — every conditional branch, comment and remembered habit is pulled out of the code and written in plain language the business can read.
  • Rules confirmed with owners — the audit rule list is walked with the people who own it; the system does X becomes X is intended and must continue.
  • Rules carry their exceptions — the special cases are documented as first-class citizens, because a system that only captures the rule fails exactly on the exception.
  • Rules become tests — each preserved rule is translated into an automated test in the new system, so a rule that disappears later fails the build, not the business.
  • Rules follow the money discipline — fee structures, thresholds and approval ceilings obey the same exactness as a ledger, because a mistranslated money rule is a mistranslated cost.
  • Nothing is carried by hearsay — a rule that cannot be evidenced from code or confirmed by an owner is flagged as at risk and decided explicitly, never silently dropped.

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

Data and behaviour preservation

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.

  • History carries its meaning — dates, references, statuses and amounts arrive with the context that made them meaningful, not as naked values in new columns.
  • Behavioural state survives — in-flight records, a pending approval, a scheduled payment, an open case, are mapped so the operation resumes rather than restarts after cutover.
  • Documents and files follow — the evidence behind the records, PDFs, images, scanned forms and agreements, moves with its links intact, not as an orphaned blob dump.
  • Snapshot fidelity — what a record looked like on any past date stays reconstructable, because audit, disputes and regulators will ask.
  • Migration of meaning, not shape — a status code in the old system becomes its spelled word in the new by a translation table both sides understand and both sides can audit.
  • Verification by behaviour — after the move, the same query run against old and new returns the same answer; parity is demonstrated, not promised.

The business story lives in both halves — the rows and the responses. We carry both, and we prove the carrying.

11

Phased migration with the business live

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.

  • Slices chosen by risk, not convenience — the first migrations are low-risk, high-confidence moves that build evidence; the money-bearing core moves last, when the pattern is proven.
  • Each phase has an owner and a test — a named business owner, a defined acceptance test and an explicit rollback trigger for every single step.
  • The business calendar governs — month-end, rent day, reporting deadlines and audit windows are mapped before a date is committed, because you do not migrate a reconciliation system on the eve of a reconciliation.
  • Traffic shifted gradually — a percentage of users, then more, then all; the shift is measured and reversible at each knob turn.
  • Evidence gates the next step — a phase does not pass on vibes; it passes on measured results, error rates and parity checks compared to the legacy.
  • The old system is not insulted — it remains the source of truth for what it has not yet handed over; nothing is retired that has not been proven replaceable.
  • Every phase leaves a working system — at any point, if the engagement ended tomorrow, what is live is fully operational; the migration is progress, never a cliff.

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

Migrating live payment flows safely

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.

  • Nothing is double-spent — idempotency keys and terminal states mean a replayed request during the switch is answered with the settled truth, never executed twice.
  • The ledger moves with the balance — wallet rows, ledger entries and audit references migrate atomically; a customer balance never changes because the platform changed.
  • Gateway integration is rehearsed — the payment wiring is rehearsed on every rail the business carries: STK Push, PayBill, C2B, B2B and B2C on M-Pesa/Daraja plus cards, wallets and bank transfers, each tested against live sandboxes and verified callbacks before a single production transaction moves.
  • In-flight money is handled, not cut — pending STK pushes, unsettled card charges and in-transit bank transfers are traced to their gateway and settled before or during the switch; nothing is orphaned at cutover.
  • Reconciliation rides alongside — the daily match against the gateway statement continues across the migration, so a mismatch immediately identifies which side of the switch produced it.
  • Escrow, holds and freezes survive — held balances move as held; a KYC hold or a subscription gate is a property of the money, not a casualty of the platform.
  • Rollback means replay-safe — if a payment slice is rolled back, the rollback itself is safe to run twice, because the discipline is the same as a normal retry.

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

The handshake with the old system

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.

  • Continuous sync, not one-off export — the two systems exchange the records both sides need on a cadence that matches how fresh the data must be.
  • One direction per record at a time — a record is written by exactly one side while the handshake exists, so there is never a question of who owns the field of truth.
  • Sequence and version markers — records carry sequences or version stamps, so out-of-order delivery cannot silently overwrite a newer truth.
  • Sync is reconciled, not assumed — the handshake layer runs its own parity check, comparing both sides counts and checksums on schedule.
  • Failure is designed for — a dropped sync queue, a paused legacy batch or a network blip pauses the handshake visibly and resumes idempotently; it never corrupts.
  • Logging on both banks — every exchange is logged in both systems, so a dispute about which system decided that is answerable from the records, not the meeting.
  • The handshake eventually dissolves — as slices move across, the exchanges shrink; the layer is designed from day one to vanish to nothing, not to become a second legacy.

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

People: training and documentation that match reality

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.

  • Documentation written from the work — training materials describe the job being done, in the words the floor actually uses, not the module names the vendor invented.
  • Training before the cutover — staff practise on a real environment against real cases before the switch, so the first day of go-live is not the first time they see the screens.
  • Champions inside the team — one or two respected operators are trained deeply first; they become the first line of help and the loudest proof that the new way works.
  • The exceptions get their own lessons — the tricky cases that used to need the person who knows are the ones rehearsed hardest, because that is where trust is won or lost.
  • Fast, human support in the first weeks — the go-live period is staffed so a stuck operator gets a same-day answer, not a ticket that comes back in a week.
  • Feedback loops that change the system — the first month of real use is treated as discovery; the workflow is adjusted where the reality differs from the design.

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

Post-move verification and sign-off

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.

  • Parity checks — the same records, queries and totals are pulled from old and new, and the answers agree; differences are resolved or explicitly accepted, never waved through.
  • Transaction integrity — where money is involved, the ledger balances, the gateway statement matches and every reference resolves; the numbers tie or the phase is not done.
  • User acceptance by the people who run it — the operators certify that the workflows they depend on are complete, not just the ones the design document lists.
  • Observability is verified, not assumed — monitoring, alerts and runbooks are exercised with a real safe incident, so the new system support posture is proven before it is needed.
  • Sign-off is explicit — a named owner signs each phase, putting their name on the evidence; sign-off is the permanent record that this slice was deliberately transferred.
  • Residuals are tracked — anything left for a later phase, a report, a data slice, a feature, is written down with its owner and its date, never left to memory.

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

Retiring the legacy without burning bridges

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.

  • The shadow period — old and new both run for an agreed window, and the old system output is compared to the new one; the parallel run is the proof, not the promise.
  • Data is archived, never destroyed — old tables are wrapped into a sealed, queryable archive with its own retention rules; history stays answerable without running on the critical path.
  • Access is cut gradually — read access lingers for auditors, then is removed; write access is the first to go, because the new system is the only place truth is written.
  • Credentials and secrets are rotated — gateway keys, service accounts and shared passwords are rotated at retirement, so no phantom process can act on the legacy authority.
  • The decommission is documented — what was retired, when, where the archived truth lives and who to ask, written down so the memory of the operation survives the operation.
  • The lessons are recorded — the modernization own scars and decisions become a note for the next modernization, because this is rarely the last one a company does.

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

The architecture you are moving toward

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.

  • A modular core — the business own rules live in cohesive services on a real ledger, so the next change is a field and a rule, not a tour of a monolith.
  • A clean API surface — mobile, web, partners and future integrations all speak to the same contracts, versioned and reliable, instead of screen-scraping the legacy.
  • A real database with real constraints — foreign keys, CHECK constraints and indexes replace the legacy anything-goes columns; the database itself refuses nonsense.
  • Observability as a baseline — logs, metrics and traces from day one, so the new system health is visible before it is needed, not instrumented after an outage.
  • Security by default — row-level access, least privilege, secrets management and audit trails are part of the architecture, not a late hardening exercise.
  • Payments grown in, not bolted on — if money is the product, the ledger, idempotency and reconciliation are built as the foundation, the way we built KodiiPay own.
  • Operable by more than its authors — deployment, backup, restore and diagnosis are documented and repeatable, so the platform stops being hostage to whoever wrote it.

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

Honest limits of modernization

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.

  • We cannot reconstruct lost knowledge — if the last person who understood a dark corner left, we can preserve the behaviour we can evidence, but the un-evidenced reasons may be gone forever.
  • We cannot modernize an organisation — software can support a change, but a workforce that is not ready will drag any system, however modern, back to its habits.
  • We cannot make a dirty source clean — if the old data is corrupt, duplicated or missing, the new system inherits the truth as it exists; we flag it, and we clean what cleanly can be cleaned.
  • We cannot promise zero risk — we spread risk across phases, but a modernization still changes how people work; the honest framing is managed risk, not no risk.
  • Modernization is not a one-time event — the new system will itself accumulate debt; the discipline that matters is that the next modernization is cheaper because the target is clean.
  • Sometimes the smallest correct move is to wrap and wait — and we will say so when it is, because the cheapest modernization is the one that does not happen until it must.

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

The modernization 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.

stack.toolchain

01

Audit & discovery

Know exactly what the legacy is before touching it

  • Structured legacy inventoryThe real feature, rule and integration map, built from evidence such as logs, tickets and usage, rather than stale specs.
  • Data profilingRow volumes, quality, orphaned records and the fields that decide whether a slice is safe to move.
  • Business-rule harvestingThe conditional branches and remembered habits extracted into plain language the business can sign.
  • Cost-of-keep modellingThe ongoing expense of the old system priced, so the case to move is arithmetic, not emotion.
  • Risk registerWhat breaks if a rule is missed or a table is dropped, ranked by the money at stake.
  • Go or no-go recommendationThe audit conclusion — wrap, migrate, modernize or leave alone — said plainly either way.

02

Integration & wrapping

Modern APIs over legacy behaviour

  • API gatewayThe modern contracting layer every new surface builds against while the legacy runs behind it.
  • Legacy adaptersTimeouts, retries and circuit breakers that hide the old system fragility from new consumers.
  • Contract testingThe wrapper certified by proving API output equals old-screen output, byte for meaningful byte.
  • Versioned endpointsConsumers pin to a contract; the wrapper evolves without breaking what already shipped.
  • Event and queue bridgesHandshakes that move records between old and new worlds on a verifiable cadence.
  • Credential rotationSecrets and gateway keys managed per integration and rotated at retirement so nothing acts on stale authority.

03

Data migration

The truth carried, verified and reconciled

  • ExtractorsRead every source — databases, dumps, files, scanned documents and the undocumented ones — reliably and idempotently.
  • Schema mappingField-by-field source-to-target maps with transformation rules attached to each.
  • Transformation pipelineMeaning-preserving conversions: statuses translated, IDs re-pointed, references rebuilt.
  • Validation gatesRow, reference and value rules that refuse to load what is not correct.
  • Parity engineCounts, checksums, totals and spot checks comparing old and new until they agree.
  • Idempotent reloadRe-running the migration over the same source produces the same result, never duplicates.

04

Application architecture

The clean ground new features grow on

  • Modular servicesThe business rules extracted into cohesive, owner-facing units instead of one sacred monolith.
  • Real ledger schemaForeign keys, CHECK constraints and atomic transactions that refuse nonsense the legacy tolerated.
  • Row-level securityData isolation per user, role and tenant enforced by the database, not the frontend.
  • Versioned API contractsMobile, web, partners and future rails all speak one language.
  • Observability foundationLogs, metrics and traces instrumented on day one, not retrofitted after an outage.
  • Feature flagsPhased rollout and instantaneous toggles so a slice can be turned and reversed on evidence.

05

Testing & verification

Parity proven, not promised

  • Parity test suitesThe same input against old and new must produce the same output, automated per slice.
  • Data reconciliation checksOld and new agree on counts, sums, statuses and references after every move.
  • Replay and race testsCallbacks and concurrent operations replayed to prove the new system is exactly-once.
  • Rollback drillsThe backout path is rehearsed against a live environment, not sketched on a slide.
  • User acceptance runsOperators certify the workflows they depend on, on real cases, before sign-off.

06

Operations & release

Change that the business can absorb

  • Phased rollout planSlices scheduled by risk and by the business calendar — never on rent day or month-end.
  • Continuous handshake syncOld and new exchange and reconcile records until the handover is complete.
  • Shadow and parallel runsThe old system output compared against the new for a defined window before retirement.
  • Sealed archivesRetired legacy data kept queryable and answerable with its own retention rules.
  • Decommission runbooksThe documented, staged retirement — access cut, secrets rotated, lessons captured.
  • Money-path cutover plansThe full rail set — STK Push, PayBill, C2B, B2B and B2C on M-Pesa/Daraja plus cards and bank transfers — rehearsed with the exact once discipline payments demand.

07

People & process

The humans who have to live in the new system

  • Work-native documentationMaterials written from the job being done, in the words the floor uses.
  • Champion trainingRespected operators trained first; they become the first line of help and the proof it works.
  • Go-live support surgeThe first weeks staffed so a stuck operator gets a same-day answer.
  • Exception rehearsalsThe tricky cases that used to need the person who knows practised hardest.
  • Knowledge transferThe new system operated by more than its authors — documented, repeatable and teachable.

Lifecycle

The modernization 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

Audit

Map what the legacy is, what it holds, what it costs and who depends on it, from evidence, not memory.

02

Decide

The audit conclusion: what gets wrapped, what migrates, what retires and what is deliberately left alone.

03

Wrap

The first slice of legacy behaviour exposed as a modern, versioned API with parity tested.

04

Prove

The wrapper certified — new output equals old output, replay-safe and observable.

05

Migrate data

Slices of data extracted, transformed, validated and reconciled against the source of truth.

06

Handshake

Old and new worlds sync continuously; every exchange is logged and reconciled on both banks.

07

Build clean

New features grow on the modern ground while the legacy drains one responsibility at a time.

08

Shift traffic

Users, branches and features move across gradually, each shift measured and reversible.

09

Verify and sign off

Parity, integrity and user acceptance evidenced; a named owner signs each slice.

10

Train and document

Staff trained on real cases; documentation written from the work, kept current as reality corrects the design.

11

Retire

The shadow period ends, access is cut, secrets rotated and data sealed into a queryable archive.

12

Operate and learn

The new system is monitored and supported; the lessons become the next modernization map.

Closing

More than development

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:

An honest audit of what the legacy is, holds and costs, from evidence, not memory.A clear decision about what should move, what should be wrapped and what should be left alone.The strangler fig — wrap, migrate, retire — never a big-bang bet.Legacy behaviour exposed as modern, versioned APIs.Business rules harvested, confirmed with owners and preserved as tests.Data and behaviour carried across with their meaning intact.Documents and files moved too, not just tables.Phased migration with the business live throughout.Live payment flows migrated with the discipline of payments: atomic, idempotent and reconciled.A continuous handshake between old and new worlds.Staff trained and documented for the job as it really is.Post-move verification with named owners and explicit sign-off.A shadow period that proves the new system before the old retires.Retirement that archives history and rotates credentials.A modern target architecture clean enough to operate.Observability and security built in, not bolted on.Honest warnings when the cheapest move is to wrap and wait.No hostageware — the new system is owned by the business.The lived discipline of a studio that modernized its own money platform.Change delivered in steps the business can absorb and trust.

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

Building something like this?

The discipline above is what we run on our own products every day. If it would help on yours, our door is open.