# Reproducible n8n migration lab Tested 6 September 2026 with n8n 2.19.3 and Node 26.7.0. These are actual local n8n executions against a synthetic CRM bound to 127.0.0.1:4398. There are no Zapier measurements or external CRM writes. In a NEW empty folder, copy the two .mjs scripts, install n8n 2.19.3 on a supported Node version, then run: ```sh node build-fixture.mjs N8N_USER_FOLDER="$PWD/state" N8N_DIAGNOSTICS_ENABLED=false N8N_VERSION_NOTIFICATIONS_ENABLED=false n8n import:workflow --input=workflow-input.json node run-demo.mjs ``` The script sets its own isolated N8N_USER_FOLDER to ./state. Do not repoint it at a production n8n database. Stop if port4398 is occupied; the harness never intentionally reuses another service. Only synthetic example.test records are sent to its local HTTP server. CLI commands create a local test database and export; they do not activate a production trigger. The resulting results.json must match assertions; do not substitute expected counts for actual output. Observed: six scenario executions, three completed write-path cases, two held inputs, one deliberately failed permanent outage, seven CRM POST attempts and two unique records. A seventh execution after importing the exported workflow replayed an existing event and created zero additional records. Both invalid input and missing permission reached the Hold for review node, confirmed in actual execution output. CRM field assertions verify trimmed company, normalized email and an event ID used as the idempotency key. The local CRM implements idempotency. Real CRM APIs may not accept the same header: use a durable idempotency ledger or supported unique/upsert key, and test concurrent duplicate delivery. This fixture does not prove concurrency correctness, real provider rate limits, email delivery, credential migration, SaaS billing or production throughput. Evidence scope: this accompanies a researched implementation guide. No Zapier execution, cost saving or two-platform benchmark is claimed.