SHIPPED · 24 August 2026

Large contact imports now finish — even multi-million-row files

Importing a big list of contacts used to stall or fail, and the dashboard could even show “0 contacts” afterward. Imports now run to completion no matter the size, with a live progress count you can watch.

Live in production · confirmed with a real import

40 seconds. A real import run against the live production service. Captions are burned in; there is no audio.

What was reported

When someone tried to import a large spreadsheet of contacts, the upload would time out or fail partway, and sometimes the Contacts list would then read 0 contacts. There was also a hard ceiling of 50,000 rows, so bigger lists were simply rejected.

What was actually wrong

What changed

The import was rebuilt so the heavy work happens in the background instead of inside the web request:

Two follow-up fixes were made during rollout: one where the upload crashed on a streaming detail, and one where uploads were briefly stored as empty (0 bytes) because two parts of the code were reading the same file at once. Both are fixed and included in what you see above.

What the recording shows

MomentWhat you see
Step 1A real CSV with three unique contacts. The same lane handles millions of rows.
Step 2 — uploadThe file uploads and streams to storage. The server returns a batch id and the size it stored: 225 bytes — not zero.
Step 3 — startThe request returns immediately with HTTP 202 and status: staging. No waiting on the web request.
Step 4 — finishPolling the batch shows status: completed3 of 3 created, 0 failed. Real records on the production database.

Nothing to do on your end. Just use Contacts → Import as usual. If you had a tab open from before the update, reload it once.