SHIPPED · 24 August 2026
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
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.
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.
| Moment | What you see |
|---|---|
| Step 1 | A real CSV with three unique contacts. The same lane handles millions of rows. |
| Step 2 — upload | The file uploads and streams to storage. The server returns a batch id and the size it stored: 225 bytes — not zero. |
| Step 3 — start | The request returns immediately with HTTP 202 and status: staging. No waiting on the web request. |
| Step 4 — finish | Polling the batch shows status: completed — 3 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.