Compare a fictional membership migration

Choose a supplied pair, or two JSON datasets following the method. Checks cover users, purchases, progress and job references. An invariant failure remains unresolved; equal row totals do not prove preservation. Each file is limited to 256 KiB and 1,000 records per table. Files stay local.

Local dataset comparison

Choose both files. JavaScript is required.

Results contain at most 100 validation issues and 500 differences. Any limit or unresolved input is explicit. Reload clears inputs.

Unchanged control

Valid records survive unchanged.

Before JSON · After JSON

{
  "status": "compared",
  "afterIssueCodes": [],
  "summary": {
    "added": 0,
    "removed": 0,
    "changed": 0
  },
  "differences": []
}
Missing job

A valid dataset can still omit a required source record.

Before JSON · After JSON

{
  "status": "compared",
  "afterIssueCodes": [],
  "summary": {
    "added": 0,
    "removed": 1,
    "changed": 0
  },
  "differences": [
    {
      "type": "removed",
      "table": "jobs",
      "id": "j2",
      "before": {
        "id": "j2",
        "userId": "u2",
        "purchaseId": "p2",
        "status": "queued"
      }
    }
  ]
}
Duplicate identifier

Equal counts conceal a duplicate and lost identity.

Before JSON · After JSON

{
  "status": "unresolved",
  "afterIssueCodes": [
    "DUPLICATE_ID"
  ]
}
Broken user join

Equal counts conceal a purchase pointing to an absent user.

Before JSON · After JSON

{
  "status": "unresolved",
  "afterIssueCodes": [
    "MISSING_USER",
    "MISSING_ENTITLEMENT",
    "JOB_OWNER_MISMATCH"
  ]
}
Job owner mismatch

Existing identifiers can still form the wrong relationship.

Before JSON · After JSON

{
  "status": "unresolved",
  "afterIssueCodes": [
    "JOB_OWNER_MISMATCH"
  ]
}
Progress without a purchase

A progress course must match a purchase for the same user.

Before JSON · After JSON

{
  "status": "unresolved",
  "afterIssueCodes": [
    "MISSING_ENTITLEMENT"
  ]
}
Changed price and progress

Exact numeric field differences remain visible.

Before JSON · After JSON

{
  "status": "compared",
  "afterIssueCodes": [],
  "summary": {
    "added": 0,
    "removed": 0,
    "changed": 2
  },
  "differences": [
    {
      "type": "changed",
      "table": "purchases",
      "id": "p1",
      "field": "amountCents",
      "before": 1200,
      "after": 120
    },
    {
      "type": "changed",
      "table": "progress",
      "id": "g1",
      "field": "percent",
      "before": 25,
      "after": 0
    }
  ]
}
Equal-count record replacement

Two job totals match while one id disappears and another appears.

Before JSON · After JSON

{
  "status": "compared",
  "afterIssueCodes": [],
  "summary": {
    "added": 1,
    "removed": 1,
    "changed": 0
  },
  "differences": [
    {
      "type": "removed",
      "table": "jobs",
      "id": "j2",
      "before": {
        "id": "j2",
        "userId": "u2",
        "purchaseId": "p2",
        "status": "queued"
      }
    },
    {
      "type": "added",
      "table": "jobs",
      "id": "j9",
      "after": {
        "id": "j9",
        "userId": "u2",
        "purchaseId": "p2",
        "status": "queued"
      }
    }
  ]
}

Download the standalone practice kit

Original synthetic examples with independently specified outcomes. Not a vendor test, real migration, or verification of a real message. Our editorial method

What the synthetic kit checks

Each dataset has users, purchases, progress, and jobs. Every record has an exact string identifier. Purchases and progress must refer to a known user; progress needs a purchase for the same user and course; job references must agree with their purchase. The downloadable method defines the complete invariants.

Two exports with equal row counts can still contain a missing ID or a broken reference. The supplied cases deliberately seed these failures. Unknown or invalid inputs remain unresolved rather than receiving invented matches.

Use it as one layer of an acceptance rehearsal

Keep untouched before and after exports. Run the known cases first, then adapt only the schema and invariants you have explicitly reviewed. The original fixtures are not a real membership platform export. Passing this model does not verify passwords, email, entitlements, schedules, consent, or actual destination behavior.

The standalone practice kit includes a Node runner and expected outcomes. It needs no account or network connection.

Take it with you

Relational cases and expected findings

Download worksheet

Sources & verification

Product details and prices can change. Check the linked provider before buying.

  1. PostgreSQL documentation: constraints and foreign keys Accessed 2026-09-14

Sources link directly to providers. Product buttons may use separately labeled affiliate links. Read our disclosure.

Your decision at a glance

Compare the options

Full comparison

Documentation-based guidance. No tested ranking or performance score.

Managed VPS

KnownHost

Consider it for
Consider for a defined VPS or server-administration requirement, with a written support scope and migration plan.
Starting cost
Basic managed VPS advertised from $43.25/month; confirm term and full invoice
Before you choose
Add-ons and responsibilities need confirmation. No course capacity, speed advantage or completed KnownHost migration has been tested here.

Checked 2026-09-14 · Pricing source

View KnownHost plans

Ordinary provider link. No affiliate partnership claimed. Link disclosure

Hosting

Liquid Web

Consider it for
A hosting candidate to investigate when you can specify the workload and support responsibilities you need covered.
Starting cost
Configuration-dependent; obtain the full upfront and renewal quote
Before you choose
Management scope and extras vary. No universal compatible plan price or tested performance result is claimed.

Checked 2026-09-13 · Pricing source

View Liquid Web plans

Ordinary provider link. No affiliate partnership claimed. Link disclosure

Managed WordPress

Kinsta

Consider it for
A candidate for WordPress course and membership sites with a documented workload and a need to discuss PHP capacity.
Starting cost
Plan-dependent; confirm the full invoice, renewal, and required capacity
Before you choose
No plan is verified here for a specific learner count. Confirm capacity, plugin compatibility, and extra charges.

Checked 2026-09-13 · Pricing source

View Kinsta plans

Ordinary provider link. No affiliate partnership claimed. Link disclosure

Managed WordPress

WP Engine

Consider it for
A managed WordPress candidate to evaluate against your course plugins, member access rules, and migration plan.
Starting cost
Plan-dependent; confirm billing term, renewal, and extras
Before you choose
Confirm the proposed plan's compatibility, support scope, and destination cache behavior. No measured speed advantage claimed.

Checked 2026-09-13 · Pricing source

View WP Engine plans

Ordinary provider link. No affiliate partnership claimed. Link disclosure