Skip to content

docs: migration guides for beehiiv, Substack and Mailchimp - #98

Merged
clbotdev merged 1 commit into
mainfrom
issue-68-migration-guides
Oct 19, 2026
Merged

clbotdev merged 1 commit into
mainfrom
issue-68-migration-guides

Conversation

@clbotdev

Copy link
Copy Markdown
Contributor

Part of #79. Closes #68.

What

  • Docs: new "Migrate to SendLit" section.
    • migrate/overview covers the 7 steps: export, connect the ESP, domain authentication, import, signup forms and welcome sequence, web archive, test then first broadcast. It ends with a pre-switch checklist: mailing address, SPF/DKIM/DMARC, Reply-To, matching counts, unsubscribe link, replacing old forms, warm-up, and keeping the old tool until healthy.
    • migrate/beehiiv, migrate/substack and migrate/mailchimp each document that tool's export steps, checked against the beehiiv and Mailchimp help centres, and its status → SendLit mapping.
    • The guides are linked from getting-started (overview, and first-broadcast now links import and the guides), from the contacts import docs, and from the import dialog.
  • Importer fix (found while writing the Mailchimp guide). Mailchimp exports one CSV per status with no status column, and an empty status means subscribed. So importing unsubscribed_… or cleaned_… would have subscribed those contacts.
    • When no column is mapped as status, the dialog now asks "Everyone in this file is…".
    • It pre-selects the answer from Mailchimp's file names using the new guessImportStatusFromFileName in api-contract.
    • Mailchimp's quoted TAGS ("A","B") are unquoted.
    • deactivated maps to unsubscribed.
    • toImportRows moved to apps/web/lib/contact-import.ts, with tests.

Verification

  • check.sh (format, lint, typecheck, 715 API tests, web tests incl. new contact-import.test.ts, contract tests incl. file-name guessing). apps/docs next build passes; the section can't use an index page, because the static export collides with the folder.
  • Browser E2E (6/6) on Mailchimp-format files (Email Address, OPTIN_TIME, quoted TAGS, no status column):
    1. The dialog links to the guides.
    2. The subscribed_… file pre-selects Subscribed and imports with tags Early access, VIP and the original signup date.
    3. The unsubscribed_… file imports unsubscribed.
    4. The cleaned_… file imports with 2 suppressed, as hard_bounce suppressions.
    5. The status can be overridden, and the question disappears once a column is mapped as status.
    6. The built docs show the section, all three guides and the link from first-broadcast.

A "Migrate to SendLit" section: an overview with the steps and a pre-switch
checklist, and one page per tool with its export steps and status mapping.
Linked from getting started, the contacts docs and the import dialog.

The importer now asks for the status of everyone in a file that has no
status column, and suggests it from Mailchimp's per-status file names, so
importing Mailchimp's unsubscribed or cleaned file no longer subscribes
those contacts. Mailchimp's quoted TAGS are unquoted, and "deactivated"
maps to unsubscribed.

Closes #68
@clbotdev
clbotdev merged commit 9a222e9 into main Oct 19, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Migration guides: beehiiv, Substack and Mailchimp to SendLit

2 participants