Import contacts from a CSV file, and export to CSV #34

Closed
opened 2026-10-15 01:18:44 -04:00 by vmanne-poc · 0 comments
Owner

Today: import is a JSON API only. There is no file upload, no template and no export.

Plan

  • Import contacts page:
    • choose a CSV file, parsed in the browser or with a server upload capped at 10 MB
    • a downloadable template
    • step-by-step instructions for Excel, LibreOffice / Google Sheets, and code/API
    • a column-mapping preview (email, first_name, last_name, external_id, and any other column becomes a custom field)
  • A Replace duplicates option. On: update existing contacts. Off: skip them.
  • Statuses are never changed by import. Unsubscribed, bounced and complained contacts stay as they are.
  • The result report shows imported, updated, skipped and invalid counts, plus a downloadable list of rejected rows with the reason.
  • Large files are processed in batches inside a transaction per batch.
  • Export: GET /projects/:id/contacts/export.csv, which respects the current search and status filter. This is also used by segment download.
  • CSV handling uses a well-maintained parser with a pinned version, and guards against formula injection (cells starting with =, +, - or @) on export.
**Today:** import is a JSON API only. There is no file upload, no template and no export. **Plan** - **Import contacts** page: - choose a CSV file, parsed in the browser or with a server upload capped at 10 MB - a downloadable template - step-by-step instructions for Excel, LibreOffice / Google Sheets, and code/API - a column-mapping preview (email, first_name, last_name, external_id, and any other column becomes a custom field) - A **Replace duplicates** option. On: update existing contacts. Off: skip them. - Statuses are never changed by import. Unsubscribed, bounced and complained contacts stay as they are. - The result report shows imported, updated, skipped and invalid counts, plus a downloadable list of rejected rows with the reason. - Large files are processed in batches inside a transaction per batch. - **Export:** `GET /projects/:id/contacts/export.csv`, which respects the current search and status filter. This is also used by segment download. - CSV handling uses a well-maintained parser with a pinned version, and guards against formula injection (cells starting with `=`, `+`, `-` or `@`) on export.
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
vmanne-poc/Postak#34
No description provided.