How Full-Population Reconciliation Works (Not Just Record Counts)

Record counts are necessary. They are not sufficient. Yet many migration programmes still treat a matching count pack as the main evidence that data “moved correctly.” That habit is how organisations get a green cutover and a red first month-end.
Data migration reconciliation is the discipline of proving that in-scope data in the target matches the original dataset, not approximately, not by sampling a few friendly records, but by population-level evidence the business can defend. At Cyber Samurai, reconciliation is not a reporting courtesy at the end. It is the standard of done: every in-scope record migrated and reconciled back to source, with exceptions classified on purpose.
This article goes deep on how full-population reconciliation works in practice for mid-market CRM, ERP, and finance programmes. For the wider stage model, see our data migration methodology. For why weak proof shows up after go-live, see why migrations fail after go-live.
What reconciliation means in a migration programme
Reconciliation is the comparison of source and target using agreed definitions, producing evidence that is:
- Complete for the in-scope population
- Repeatable across test cycles and cutover
- Explainable to business owners, not only engineers
- Actionable when breaks appear (fix path and owner)
- Auditable after the programme if finance or regulators ask how you knew
It is not:
- Opening ten accounts in the new UI
- A one-off spreadsheet someone built once under pressure
- “The load job finished without errors”
- A count match with no shared filter definition
If two teams cannot state the same in-scope query, they are not reconciling. They are negotiating.
Why counts alone create false confidence
Counts answer one question: Did the same number of rows land under this filter?
They do not answer:
- Are they the same business entities?
- Did amounts, quantities, and balances survive transformation?
- Did relationships hold (customer to contact, order to line, invoice to payment)?
- Did status, tax, currency, and period rules apply correctly?
- Did high-value or high-risk records land correctly even if the bulk looks fine?
Classic false-green scenarios:
| Count result | Hidden failure |
|---|---|
| 10,000 invoices matched | Totals differ by mapping or tax treatment |
| Customer counts matched | Hierarchy or bill-to/ship-to links broken |
| Stock lines matched | Location or UOM conversion wrong |
| Open items matched by count | Aged into the wrong period |
| CRM contacts matched | Activities and notes never in scope but assumed present |
Counts are layer one. Full-population reconciliation is a stack of layers.
Freeze the population before you compare anything
Most reconcile arguments are definition arguments in disguise.
Before the first formal pack, lock:
- Entity list, what business objects are in scope
- Filters, active/inactive, date boundaries, company codes, brands, statuses
- Source of truth extract, system, timing, and isolation from dual updates
- Business keys, how a real-world entity is identified across systems
- Transformation effects, splits, merges, defaults that change counts legitimately
- Accepted exclusions, deliberate outs with sign-off
Write the source population query and the target population query as paired artefacts. Version them. Tie each test cycle to a version. When counts move, you need to know whether data moved or definitions moved.
Measured baselines matter. “About two million customers” is not a denominator. Status breakdowns, entity splits, and date-bound subsets are.
The five layers of full-population reconciliation
Use all five for material domains. Light domains might use a subset, but finance and open operational positions rarely get to skip layers.
Layer 1, Population (counts with identical scope)
Compare in-scope counts source versus target using the frozen filters.
Good practice:
- Break counts by natural slices: company, status, type, period, location
- Explain legitimate count changes from approved rules (merge duplicates, exclude archive)
- Track count trends across test cycles, not only the latest run
A flat total that matches while a status slice is inverted is still a break.
Layer 2, Identity (keys, orphans, duplicates)
Prove the same business entities exist on both sides.
Good practice:
- Match on agreed business keys (and surrogate mappings where required)
- Report source orphans (in source scope, missing in target)
- Report target orphans (in target, not explainable from source scope)
- Report duplicates created or retained against rule
Identity breaks are how “counts matched” and “customers are missing” coexist. Two target rows can replace one source row and keep a count story looking healthier than the business reality.
Layer 3, Value (sums, balances, quantities)
Prove the money and quantity truth.
Examples by domain:
- Finance: subledger totals, open-item balances, trial-balance components, control accounts
- ERP: stock quantities and values by location, open order value, GRNI-style holds where relevant
- CRM: less often monetary at master level, but pipeline value and contracted value fields may be material
Value packs should use the same population filters as count packs. Reconciling different populations by amount is how teams create comforting nonsense.
For financial controls, tolerance is usually zero unless a historical exception is explicitly approved. “Immaterial” needs a number and an owner, not a vibe.
Layer 4, Rule (mandatory fields, statuses, transformations)
Prove the logic, not only the bulk maths.
Check distributions and invariants such as:
- Mandatory fields populated at expected rates
- Status distributions within expected bands after mapping
- Currency and tax fields consistent with rules
- Date logic (order date versus invoice date versus period)
- Reference data decoded to valid target codes (no silent dumping into “other”)
Rule checks catch systematic transformation bugs that can still leave counts and even some totals looking plausible.
Layer 5, Deep-dive (stratified business review)
Full-population automation does not replace human judgement on awkward records. It tells you where to look.
Select samples by risk, not convenience:
- Highest value
- Oldest open items
- Multi-entity or multi-currency complexity
- Known dirty source clusters
- Records business owners already distrust
Business owners review these in the target with source evidence side by side. Their sign-off is part of the pack, not a hallway conversation.
Building a reconcile pack that people will actually use
A strong pack has two altitudes:
- One-page executive summary, green/amber/red by entity, top breaks, decisions needed
- Detail tabs or extracts, engineers and analysts can debug without rewriting queries
Keep the format identical every cycle. When the shape of evidence changes weekly, stakeholders stop trusting the signal and restart anecdote-driven debates.
Minimum contents per in-scope entity:
- Population definition version
- Count comparison (total + slices)
- Key match rates and orphan lists
- Value comparisons where relevant
- Rule exception summary
- Deep-dive sample list and outcomes
- Exception register (accepted vs blocking) with owners
- Trend versus prior test cycle
Automate generation where you can. Manual hero packs do not survive cutover fatigue.
Exception management: the difference between control and chaos
Every break must become one of three things:
| Classification | Meaning | Action |
|---|---|---|
| Blocking defect | Must be fixed before sign-off | Fix source, rule, or load; re-run evidence |
| Accepted exclusion | Deliberate, approved difference | Document rule, owner, business impact |
| Investigation | Not yet understood | Time-boxed; cannot remain vague through cutover |
“We’ll live with it” is only valid as an accepted exclusion with a signature. Unclassified breaks are how programmes smuggle risk into production.
Also separate:
- Source issues (truth was already wrong or unstable)
- Mapping/rule issues (transform incorrect)
- Load/technical issues (pipeline or target validation)
- Definition issues (filters disagreed)
Without classification, every break becomes an argument about blame instead of a path to fix. This is one reason pre-migration observability matters: it reduces the volume of source instability mislabelled as load failure.
How reconciliation runs through the programme timeline
Reconciliation is not a cutover-only activity.
| Phase | Reconciliation role |
|---|---|
| Discovery | Define populations, keys, anchors, and success thresholds |
| Mapping | Predict legitimate count/value changes from rules |
| Early test loads | Stand up automated packs; find definition bugs |
| Dress rehearsals | Full-volume proof; defect burn-down against packs |
| Cutover | Final source extract versus target; go/no-go input |
| Hypercare | Targeted packs on volatile domains; trust transfer |
If the first serious pack appears in the final rehearsal, you have scheduled panic. Build packs early so each cycle teaches you something measurable.
CRM, ERP, and finance: what “good” proof looks like
CRM
Often lighter on monetary value packs, heavier on identity and relationship integrity.
Must-pass examples:
- Account and contact population by status and ownership
- Hierarchy integrity
- Activity/notes volume if history is in scope
- Integration identifiers required by downstream tools
- Duplicate handling outcomes against rule
A CRM migration can count-match and still fail commercially if history and relationships are wrong.
ERP
Operational positions are the trust core.
Must-pass examples:
- Item master population and key attributes
- Open sales/purchase document counts and values
- Inventory quantity and value by location
- Unit-of-measure and status distributions
- Critical reference data decode success
Day-one warehouse and order management will expose identity and value breaks faster than a steering dashboard.
Finance
This is where full-population discipline is non-negotiable.
Must-pass examples:
- Subledger to control account alignment
- Open-item population and balances
- Period assignment integrity
- Trial-balance component reconciliation under agreed cut rules
- Multi-currency valuation rules where in scope
Finance sign-off on samples alone is not control. It is optimism.
Common reconciliation anti-patterns
| Anti-pattern | Why it hurts | Replace with |
|---|---|---|
| UI spot checks only | Misses silent population gaps | Automated full-population packs |
| Counts without shared filters | Fake matches / fake breaks | Versioned paired queries |
| New pack format every cycle | Stakeholder distrust | Stable template + trends |
| Unowned exceptions | Risk enters production quietly | Exception register with sign-off |
| Reconcile only at cutover | No time to fix systemic issues | Packs from early test cycles |
| One global tolerance | Hides material local breaks | Domain-specific thresholds |
| Ignoring source instability | Endless “migration” defects | Observability baseline + classification |
What “reconciled” should mean in acceptance criteria
Put language like this in the statement of work and the steering pack:
- All in-scope entities have population and identity packs at agreed pass thresholds
- Value packs for financial and operational anchors are at agreed tolerances (default zero for financial controls)
- All blocking defects closed or formally deferred with executive sign-off
- Accepted exclusions documented with business owner approval
- Deep-dive samples for high-risk strata reviewed and signed
- Final cutover pack produced from the final source extract and archived
That is what makes migration acceptance evidence-led rather than ceremonial.
If you need help shaping this before a large SI commitment, a Data Migration Readiness Assessment stresses whether your programme has the definitions, owners, and proof approach required to reconcile for real.
Proof is the product
Full-population data migration reconciliation is how mid-market organisations avoid the most expensive kind of migration success: a go-live that only engineering can defend. Counts start the story. Keys, values, rules, and deep-dives finish it. Exceptions become decisions. Trust becomes transferable.
If your current plan still treats reconciliation as “we’ll check some records after load,” you do not have a reconciliation plan yet. You have a hope.
Next step: Use this inside a full migration methodology, start source observability before build, or talk to us about migration delivery.
Questions
Frequently asked
- The process of proving that in-scope data in the target system matches the original source dataset using agreed definitions and evidence, including counts, keys, values, rules, and targeted deep-dives, not only technical load success.