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:
| Layer | Correctness standard | Cost of getting it wrong |
|---|---|---|
| Identity | Exactly one target account per person, with every join intact | Every other layer inherits the error |
| Wallet balances | Exact, to the smallest unit, in every currency held | Player funds discrepancy — commercial and regulatory |
| KYC / verification state | Status preserved only where the evidence chain and the regime allow | Unlawful processing or a mass re-verification funnel |
| Responsible-gambling state | Exclusions, limits and flags applied before the first login is possible | The worst defect class a migration can produce |
| Bonus state | Liability and wagering progress carried per the decided rule | Silent resets — immediate player-visible breach of trust |
| History | Complete to the cut line, archival access beyond it | Support 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
| Order | What | Exit criterion |
|---|---|---|
| 1 | Identity map on full production-shaped data | Ambiguity queue empty; duplicate policy applied; map frozen |
| 2 | RG state and compliance flags | Independently verified on target; enforced before any login path opens |
| 3 | Balances and bonus state | Reconciliation report at zero unexplained difference |
| 4 | History to the cut line | Support and reporting can answer without the source platform |
| 5 | Full rehearsal, timed | Duration 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.