Move data safely, so the story behind it survives the move.
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
Data migration is where businesses quietly lose their history — a column mapped wrong, records silently dropped, references broken so the new system doesn't know who owes whom. We move data as the operation it is: extraction from any source including the ones nobody documented, transformation that preserves meaning rather than just shapes, validation and reconciliation before cutover so the old and new systems agree, and a planned cutover with a rollback that actually works. Post-move verification and sign-off confirm the story survived — including documents, files and records, not just the database.
What a data migration build covers:
Data migration goes wrong in the meaning, not in the move: rows survive while the understanding that made them valuable quietly dies, and the business only notices months later when the history matters. The standard we hold is that a move succeeds only when old and new agree to the last record, the last reference and the last penny — anything less is a copy that has not been proven. Dry runs are repeated until the real cutover is a repeat of something already done, checksums and audits ride every batch, and the rollback is rehearsed so the exit is a routine rather than a rescue. Nothing moves that has not been weighed, and nothing is trusted that has not been re-checked on the far side.
What we do
How we do it
02 · The full discipline
Every database migration carries the same quiet risk: the numbers move, but the meaning walks. A column mapped to the wrong field, records dropped at a batch boundary, references broken so the new system cannot tell who owes whom — each is a small, silent loss that the business only discovers months later, when the history matters. Data migration is where companies quietly lose their story, and most of them never notice until they need it.
We move data the way we move money — because the discipline is the same. On KodiiPay we migrate live transaction histories, wallet balances and ledgers where a single misplaced row is a real money error, and that has made us ruthless about the machinery: inventory, mapping, transformation, validation, reconciliation, dry runs, a frozen cutover and a rollback that actually works. Whether the data is M-Pesa records, card and wallet statements, bank transfer files or customer files, the standard is identical — carried in full, carried in meaning, and proven to be the same after the move.
Below is how data migration is really done. Every section covers the discipline from the first inventory to the final sign-off — extraction from the undocumented sources, transformation that preserves meaning, the parity check as the product, the cutover with a backout that works, and the honest limits of what a migration can and cannot fix.
03
A migration is commonly treated as a technical task: write a script, run it, verify a count, call it done. We treat it as an operation — a full-time project with named phases, owned risks and a definition of done anchored to the business trust in the data, not to a script exit code.
A migration is paid for in trust, and trust is earned by evidence. We run migrations as operations with a paper trail, because the data is only as good as the proof it arrived correctly.
04
You cannot move what you cannot name. Before a single row is extracted we build an inventory of everything the source holds — tables, views, files, documents, archives, the spreadsheet behind the door, the export that finance started three years ago. The undocumented sources are exactly the ones that hide the truth.
The inventory is the migration contract with reality. It names what the move touches — including the undocumented corners where a careless migration quietly loses history.
05
The hardest sources to extract are not the exotic ones; they are the ordinary ones nobody documented properly — the database with no schema notes, the vendor system with a read-only export, the Excel file where one sheet is the real truth and the others are decoration. Extraction reads all of them, and reads them reliably, which is itself a discipline.
Extraction is where the migration is won or lost in microcosm: if the read is unreliable, everything downstream — transform, validate, reconcile — is polishing an untrustworthy foundation.
06
The schema map is where every assumption becomes visible. Each source field is matched to a target field, and every transformation is written down: the status codes that change value, the IDs that get re-pointed, the dates that shift format. Nothing is left to the moment when someone spots a column in the new system and thinks it means something it does not.
The schema map is the paper contract between two worlds. When every field is decided, reviewed and signed, the move becomes execution of an agreement rather than a leap of inference.
07
Transformation is where shape-changes happen, and shape is exactly the wrong thing to preserve: what must survive is meaning. A status that was a single letter must become its spelled word, a region code becomes a name, and a proportion that was stored as a percentage must remain the same proportion after the decimal moved. We transform so a person reading the new data understands what the old data meant.
The test of a great transformation is simple: a domain expert who knew the old data can read the new data and recognize every record, every status and every exception.
08
Two tables that referenced each other must still reference each other after the move, or the new system does not know who owes whom, which unit belongs to which property, which invoice belongs to which customer. Reference integrity is the difference between migrated data and data that behaves like the business expects it to.
Data that has lost its relationships is not data; it is a pile of independent facts with no knowledge. We verify that the new system knows the same connections the old one did — because those connections are the business.
09
Every migrated system carries its own vocabulary — statuses, reasons, types, codes. When the new system speaks a different language, every record must be translated, and the translation must be complete and consistent, or the new system will show records in states the business does not recognize.
A filtered report in the new system is a promise about the data it returns. If the statuses were translated wrong, that promise is quietly broken in every report the business runs.
10
Validation in a migration is not a report you glance at; it is a gate the data physically cannot pass without meeting the rules. The database, the load process and the pre-load checks each enforce their layer, so invalid data stops at the boundary instead of entering the new system dressed up as truth.
The cleanest way to end up with a clean database is to refuse to fill it with dirty data in the first place. Our gates exist so a migration quality is decided at the boundary, where it is cheap — not in production, where it is expensive.
11
The single most honest sentence in data migration is this: the parity check is the product. Every other piece of the operation exists to make old and new agree, and the migration is not finished until they agree — to the last record, the last reference, the last penny. We build the parity engine the week the migration plan is born, not as an after-action report.
We have reconciled migrated money on our own platform, where the price of a missed row is real cash and real trust. That is why the parity check is built, budgeted and non-negotiable in every migration we run — the move is only done when old and new say the same thing.
12
There is a category of migration that tolerates no rounding: money. Wallets, transaction histories, ledgers, floats, pending settlements — a single mis-mapped row is not an inconvenience but a real loss. Migrating money data is payment engineering, and we run it with the exact machinery our live payments platform uses every day.
Money data is the same discipline as our own platform: atomic, idempotent, reconciled to the penny and provable in minutes. Everything else in this document is preparation; for money, this is the whole game.
13
Migrations go wrong, and the response is to fix and re-run — not to improvise. Every load, transform and validation step is built idempotent, so re-running it over the same source produces the same result without duplication. The migration can be repaired by re-running, which is the only sane way to repair something you trust with history.
The unspoken requirement of any migration that carries trust is being able to try again safely. Idempotency is what makes trying again a working recovery instead of a gamble.
14
Nobody's first landing should be the real landing, and no migration's first full execution should be the go-live. We run dry runs that exercise the entire operation — extraction, transformation, load, validation, reconciliation, the full freeze window — against the real data shapes and real volumes, so what the business sees on cutover night is a repeat of something we have already proven.
A rehearsal that ends with parity and a clean recovery is the closest thing a migration has to certainty. We spend the nervousness in the rehearsal so the business does not spend it on the night.
15
The frozen cutover is the one disciplined window during which data stops changing at the source, everything moves, and the switch is thrown. Its entire purpose is to buy determinism: a single, bounded moment when old and new can be compared with nothing moving underneath either one.
The freeze is where a migration earns its discipline or spends it — a short, named, rehearsed window beats a long, improvised weekend every single time.
16
Every cutover has a stated exit unless it has a rehearsed one — and an un-rehearsed backout is a story you tell after the fact, not a plan you execute during the crisis. We design the rollback the same week we design the move, and we prove it in the dry run, so the exit is a routine, not a rescue.
A rollback that has never run is a rollback that has never been tested — which is to say, a rollback you do not have. We rehearse the exit so that going back is boring, and boring is what you want when it is 2am and the parity check says no.
17
The cutover ends, and the migration is still not finished: the move is only done when the new system has been verified in its own working life, and an owner has signed that the old world truth has genuinely transferred. Sign-off is the formal bridge between the data arrived and the business runs on it.
Verification without sign-off is a report no one owns; sign-off without verification is a signature on hope. We deliver both, attached to each other.
18
Because we have migrated money and history for real, we are direct about what a migration cannot fix. It cannot invent data that was never captured, cannot restore meaning that was lost before we arrived, and cannot make bad source data clean by wishing. The honest conversation about those limits happens before the contract, not after the cutover.
A good migration leaves you with the truth you had, intact — and a clean, reconcilable place to build the truth you want. We deliver exactly the first, and we are honest about exactly everything else.
The toolchain
A migration is a pipeline with a parity engine — every layer exists to carry records, preserve meaning and prove the move. This is the toolkit we run to take data from any source into a new home with its story intact.
01
Know what exists before moving it
02
Read everything, change nothing
03
Meaning preserved, references rebuilt
04
The data refuses to enter wrong
05
The parity check is the product
06
The highest-stakes migration, run as payment engineering
07
The wired run with a rehearsed exit
Lifecycle
Every migration we run follows the same arc — inventory, map, transform, prove, cut over and verify — with the parity check as the centre of gravity the whole operation rotates around.
01
Find every table, file and document, including the undocumented ones, and record its owner, meaning and condition.
02
Measure volumes, quality, duplicates and hidden dependencies so the plan fits the real data.
03
Field-by-field source-to-target maps with transformation rules and an owner on every risky decision.
04
Read everything reliably into sealed snapshots with checksums and provenance, changing nothing at the source.
05
Translate codes, normalize formats and re-point references so meaning survives the shape change.
06
Sequence-aware loads in batches, idempotently, into a staging area that refuses invalid records at the gate.
07
Row rules, set invariants and business-rule checks gate every batch; rejections are queued, not swallowed.
08
Count, sum, hash and reference parity against the source — for money, to the penny.
09
The full operation rehearsed on real shapes and volumes, with a rehearsed backout and failure injected.
10
A coordinated window: the source is held, the final delta moves, and the switch is one named step.
11
Real-work checks and a re-run of parity after the new system starts carrying the business.
12
A named owner certifies each scope on evidence; the lessons become the next migration playbook.
Closing
Data migration is where history either survives or quietly dies — and the difference is machinery, not luck. We move data the way we move money, and the move is only done when old and new say the same thing. That includes:
A migration is not a script that runs once — it is an operation with a paper trail, a rehearsed exit and a definition of done measured in parity, not in rows moved.
We have migrated live money and history for real. When your data is the story your business needs tomorrow, it moves through machinery that has survived the highest-stakes kind of move — and it arrives intact.
Previous capability
Legacy System Modernization
Next capability
Maintenance & Support
The discipline above is what we run on our own products every day. If it would help on yours, our door is open.