What is actually in "player data"

Each layer has a different correctness standard, a different failure cost, and a different owner. Treating them as one dataset is the first mistake:

LayerCorrectness standardCost of getting it wrong
IdentityExactly one target account per person, with every join intactEvery other layer inherits the error
Wallet balancesExact, to the smallest unit, in every currency heldPlayer funds discrepancy — commercial and regulatory
KYC / verification stateStatus preserved only where the evidence chain and the regime allowUnlawful processing or a mass re-verification funnel
Responsible-gambling stateExclusions, limits and flags applied before the first login is possibleThe worst defect class a migration can produce
Bonus stateLiability and wagering progress carried per the decided ruleSilent resets — immediate player-visible breach of trust
HistoryComplete to the cut line, archival access beyond itSupport blindness and unfulfillable regulator requests

Notice that the two layers with the highest failure cost — responsible-gambling state and balances — are also the smallest by volume. Size and importance are unrelated in this workstream, which is why prioritising by table row-count gets it exactly backwards.

Identity first, everything else joins through it

The identity map is built first because every other artefact depends on it, and it is where the source platform's accumulated tolerance comes due: duplicate accounts, shared emails, formats that were never validated, test accounts nobody flagged. Three practices keep it sane:

  • Deterministic rules, written down. What makes two source records the same person, what happens to duplicates, who adjudicates the ambiguous cases. Judgement calls happen — they happen once, in a documented queue, not per-record in a script.
  • Validate against reality, not the schema. The schema says email is unique; the data says otherwise. Run the map against full production-shaped exports early, because every surprise found in rehearsal is one not found at cutover.
  • Freeze it before cutover. A map that keeps changing while balances are being reconciled produces differences nobody can explain. Late-arriving account changes go through a controlled delta process, not an edit.

Balances: the reconciliation contract

Write the reconciliation contract before the first rehearsal — it is the definition of done for the entire workstream:

  • Scope: every balance type that exists — real, bonus, pending, held, loyalty points — in every currency, including the accounts everyone assumes are empty.
  • Method: source snapshot and target snapshot at the same logical moment, compared at account level, not in aggregate. Aggregates hide offsetting errors, and offsetting errors are still errors in individual players' money.
  • Tolerance: zero. Every difference is explained and resolved, or the cutover does not proceed. A "small" unexplained difference is not small — it is evidence the process has a defect of unknown size.
  • Artefact: a signed report, retained with the migration evidence, reproducible from the snapshots. This is the document the regulator, the auditor and the first disputing player will each eventually require.

The states that must never lapse

Balances can be frozen during a cutover window; protections cannot. Self-exclusions, deposit limits, cool-offs and risk flags must be enforced on the target platform before any player can log in — including the interval when the migration itself is running. That usually means they migrate first, are verified independently of the main reconciliation, and are re-checked as the final pre-open gate. If a register integration exists in the market, its rewiring belongs to this gate too, not to the general integrations list.

Sequencing and the rehearsal loop

OrderWhatExit criterion
1Identity map on full production-shaped dataAmbiguity queue empty; duplicate policy applied; map frozen
2RG state and compliance flagsIndependently verified on target; enforced before any login path opens
3Balances and bonus stateReconciliation report at zero unexplained difference
4History to the cut lineSupport and reporting can answer without the source platform
5Full rehearsal, timedDuration and defect rate stable across consecutive runs

The loop in step five is the honest schedule generator: the migration window you can commit to is the rehearsal duration you have actually measured, plus the contingency you have actually rehearsed — not the duration you hope for. This feeds directly into the freeze-window decision in parallel run and cutover.

After cutover: keep the evidence

The snapshots, the reconciliation report, the identity map and the decision log survive the project. Retention duties continue across the platform change, disputes reach backwards in time, and the question "what did this account look like before the migration" arrives months later with a deadline attached. Archive the workstream as if you will be asked to defend it — because the one time it matters, you will be.

Continue reading: The migration risk checklist — everything around the data that also breaks. KYC and AML across regimes — the verification design the migrated statuses land in.