How do I migrate my email list to VeloCMS members?
Export subscribers from Mailchimp or ConvertKit as CSV, import into VeloCMS Members, handle double opt-in compliance, and preserve segment tags.
Your email list is the most valuable thing you own as a creator. Moving it needs to be handled carefully — GDPR, CAN-SPAM, and most ESPs require explicit subscriber consent, and importing a list into a new system without respecting those permissions can get your sending domain blacklisted fast. Here's how to do it right.
Step 1 — Export from Mailchimp
In Mailchimp, go to Audience → All contacts → Export audience. Choose 'Export as CSV'. Mailchimp exports a file with columns: Email Address, First Name, Last Name, MEMBER_RATING, OPTIN_TIME, OPTIN_IP, CONFIRM_TIME, CONFIRM_IP, LATITUDE, LONGITUDE, GMTOFF, DSTOFF, TIMEZONE, CC, REGION, LAST_CHANGED, LEID, EUID, NOTES, and any custom merge fields you defined. The ones you need for VeloCMS: Email Address, First Name, Last Name, CONFIRM_TIME (maps to subscribed_at), and any custom tags (exported as separate columns).
# Minimal Mailchimp CSV for VeloCMS import (save as subscribers.csv):
Email Address,First Name,Last Name,CONFIRM_TIME,Tag1,Tag2
[email protected],Jane,Smith,2025-03-15,premium,newsletter
[email protected],John,Doe,2025-04-01,newsletter,Step 2 — Export from ConvertKit
In ConvertKit, go to Subscribers → Export. You can export all subscribers or filter by tag, sequence, or form. ConvertKit exports a CSV with: First Name, Email Address, State (active/unsubscribed/bounced/complained), Created At, Tags (comma-separated in a single column). Filter for State = active before exporting — importing unsubscribed or complained addresses into VeloCMS will immediately damage your sender reputation.
Never import unsubscribed, bounced, or complained addresses into VeloCMS. Filter your CSV to active subscribers only before importing. Sending email to someone who previously unsubscribed is a GDPR violation and will trigger spam complaints that hurt your sending domain.
Step 3 — Prepare your CSV for VeloCMS import
You have two importers, and neither needs much preparation. The generic member importer (Admin → Members → Import) is tolerant about column names — it accepts email/e-mail/email_address, name/full_name/display_name, and tags/tag/labels — so most ESP exports go in as-is; the fields it imports are email, name, and tags (there is no subscribed_at column). The Mailchimp/Kit importer (Admin → Import → Mailchimp / Kit, Pro and above) goes further: upload Mailchimp's or Kit's native export unchanged and it detects the provider from the headers and maps the columns itself, including the tags column.
# VeloCMS member import format (email is the only required column):
email,name,tags
[email protected],Jane Smith,premium newsletter
[email protected],John Doe,newsletterStep 4 — Import the CSV into VeloCMS
In VeloCMS admin, go to Admin → Members → Import. Upload your prepared file. VeloCMS parses the first 5 rows and shows them as a column-mapping preview before anything is written. The import is idempotent on email: an address that already exists is updated, not duplicated, so re-running an import is safe. After import, members appear in the Members list. Tags carry over as member tags which you can use for targeted newsletter sends — the campaign composer at Admin → Newsletter → New has a tag picker, so you can send an email only to members tagged 'premium'.
Step 5 — Double opt-in compliance
Whether you need a new opt-in from migrated subscribers depends on your original signup process and where your subscribers are located. If your original signup form had explicit consent language ('I agree to receive emails from [Your Blog]'), you can import without re-permission. If your original list was built with vague consent ('Sign up for updates'), sending a re-permission email is the safest move, especially for EU/UK subscribers where GDPR has the strictest consent requirements.
If you import through the Mailchimp/Kit importer, this filtering happens automatically — its preview shows how many rows were excluded, broken down by status (unsubscribed, bounced, complained), before you apply anything. The manual 'active only' filtering matters when you use the generic Members → Import path, which imports every row you give it.
Step 6 — Preserve segment tags
Mailchimp groups and segments and ConvertKit tags all map to VeloCMS member tags. After import, open any member from Admin → Members to review and edit their tags — a ConvertKit tag called 'ck-premium' might be better renamed to just 'premium' for clarity. VeloCMS's campaign composer (Admin → Newsletter → New) lets you pick which tags receive a send, so your segmentation structure carries over cleanly.
Step 7 — Send a migration announcement
Send an announcement email within 24 hours of import, using VeloCMS's newsletter tool. Tell your subscribers they're now on your new platform, confirm nothing changes for them, and include an unsubscribe link. This re-engagement email also surfaces any stale addresses — bounces and unsubscribes that come back immediately tell you which addresses to remove from your list. Check Admin → Newsletter → Analytics over the following days for the delivery stats on the send.
Frequently asked questions
- Can I import both free and paid members at once? Yes — add a 'paid' column to your CSV. Members with paid: true import with paid member status (requires BYOK Stripe connected).
- What's the maximum CSV import size? 10,000 rows per import. For larger lists, split into multiple CSVs.
- Will VeloCMS validate email addresses on import? Yes — malformed email addresses are skipped and flagged in the import report.
- Can I import members with a custom opted-in date? Yes — include a subscribed_at column with ISO date format (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SSZ).
- What happens to duplicate emails? If an email already exists as a VeloCMS member, the importer skips it and adds it to the 'duplicate' count in the report.