Bring your list with you.
/admin/subscribers/import. Below is exactly which export to grab from each major newsletter tool and how its columns line up with ours. If you get stuck, write to hello@mail.mailement.com — David has personally migrated lists from most of these tools and will reply.
01Before you start
Three things to do first:
- Create your Mailement workspace at /signup and add a brand for the newsletter you're migrating. Each brand is independent — you don't have to migrate everything at once.
- Verify your sending domain on
/admin/branding. Pick a subdomain of your real domain (avoidmail.— it conflicts with Google Workspace), paste the DKIM/SPF/return-path records into your DNS, and wait for the status to flip to verified. Migrating subscribers before this is fine; you just can't send to them yet. - Decide on opt-in mode. By default new brands use double opt-in. For an imported list of existing confirmed subscribers, you'll typically want imports marked as already-confirmed (the importer does this) and leave the brand on double opt-in for new signups going forward.
02The CSV format
Mailement's importer at /admin/subscribers/import accepts any CSV — you map columns to fields in step 2, so column order and naming don't have to match. These are the fields it recognizes:
- email (required) — must be a valid address; duplicates within the file are merged.
- first_name, last_name, city — optional standard fields.
- Any custom field you've defined for the brand under
/admin/fields— map by field key. - Topics — assign every imported row to one or more topics during step 2. If your source export has tags/segments, you can either pre-create matching topics in Mailement and map them, or import everyone into one bucket and segment later.
- Status — defaults to confirmed for imports (an admin attests to consent). Unsubscribed and bounced rows from the source are skipped or imported as unsubscribed/bounced respectively so you don't accidentally email them.
Keep your CSV in UTF-8 with a header row. Excel sometimes saves as Windows-1252 and breaks accented characters — re-save as CSV UTF-8 (.csv) if you see João appear as João.
03From Mailchimp
Export: In Mailchimp, open the audience you want to migrate. Go to Manage Audience → Export Audience. Mailchimp prepares a ZIP containing one CSV per status (subscribed, unsubscribed, cleaned). Download and unzip.
Use the subscribed_members.csv for the main import. Its columns include Email Address, First Name, Last Name, plus any merge tags you'd set up (mapped to Mailement custom fields), and TAGS (a pipe-separated list that maps to Mailement topics).
Column mapping in step 2 of the importer:
Email Address→ emailFirst Name→ first_nameLast Name→ last_nameADDRESScity portion → city (Mailchimp stores ADDRESS as a compound field; you'll usually want a spreadsheet pass to split it)- Any merge tag → matching custom field
TAGS→ split by|and assign to Mailement topics (create the topics first at/admin/topics)
Optionally also import unsubscribed_members.csv as status unsubscribed so re-uploads don't accidentally re-add people who chose to leave.
04From Substack
Export: In Substack, go to Settings → Exports → New export. After a few minutes you'll get an email with a ZIP. Unzip — the file you want is email_list.csv (sometimes named subscribers.csv).
Substack's export columns are simple: email, active_subscription (true/false), expiry, created_at. Free subscribers and paid subscribers are both in the same file; the active_subscription column tells you which.
Column mapping:
email→ email- Optionally create a Paid supporters topic at
/admin/topicsand bulk-assign rows whereactive_subscription = trueby filtering the CSV first, then doing two imports — one per topic.
Substack doesn't export first/last names — you'll start blank on those unless you've collected them via a separate form. Personalization tokens like {{first_name}} will use a graceful "friend" fallback for those rows.
05From ConvertKit / Kit
Export: In Kit (the rebrand of ConvertKit), go to Subscribers, click the Export button. Pick either "All subscribers" or filter by tag/segment first. Kit emails you a CSV download link.
Kit's export is friendly. Typical columns: Email Address, First Name, Last Name, State, Created At, Source, plus any tags you've applied.
Column mapping:
Email Address→ emailFirst Name→ first_nameLast Name→ last_name- Any custom field → matching custom field
- Tags & segments: the cleanest pattern is to export per-tag CSVs, then import each CSV into a matching Mailement topic. That's slower but it gives you a 1:1 mapping of Kit tags to Mailement topics.
If you're using Kit's automations, plan to rebuild the equivalent welcome flows as Mailement drip series — see the drips section of the help center. Trigger types map cleanly: Kit's "Subscribes to form" → Mailement's subscriber_confirmed with form filter; "Adds tag" at signup → topic_added; manual enroll → manual.
06From Beehiiv
Export: In Beehiiv, go to Audience → Subscribers, click Export, choose a segment (or "All subscribers"), confirm. Beehiiv emails the CSV.
Beehiiv's export columns include email, status (active / unsubscribed / etc.), created, tier, utm_source, utm_medium, utm_campaign, plus any custom fields and segments.
Column mapping:
email→ emailtier→ consider importing as a custom field (tier) so you can target premium subscribers laterutm_source,utm_medium,utm_campaign→ optional custom fields if you want to preserve provenance- Segments → matching Mailement topics, one import per segment
Beehiiv's referral program data (referrers, reward tiers) doesn't have a direct equivalent in Mailement v1. Preserve it as custom fields if you want to retain visibility; we don't have a referral rewards engine yet.
08From Ghost
Export: In Ghost Admin, go to Members → Export. Pick "All members" or a filter, click Export CSV.
Columns: id, email, name, note, subscribed_to_emails, complimentary_plan, stripe_customer_id, created_at, deleted_at, labels (comma-separated), tiers (semicolon-separated).
Ghost stores name as a single column. The cleanest move is to split it in a spreadsheet:
email→ emailname→ split on first space, map left side to first_name and right side to last_name (single-word names just go to first_name)labels→ split by comma, map to Mailement topicstiers→ custom field if you want to preserve paid-tier membership; Mailement doesn't run paywalls in v1- Rows where
subscribed_to_emails = false→ import as unsubscribed
09From anywhere else
If your current tool isn't on this list — MailerLite, Brevo (formerly Sendinblue), Campaign Monitor, ActiveCampaign, your own database — the playbook is the same. Find the CSV export, make sure it has at minimum an email column, and upload at /admin/subscribers/import. The mapping step in the importer will let you assign each column to an email, name, city, custom field, or "ignore."
Edge case: if your source only exports unsubscribers as a separate file, import those second as status unsubscribed so you don't accidentally re-mail people who already opted out.
10Warm-up & deliverability
If you're moving from a different sending domain to your new Mailement sending subdomain, ramp up gradually. Your old domain has built reputation with Gmail and Outlook; your new subdomain hasn't. Send your first issue to your most-engaged 10–20% of subscribers, the next to the next tier, and the full list within a week or two.
Three deliverability tips that help every migration:
- Don't import dormant addresses. If a subscriber hasn't opened anything in 12+ months, leaving them out of the migration protects your reputation. You can always send them a re-engagement campaign later from the old tool first.
- Set up DMARC on the parent domain. With DKIM and SPF on the sending subdomain (which Mailement handles), DMARC at the root is the third leg of authentication. Even a weak
p=nonepolicy gives you visibility into who's spoofing your domain. - Send your first Mailement issue with strong content, not a "we've moved!" announcement. Move-announcements get marked as spam more often than usual; subscribers don't always remember they signed up.
11If something breaks
The most common import problems and what to do:
- "Invalid email" on rows that look valid. Usually trailing whitespace or hidden characters. Run the CSV through a quick spreadsheet TRIM pass before re-uploading.
- Accented characters look mangled. Your CSV is Windows-1252, not UTF-8. Re-save in Excel as CSV UTF-8 (.csv) or in Numbers/Sheets export as UTF-8 CSV.
- Topic mapping shows the wrong columns. Add the topics first at
/admin/topics, then restart the import — the mapper only shows existing topics in the dropdown. - Custom fields don't appear. Same: define them at
/admin/fieldsfirst, then re-open the importer.
Anything else, write to hello@mail.mailement.com with the CSV attached (or a sanitized sample) and a description of what you're seeing. We respond within one business day.