You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
There's no way to bulk-import or export contacts, yet apps/docs/content/docs/getting-started/first-broadcast.mdx:8 says "Create or import contacts". Without import, nobody can move off Mailchimp, Beehiiv, Substack, ConvertKit and the like.
Import
CSV upload with column mapping. Recognize column names from common platform exports automatically: email, first/last name, tags, status, signup date, and custom fields.
Parse in the browser and send chunks (about 1000 rows) to a bulk endpoint, validating again on the server. Or upload the file and process it in a BullMQ job with progress.
Marking this severity: critical. It blocks inviting beehiiv switchers: without import they can't move their list. Specifics from the 19 Oct readiness audit:
beehiiv export format (beehiiv help articles 12258595483543 and 12428610562327)
Export from Settings → Export Data. Download links expire after 24h.
Two variants:
Quick/Basic: email, status, tier
Full: adds custom fields and stats (created/subscribed date, UTM/acquisition, referral counts). Headers vary by publication, so we need a column-mapping UI, not fixed headers.
Statuses: Active / Paused / Pending / Needs Approval / Inactive. Some exports or tools also show Unsubscribed or Bounced.
Proposed status mapping
beehiiv
SendLit
Active
subscribed
Paused
subscribed, tag beehiiv-paused (or let the user choose to unsubscribe)
Inactive / Unsubscribed
imported as unsubscribed (never re-subscribe on import)
Bounced
unsubscribed and added to suppressions
Pending / Needs Approval
skipped by default, or imported unsubscribed with tag beehiiv-pending
tier (free/premium)
tag tier:<value>
custom fields
custom fields (mapped in the UI)
Gaps in the current API
The create schema doesn't accept subscribed (packages/api-contract/src/schemas/contacts.ts ~L26-28: email, name and tags only; subscribed is on update only). Importing an unsubscribed contact would need create + PATCH, with a window where they look subscribed.
No bulk endpoint: only single POST /contacts (packages/api-contract/src/contract.ts:133) and MCP create_contact. We need a bulk upsert API (and an MCP tool), with idempotent upsert by email, per-row errors and an async job for large files.
Activity
clbotdev commentedon Oct 19, 2026
Marking this severity: critical. It blocks inviting beehiiv switchers: without import they can't move their list. Specifics from the 19 Oct readiness audit:
beehiiv export format (beehiiv help articles 12258595483543 and 12428610562327)
email,status,tierProposed status mapping
beehiiv-paused(or let the user choose to unsubscribe)beehiiv-pendingtier:<value>Gaps in the current API
subscribed(packages/api-contract/src/schemas/contacts.ts~L26-28: email, name and tags only;subscribedis on update only). Importing an unsubscribed contact would need create + PATCH, with a window where they look subscribed.POST /contacts(packages/api-contract/src/contract.ts:133) and MCPcreate_contact. We need a bulk upsert API (and an MCP tool), with idempotent upsert by email, per-row errors and an async job for large files.apps/docs/content/docs/getting-started/first-broadcast.mdx:8already says "Create or import contacts". The migration guides are tracked in Migration guides: beehiiv, Substack and Mailchimp to SendLit #68.