How to Migrate From Mailchimp to Self-Hosted Listmonk
Move your newsletter from Mailchimp to self-hosted Listmonk without losing subscribers or sender reputation. Exports, blocklist import, SES warm-up, forms, and automation gaps covered.

Mailchimp bills you by contact count, and every contact you keep costs money every month whether you email them or not. Moving to self-hosted Listmonk cuts that bill to a server plus per-email fees on Amazon SES, but the migration is not an export-import job: you also have to move your suppression lists, rebuild signup forms, and re-earn your sender reputation. This guide walks through the full migration in order, with the exact export files, import modes, and warm-up sequence that keep deliverability intact.
The whole process takes one to three weeks depending on list size, and most of that time is waiting on the IP and domain warm-up, not on moving data.
What moves and what does not
Before you touch anything, be clear about the scope. A Mailchimp account holds more than a list of email addresses.
What migrates cleanly:
- Subscribed contacts with names and merge fields, via CSV export.
- Unsubscribed and cleaned addresses, which become your blocklist. This is the most important file in the whole migration.
- Tags and segments, rebuilt as Listmonk lists or subscriber attributes.
- Templates, recreated as HTML or Go templates. This is manual work.
What does not migrate:
- Automation flows. Mailchimp's Standard and Premium plans allow automation flows with up to 200 steps per flow; Listmonk sends campaigns and transactional mail but has no drip-sequence builder. You rebuild these with Listmonk's API and a workflow tool like n8n, or you accept simpler behavior.
- Signup forms and landing pages. Mailchimp's hosted forms die when the account closes. You rebuild them against Listmonk's public subscription endpoint.
- Send history and engagement data. Open and click history stays in Mailchimp. Export what you want to keep before you cancel; contact exports are only available in your account for 30 days after you run them.
- Your sender reputation. Reputation is attached to your sending domain and IPs, not to Mailchimp. Moving from Mailchimp's shared IPs to SES means starting fresh, which is why the warm-up in step 5 matters more than the data move.
Step 1: Audit and clean the audience first
Mailchimp charges for every contact in the audience, so most accounts carry dead weight: people who have not opened in a year, role addresses, old imports. A migration is the one time cleaning this up is free.
- Build a segment of contacts with no opens in the last 12 months. Send one re-engagement campaign to them. Anyone who does not respond gets exported but archived, not imported.
- Export and keep every address with a status of unsubscribed or cleaned. These feed the blocklist in step 4.
- Note which merge fields you actually use in campaigns. Listmonk stores extra data as a JSON attributes object per subscriber, so fields map cleanly, but only move fields that a template or segment references.
A 25,000-contact audience typically shrinks by 10 to 30 percent at this stage. That directly shrinks your warm-up time, because you have fewer addresses to re-introduce to the mailbox providers.
Step 2: Export everything from Mailchimp
Mailchimp's export flow is straightforward. From the Audience page, choose Export audience, then Export CSV, and wait for the confirmation email. What arrives is a ZIP file containing separate CSVs for each contact type: subscribed, unsubscribed, non-subscribed, and cleaned, as described in Mailchimp's export documentation.
A few operational notes:
- Run the export for each audience separately if you have more than one.
- Your archive of past exports is kept for 30 days only, so download and store the ZIPs somewhere durable the day you run them.
- Export templates manually: open each one and copy the HTML out. There is no bulk template export.
- Screenshot or document your automation flows before cancelling. Rebuilding a flow from memory weeks later is painful.
Do not cancel the Mailchimp account yet. Keep it running in parallel until the cutover checklist at the end of this guide is green.
Step 3: Stand up Listmonk and SES
Install Listmonk with the sample Docker Compose file from the GitHub repository: two containers, the app and Postgres, admin UI on port 9000. The full walkthrough, including SMTP wiring, is in our guide to self-hosting a newsletter with Listmonk and Amazon SES. Two decisions matter here.
Server size. Listmonk is light. The project reports a production instance sending a campaign of over 7 million emails using a fraction of one CPU core with peak RAM of 57 MB, per the project site. A small VPS with 2 GB of RAM is comfortable for lists well into six figures; Postgres is the component that grows.
Sending provider. Amazon SES at its a la carte rate charges $0.10 per 1,000 emails, per the SES pricing page. Since 21 July 2026, new SES accounts start on an Essentials plan at $0.16 per 1,000 emails; accounts that were actively sending before the change keep the a la carte rate. Either way the cost per send is a rounding error compared to per-contact billing.
New SES accounts start in a sandbox limited to 200 messages per 24 hours at 1 message per second, and only to verified addresses, per AWS's production access documentation. Request production access immediately, and verify your sending domain first, since AWS says a verified domain speeds approval. Approval typically takes a day or two, which is why this step runs in parallel with the data work.
Step 4: Import subscribers, then the blocklist
This is where most self-written migration guides go wrong: they import the subscribed CSV and stop. The order and the import modes matter.
Import subscribed contacts as confirmed
Listmonk's import API accepts a subscription_status parameter. Use it. Your Mailchimp subscribers already opted in; asking them to confirm again would lose a chunk of the list for no reason. The import call looks like this:
curl -u "api_user:token" -X POST 'https://listmonk.yourdomain.com/api/import/subscribers' \
-F 'params={"mode":"subscribe", "subscription_status":"confirmed", "delim":",", "lists":[1, 2], "overwrite": true}' \
-F "file=@subscribed.csv"
Map Mailchimp merge fields into Listmonk's attributes JSON before import, and split the file by tag if you are rebuilding tags as separate lists. The full parameter set is in Listmonk's import API documentation.
Import unsubscribed and cleaned addresses as a blocklist
The same API has a mode: "blocklist" option. Run a second import with the unsubscribed and cleaned CSVs from step 2. This ensures an address that opted out on Mailchimp can never receive mail from your new setup, even if it sneaks into a later import. Skipping this step is both a deliverability risk and, in many jurisdictions, a legal one, since opt-outs must be honored across systems.
Verify before you send
- Count check: imported plus blocklisted should equal the exported totals, minus whatever you deliberately archived.
- Spot-check a handful of subscribers for correct list membership and attributes.
- Confirm the blocklist by attempting a test subscription from an unsubscribed address.
Step 5: Deliverability setup and warm-up
Since February 2024, Google requires all senders to authenticate with SPF or DKIM, and anyone sending 5,000 or more messages a day to Gmail addresses needs SPF, DKIM, and DMARC all in place, a spam rate under 0.3 percent in Postmaster Tools, TLS, and valid reverse DNS, per Google's sender guidelines. SES generates the DKIM records for you when you verify a domain; you add them plus an SPF record and a DMARC record at your DNS provider. Our guide to self-hosted email deliverability covers the DNS records and warm-up math in detail.
You also need bounce handling wired before the first campaign. Listmonk has a native SES webhook endpoint at /webhooks/service/ses, which records bounces and complaints directly against subscribers, per the bounce processing documentation. Configure SES to publish bounce and complaint events to SNS, subscribe that endpoint, and test it with the SES mailbox simulator before importing real campaigns.
The warm-up sequence
A new SES sending identity has no reputation. Sending 100,000 emails on day one is the fastest way to land in spam. A workable schedule for a list of around 25,000 engaged subscribers:
- Week 1: Send to your most engaged segment only, the people who opened the last two or three Mailchimp campaigns. Cap volume at a few thousand per day.
- Week 2: Add the rest of the recently engaged list. Watch bounce and complaint rates daily; hard bounces above a couple of percent mean your cleaning in step 1 missed something.
- Week 3: Full list, normal cadence.
Keep Mailchimp live during weeks 1 and 2. If something breaks, you still have a working sender.
Step 6: Replace forms and automation
Listmonk exposes a public subscription endpoint, so any HTML form can post directly to it with an email, name, and list UUIDs. For a static site this is a five-minute job. For anything fancier, such as double opt-in with a custom confirmation page or syncing new subscribers into a CRM, put a small n8n workflow in front of the API instead.
Automation is the honest gap. Mailchimp's flow builder, which allows flows of up to 200 steps on the Standard and Premium tiers per Mailchimp's pricing page, has no equivalent inside Listmonk. The practical replacements:
- Welcome and drip sequences: n8n or Make watching the Listmonk API, sending templated transactional mails on a schedule. This covers the common cases.
- Behavioral triggers, predictive segments, e-commerce flows: these are where Mailchimp genuinely earns its fee. If your revenue depends on abandoned-cart flows and product recommendations, see the next section before migrating at all.
If you do rebuild automation with workflows, our business automation service covers exactly this kind of n8n and Make work.
What it costs after the move
The detailed cost comparison lives in our breakdown of Listmonk vs Mailchimp costs at 25,000 subscribers, but the arithmetic is simple. Take 25,000 subscribers getting 4 campaigns a month: 100,000 emails. At SES's a la carte rate that is $10 a month in sending fees, plus a small VPS and whatever you pay for maintenance. Mailchimp bills by contact count and pauses sending when you exceed limits, per its pricing page, so the bill grows every time the list grows even if you never send more.
The saving is real but it is not free money. You now own backups, updates, monitoring, and the warm-up discipline described above. If nobody on your team wants that responsibility, a managed deployment is the middle path: we run Listmonk and the rest of the managed open-source stack for clients who want the cost structure without the ops work.
Common mistakes
- Importing only the subscribed CSV. Without the blocklist import, you will mail people who unsubscribed. Expect complaints, and expect your fresh SES reputation to take the hit.
- Skipping production access. Teams finish the import, hit the 200-message sandbox cap on the first campaign, and lose days.
- No warm-up. Moving the whole list in week one is the single most common way these migrations fail.
- Cancelling Mailchimp on day one. Keep it until two or three clean campaigns have gone out from Listmonk and forms have been swapped on every page.
- Forgetting where forms live. Check website footers, blog sidebars, checkout flows, PDF lead magnets, and any landing pages pointing at Mailchimp hosted forms.
- Assuming automation ports. It does not. Decide what each flow does, and rebuild or drop it deliberately.
When staying on Mailchimp is the right call
Stay if your marketing depends on the automation flows, landing pages, and e-commerce integrations, and nobody technical wants to own a server. Stay if your list is small: under a few thousand contacts, Mailchimp's lower tiers are cheap enough that the saving does not pay for the migration effort. And stay if email revenue attribution matters to you and you do not want to rebuild reporting; Listmonk tracks opens and clicks, but Mailchimp's revenue reporting against connected stores is genuinely better.
Migrate when the list is large and mostly gets one-way newsletters and announcements, when per-contact pricing has become a real line item, or when data residency or ownership requirements make a SaaS audience database a problem.
Frequently asked questions
Will my subscribers have to opt in again after migrating? No. Listmonk's import API accepts a confirmed subscription status, so contacts who already opted in on Mailchimp import as confirmed subscribers. Only do this for genuinely opted-in addresses; importing a purchased or scraped list as confirmed is how you get blocklisted.
How long does the migration take? The data work is a day or two. The calendar time is driven by SES production access approval and the sending warm-up, so plan for one to three weeks with Mailchimp running in parallel as a fallback.
What happens to my Mailchimp automations? Nothing moves automatically. Simple welcome and drip sequences rebuild well with n8n or Make calling the Listmonk API. Complex behavioral and e-commerce flows have no good self-hosted equivalent, which is a legitimate reason to stay on Mailchimp.
Do I need a dedicated IP on SES? Not for most senders. SES shared IPs carry good reputation. A dedicated IP at $24.95 per month only pays off at sustained high volume where you want full control of reputation, and it needs its own warm-up.
Is Listmonk really free? The software is AGPLv3 open source with no license fee and no subscriber limits. You pay for the server, the Postgres database, and per-email sending through SES or another SMTP provider.
Can I move back if it does not work out? Yes. Keep your Mailchimp export ZIPs and your blocklist current, and you can re-import into Mailchimp or another provider. The main thing you lose on a return trip is time, not data.
Where to go from here
If your newsletter is a cost line that grows every month while the value stays flat, the self-hosted route is worth the week of setup. Start with the cost arithmetic in our 25,000-subscriber comparison, and if you want the migration done for you, including warm-up, blocklist handling, and form replacement, that is part of our managed open-source stack service. The same migration thinking applies elsewhere in a SaaS stack: we have published parallel guides for moving from HubSpot to Twenty CRM and for migrating from Zendesk to self-hosted Chatwoot.
About AI Agents Plus Editorial
AI automation expert and thought leader in business transformation through artificial intelligence.



