listmonk

Self-hosted newsletter and mailing list manager

Mail Servers ★ 23.6k stars Easy setup AGPL-3.0

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