Skip to main content

How to Migrate from Mailchimp to Listmonk 2026

·OSSAlt Team
mailchimplistmonkmigrationnewsletterguide
Share:

How to Migrate from Mailchimp to Listmonk

Mailchimp's free plan now limits you to 500 contacts. Paid plans start at $13/month and scale to $350+/month for larger lists. Listmonk is a blazing-fast, self-hosted newsletter manager that handles millions of subscribers on a $5 VPS.

Step 1: Export from Mailchimp

  1. Go to AudienceAll contacts
  2. Click Export AudienceExport as CSV
  3. Download the CSV file

The export includes: email, name, subscription status, tags, merge fields, signup date.

Step 2: Deploy Listmonk

# Docker — running in 2 minutes
mkdir listmonk && cd listmonk

# Download config
curl -o config.toml https://raw.githubusercontent.com/knadh/listmonk/master/config.toml.sample
curl -o docker-compose.yml https://raw.githubusercontent.com/knadh/listmonk/master/docker-compose.yml

# Edit config.toml with your SMTP settings
# Start
docker compose up -d

# Initialize database
docker compose run --rm app ./listmonk --install

Access at localhost:9000 — default login: listmonk / listmonk.

Step 3: Configure SMTP

You need an SMTP provider to send emails. Options:

ProviderFree TierCost at Scale
Amazon SES62K emails/month (free tier)$0.10/1000 emails
Resend3K emails/month$20/month for 50K
SendGrid100 emails/day$15/month for 50K
Mailgun1K emails/month$15/month for 50K
Brevo300 emails/day$9/month for 5K/day

Configure in Listmonk → SettingsSMTP:

[smtp]
host = "email-smtp.us-east-1.amazonaws.com"
port = 587
auth_protocol = "login"
username = "YOUR_SES_KEY"
password = "YOUR_SES_SECRET"
tls_type = "STARTTLS"

Step 4: Import Subscribers

  1. Go to Listmonk → SubscribersImport
  2. Upload your Mailchimp CSV
  3. Map columns: email → email, name fields → name
  4. Select the mailing list to add subscribers to
  5. Choose: Subscribe (active) or Block listed (unsubscribed)

Important: Only import subscribers who are subscribed (status = "subscribed" in the CSV). Don't import unsubscribed users.

Step 5: Create Templates

Listmonk supports HTML templates with Go templating:

<!-- Simple newsletter template -->
<html>
<body style="font-family: sans-serif; max-width: 600px; margin: 0 auto;">
  <h1>{{ .Subject }}</h1>
  {{ .Body }}
  <hr>
  <p style="font-size: 12px; color: #666;">
    <a href="{{ .UnsubscribeURL }}">Unsubscribe</a>
  </p>
</body>
</html>

Step 6: Recreate Automations

Mailchimp FeatureListmonk Equivalent
Welcome emailCampaign with "on subscribe" trigger
Regular campaignsCampaigns (manual send)
A/B testingNot available (manual approach)
Audience segmentsLists + SQL-based segments
TagsSubscriber attributes (JSON)
TemplatesHTML templates
AnalyticsOpen/click tracking
Landing pagesNot included (use external)

Step 7: Set Up DNS Records

Configure for deliverability:

# SPF
v=spf1 include:amazonses.com ~all

# DKIM — from your SMTP provider
# DMARC
_dmarc.yourdomain.com TXT "v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com"

Cost Comparison

SubscribersMailchimpListmonk + SESSavings
1,000$13/month$5/month (VPS)$96/year
5,000$60/month$6/month$648/year
10,000$100/month$7/month$1,116/year
50,000$350/month$10/month$4,080/year
100,000$800/month$15/month$9,420/year

Listmonk cost = VPS + SES sending fees (~$0.10/1000 emails)

What You'll Lose

  • Drag-and-drop email builder — Listmonk uses HTML templates
  • A/B testing — not built-in
  • Landing pages — not included
  • Pre-built automations — limited automation support
  • Audience insights/predictions — not available

What You'll Gain

  • No subscriber limits — handle millions
  • No sending limits — limited only by SMTP provider
  • Full data ownership — subscribers on your server
  • Blazing performance — Go binary, 50 MB RAM
  • SQL-powered segments — more powerful than Mailchimp's UI
  • $0 software cost — just hosting + SMTP

Full Production Listmonk Configuration

Getting Listmonk running is fast. Getting it running reliably with good deliverability and the operational scaffolding that makes it maintainable over years requires a few additional steps that are easy to skip in the initial setup rush.

Production Docker Compose

The sample docker-compose.yml from the Listmonk repository is a reasonable starting point, but configure it with proper environment variable handling and volume declarations before putting it in front of a real list:

services:
  listmonk:
    image: listmonk/listmonk:latest
    restart: unless-stopped
    depends_on:
      - listmonk-db
    ports:
      - "127.0.0.1:9000:9000"
    volumes:
      - ./config.toml:/listmonk/config.toml:ro
      - listmonk_uploads:/listmonk/uploads

  listmonk-db:
    image: postgres:16-alpine
    restart: unless-stopped
    volumes:
      - listmonk_db:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: listmonk
      POSTGRES_PASSWORD: "${DB_PASSWORD}"
      POSTGRES_DB: listmonk

volumes:
  listmonk_db:
  listmonk_uploads:

Listmonk's config.toml holds SMTP credentials and the database URL. Store this file with restricted permissions (600) so other processes on the host can't read SMTP credentials.

Bounce Handling

Listmonk supports automatic bounce processing through the mailboxes settings. When an email bounces (either hard bounce for invalid addresses or soft bounce for temporary failures), Listmonk needs to record this and eventually suppress the bouncing address from future sends. Without bounce handling, your sender reputation degrades as you continue sending to invalid addresses.

Configure your SMTP provider to forward bounce notifications to Listmonk's bounce webhook endpoint, or configure a dedicated mailbox for bounce processing. Amazon SES can forward bounce notifications to an SQS queue or directly to an HTTPS endpoint — configure this in the SES console under Notifications. Listmonk's bounce processor runs on a configurable interval and processes the bounce queue automatically.

Subscriber Segmentation

Listmonk's segmentation model is one of its most powerful features and is meaningfully more flexible than Mailchimp's interface-based segmentation. Segments are defined as SQL queries against the subscribers table, which means any attribute you store in the subscriber's JSON attributes field can be used as a segmentation criterion.

For example, to segment subscribers who signed up in the last 30 days and have a specific tag: created_at > NOW() - INTERVAL '30 days' AND attribs->>'plan' = 'pro'. This kind of query-based segmentation requires knowing SQL but gives you flexibility that no GUI-based segmentation tool can match.

For teams comparing Listmonk against other self-hosted email marketing tools, the Listmonk vs Mautic comparison covers the tradeoffs between Listmonk's simplicity and Mautic's broader marketing automation capabilities — useful reading before committing to a migration.

Deliverability: The Critical Success Factor

The most common reason Listmonk self-hosters fail is poor email deliverability. Moving from Mailchimp to self-hosted infrastructure means giving up Mailchimp's established sender reputation. Your new sending infrastructure starts with no reputation, and inbox providers treat unknown senders with suspicion.

SPF, DKIM, and DMARC are mandatory: The DNS records in Step 7 above are not optional nice-to-haves. Without them, a significant fraction of your emails will land in spam regardless of content quality. SPF authorizes your sending IP to send on behalf of your domain. DKIM adds a cryptographic signature proving the email wasn't modified in transit. DMARC tells receiving mail servers what to do with emails that fail SPF or DKIM, and provides a reporting address where you can receive aggregated data about your sending.

Start with DMARC p=none (monitor mode) and review DMARC aggregate reports for two weeks before tightening to p=quarantine or p=reject. DMARC reports show you which sources are sending email on behalf of your domain — this surfaces misconfigured integrations or unauthorized use of your domain.

IP warm-up: If you're sending to a list of 10,000 or more subscribers, don't send to the full list on day one. Start by sending to your most engaged subscribers (recent openers and clickers), then gradually increase volume over two to four weeks. This builds sending reputation incrementally. Amazon SES's dedicated IP option lets you build reputation on an IP that only you use, rather than sharing reputation with other SES users on shared IPs.

List hygiene before import: Before importing your Mailchimp subscriber list, clean it. Remove addresses that have bounced in Mailchimp (Mailchimp marks these), addresses that haven't opened an email in 12+ months, and role-based addresses (info@, support@, admin@) unless specifically opted in. A clean list with high engagement rates builds sender reputation faster than a large list with poor engagement.

Unsubscribe compliance: CAN-SPAM requires a working unsubscribe mechanism in every commercial email. Listmonk generates an unsubscribe URL using the {{ .UnsubscribeURL }} template variable. Include this in every email template. When a subscriber clicks unsubscribe, Listmonk marks them as unsubscribed and suppresses them from future campaigns automatically.

Security Considerations

Listmonk's admin interface allows sending emails to your entire subscriber list, exporting subscriber data, and managing templates. Restrict access to this interface carefully.

The Listmonk web UI should be protected by a reverse proxy with authentication in front of it. One approach is to use Caddy's basicauth directive to require a username and password before reaching Listmonk, supplementing Listmonk's own login. A more robust approach for teams is to put Listmonk behind a VPN or IP allowlist so only team members on trusted networks can access the admin interface. The subscriber database contains email addresses and any custom attributes you've imported — treat it with the same care as any PII database.

For SMTP credentials, use the minimum required permissions. Amazon SES IAM policies support sending-only permissions scoped to specific verified identities. A Listmonk IAM user with only ses:SendRawEmail permission cannot read your SES configuration, modify sending limits, or access other AWS resources — this limits the blast radius if Listmonk's config is ever exposed.

Back up the Listmonk PostgreSQL database regularly. Subscriber lists represent months or years of growth and cannot be reconstructed if lost. Daily pg_dump exports uploaded to object storage provide a recovery path with 24-hour RPO.

Choosing the Right SMTP Provider for Long-Term Growth

The SMTP provider you choose when setting up Listmonk has long-term implications for deliverability, cost, and operational complexity. The comparison table above covers the basics, but there are nuances that matter as your list grows.

Amazon SES is the default recommendation for most self-hosters, but it requires some upfront work. New SES accounts start in the sandbox, which limits sending to verified email addresses only. Request production access by submitting a use case description to AWS — approval typically takes 24-48 hours. Once out of sandbox, SES handles deliverability infrastructure, IP reputation, and bounce/complaint processing at a cost that scales favorably. For a list of 50,000 subscribers sending monthly newsletters, SES costs roughly $5/month in sending fees on top of your VPS cost.

Resend is the newest entrant and has gained adoption quickly for its developer-friendly API and clean documentation. The free tier is generous for small lists. Resend's pricing structure is straightforward and predictable, and the domain verification process is simpler than SES. For teams that prioritize developer experience and fast setup over absolute cost optimization, Resend is an excellent choice.

Brevo (formerly Sendinblue) is worth considering for European teams because it processes data under EU law, which can simplify GDPR compliance documentation. The free tier of 300 emails per day is limiting for campaign sends but sufficient for transactional notifications. Paid plans are competitively priced for medium-sized lists.

When selecting an SMTP provider, prioritize those that offer dedicated IPs at reasonable cost once your list exceeds 10,000 subscribers. Shared IP pools mean your sender reputation is partially affected by other senders on the same IP. Dedicated IPs are more expensive but give you full control over your IP reputation — critical for high-volume senders where reputation translates directly to inbox placement rates.

Whatever provider you choose, monitor your bounce rate, complaint rate, and spam placement weekly after migration. If bounce rates exceed 2% or complaint rates exceed 0.1%, inbox placement will degrade quickly. Listmonk's built-in analytics track opens and clicks; supplement with your SMTP provider's delivery reports for a complete picture of inbox vs spam placement.

For teams evaluating whether Listmonk is the right tool or whether a more automation-capable newsletter platform fits better, the Listmonk vs Mautic comparison covers this tradeoff in detail — Mautic offers marketing automation, lead scoring, and multi-channel campaigns at the cost of significantly higher complexity and resource requirements. For founders doing a complete audit of SaaS costs before switching to self-hosted tools, the SaaS subscription audit guide walks through how to identify which subscriptions have viable self-hosted replacements worth the operational tradeoff. For the complete picture of an open source marketing stack (email, analytics, forms, and CRM together), see the complete open source marketing stack 2026.


Compare newsletter tools on OSSAlt — features, deliverability, and self-hosting options side by side.

See open source alternatives to Mailchimp on OSSAlt.

The SaaS-to-Self-Hosted Migration Guide (Free PDF)

Step-by-step: infrastructure setup, data migration, backups, and security for 15+ common SaaS replacements. Used by 300+ developers.

Join 300+ self-hosters. Unsubscribe in one click.