listmonk
Self-hosted newsletter and mailing list manager
listmonk is a high-performance, self-hosted newsletter and mailing list manager written in Go. It supports millions of subscribers, rich campaign analytics, and a built-in admin dashboard.
Key features
- Handles millions of subscribers
- Campaign analytics dashboard
- Single binary deployment
- REST API and SMTP support
Pros & cons
Strengths
- Fast and scalable
- Modern admin UI
Trade-offs
- Newsletter-focused, not a mail server
- Requires Postgres
listmonk replaces
Last reviewed Aug 26, 2026 · 809 words
listmonk will manage a list of 100,000 subscribers on a 512 MB VPS for the price of the VPS, where the hosted services charge on a per-contact scale that reaches hundreds of dollars a month at that size. That is the number that brings people here. The line that sends them away again is in the cons: listmonk is a newsletter and mailing list manager, not a mail server. It composes, segments, schedules and tracks; it hands every message to an SMTP server you supply. Sort out that server and the rest is the Easy rating it earned.
What it is: a campaign manager with a Postgres behind it
listmonk is a single Go binary, AGPL-3.0, 23,130 stars, built by the team at Zerodha for their own volume and open-sourced in 2020. It keeps subscribers, lists, campaigns, templates and analytics in PostgreSQL, which is its one hard dependency, and serves an admin UI on port 9000. Campaigns are written in Markdown, raw HTML or a visual editor and use Go templates for personalisation. Subscriber segmentation is a SQL expression in a text box, which sounds austere and turns out to be the most flexible segmentation tool in any product of this kind: subscribers.attribs->>'plan' = 'pro' and you are done. It also exposes a REST API and a transactional endpoint, so an application can send password resets and receipts through the same templates and SMTP configuration as your monthly letter.
Installation is 2 containers
services:
listmonk:
image: listmonk/listmonk:latest
ports: ["9000:9000"]
depends_on: [db]
volumes: ["./config.toml:/listmonk/config.toml"]
restart: unless-stopped
db:
image: postgres:16
environment:
- POSTGRES_USER=listmonk
- POSTGRES_PASSWORD=change-me
- POSTGRES_DB=listmonk
volumes: ["./pgdata:/var/lib/postgresql/data"]
restart: unless-stopped
The first run needs --install to create the schema and the admin user, and the project's own compose file on listmonk.app handles that step for you. Put port 9000 behind a reverse proxy with TLS, because the admin UI and the public subscription pages share the same port and the public ones must be reachable from the internet for double opt-in links to work. If Postgres is already on the box for other services, listmonk is comfortable sharing it, and the Postgres for everything approach fits cleanly.
Deliverability is the whole game, and it is not in the box
Every message leaves through the SMTP servers you configure under Settings, and where those are decides whether your newsletter lands in inboxes or spam. Three realistic options. A transactional email provider such as Amazon SES or Postmark: SES costs about $0.10 per 1,000 messages at last check, which makes a 50,000-subscriber monthly send roughly $5, and their reputation is not something you can build yourself in a weekend. Your own mail server such as Stalwart with correct SPF, DKIM and DMARC records, a warmed-up IP, and the patience to monitor blocklists, which is a real hobby and covered honestly in the self-hosted email post. Or a regular mailbox's SMTP for lists under a few hundred people, which works until a provider's daily cap hits. listmonk supports several SMTP servers at once with per-server concurrency and rate limits, so a mixed setup is possible.
Bounces need handling or your sender reputation decays. listmonk processes bounces by polling a mailbox over POP3 and through webhooks from SES, SendGrid and Postmark, and can unsubscribe or blocklist addresses automatically after a configurable count. Turn that on before the first campaign, not after the first complaint.
Analytics, privacy and the AGPL
Open and click tracking are per-campaign toggles, implemented as a tracking pixel and rewritten links pointing at your own domain, so no third party sees your readers. Turn them off if your audience is the kind that notices, and note that Apple's mail privacy features make open rates a fiction anyway. The AGPL licence only matters if you modify listmonk and offer it as a service to others; using it to send your own newsletters carries no obligation. Sitting alongside the rest of the email category, it is the one tool there that most people can run without becoming a postmaster.
What I'd do
listmonk and Postgres in the compose file above, behind a reverse proxy, with SES or Postmark as the SMTP relay and bounce webhooks configured on day one. Double opt-in on every public list, tracking off unless you have a reason, a nightly pg_dump shipped off-box. Keep your own mail server out of it unless you already run one and enjoy it. For a personal or small-business newsletter, that setup replaces a hosted plan entirely for the cost of a $5 VPS and a few dollars of sending.
Compare listmonk
4 head-to-head comparisons.
Similar mail servers apps
Docker Mailserver
Mail ServersProduction-ready, config-driven mail server in a container
Replaces Google Workspace, Microsoft 365
Mailspring
Mail ServersCross-platform desktop email client
Replaces Outlook, Apple Mail
Postal
Mail ServersComplete mail delivery platform for outgoing email
Replaces SendGrid, Mailgun
MailHog
Mail ServersEmail testing tool with a fake SMTP server
Replaces Mailtrap
Mail-in-a-Box
Mail ServersTurn a fresh server into a working mail server
Replaces Google Workspace, Microsoft 365
mailcow
Mail ServersDockerized full-stack mail server suite
Replaces Microsoft Exchange, Google Workspace