Skip to main content
Goal: load many customers at once, and understand what happened to the rows that could not be loaded.

The shape of the file

The importer takes rows, not a file: the API receives parsed rows and validates each one. A CSV is therefore a client-side concern — the web app parses the text and posts rows. Column order does not matter, and the header is required. Each row needs:

From the app

Customers → Import customers, choose a .csv, select Import. The result panel reports how many rows were imported, how many were duplicates of existing customers, and lists each rejected row with the line number to fix.

From the API

Notes

The import is partial by design. One bad line does not fail the file: valid rows are stored, and each rejected row is reported with its 1-based position so you can fix the source.
Rejected rows are not stored. A row either exists completely or not at all, so a retry cannot produce a half-written customer.
row is a position in the submitted array, not a CSV line number. The web app keeps the two in step and reports the line you can actually edit.
Last modified on October 6, 2026