Listmonk: A Real Mailchimp Alternative — What to Know Before You Deploy
If your email marketing bill is climbing and you’re already thinking about self-hosting, Listmonk deserves a serious look. It’s a fast, capable newsletter server that handles subscriber management, segmentation, campaign analytics, and templates. It runs on a single binary backed by Postgres. On a €16/month Hetzner VPS, it costs nothing beyond the server.
We’ve used it in production for newsletters and transactional email sequences, including bilingual campaigns. Here’s an honest assessment — what works well, what takes some setup, and what trips people up.
What Listmonk does well
The core feature set is solid. You get lists, segments, subscriber imports, HTML and plain-text templates, campaign scheduling, open and click tracking, and a REST API for everything. The template engine uses Go’s templating syntax, which gives you conditionals, loops, and custom subscriber attributes — enough to build genuinely personalized campaigns.
Performance is not an issue. Listmonk handles large subscriber lists efficiently, with configurable concurrency and batch settings for high-volume sends.
For GDPR compliance: subscribers are stored on your own server, in your own Postgres database, in the EU if that’s where your VPS lives. No third-party receives the data. Double opt-in is built in.
The API credentials change in v4+
This one gets missed often. In Listmonk v4+, the admin UI credentials and API auth are separate. You cannot use your admin username and password to authenticate REST API calls — they’ll return 403.
To use the API (e.g. for adding subscribers from a website form), you need to create a dedicated API user first:
Settings → Users → New → API tab
This generates a token for Bearer auth. The admin login is for the UI only.
The opt-in email is embedded in the binary
Listmonk’s double opt-in confirmation email is not a file on disk you can edit. It’s embedded in the binary. To use a custom branded opt-in email, you need to:
- Download the static files from the Listmonk GitHub release tarball
- Mount a custom static directory into the container
- Add
--static-dir=/listmonk/staticto the container command
command: './listmonk --static-dir=/listmonk/static'
volumes:
- '/path/to/your/static:/listmonk/static:ro'
The template variable for the confirmation link is {{ .OptinURL }} — with the dot prefix.
Important side effect: once you’ve made this manual change to docker-compose.yml, do not redeploy through the Coolify UI. Coolify regenerates the compose file on redeploy and will overwrite your changes. To restart Listmonk, SSH in and run docker compose up -d listmonk directly.
Set Root URL and From address immediately after first deploy
Two settings that are easy to miss and will cause silent failures if left at their defaults:
- Root URL (Settings → General): must be your actual domain (
https://listmonk.yourdomain.com), notlocalhost:9000. Without this, confirmation links in opt-in emails point to localhost. - From address: set this to the address your campaigns will come from. Without it, Listmonk falls back to a default that may not match your SMTP configuration.
The SMTP test button doesn’t work reliably
The built-in SMTP test in Settings often fails even when your SMTP configuration is completely correct. Don’t spend time debugging an SMTP connection that’s actually fine — just send a real campaign to yourself instead. If the campaign delivers, the SMTP is working.
Bilingual campaigns without a second platform
Listmonk doesn’t have a built-in language feature, but you can handle bilingual sends cleanly using subscriber attributes. Store the subscriber’s language at signup via the API:
{"attribs": {"lang": "de"}}
Then branch in your template:
{{ if eq .Subscriber.Attribs.lang "de" }}
German content here
{{ else }}
English content here
{{ end }}
One campaign, one send, two languages. It works well for EU businesses with mixed German/English audiences.
How it compares to Mailchimp
Listmonk covers the core of what most businesses actually use in Mailchimp: lists, campaigns, templates, opt-in flows, and basic analytics. What it doesn’t have is a visual drag-and-drop email builder or deep e-commerce integrations. If your campaigns are primarily text-and-image newsletters built from HTML templates, the gap is small. If you rely heavily on Mailchimp’s visual editor or its Shopify integration, the migration takes more work.
The cost comparison is significant. Mailchimp charges per subscriber. At 10,000 subscribers you’re paying €150–200/month on the Essentials plan. Listmonk at that scale costs whatever your VPS costs — likely the same server already running your other tools.
If you’re considering the switch or want to skip the setup entirely, our infrastructure service covers this.
Want to learn more?
See how we set up and operate GDPR-compliant self-hosted infrastructure at a fraction of SaaS costs.
Learn more