Skip to main content
πŸŽ“ Claude Code Masterclass Learn AI-assisted development on Udemy β€” plus the companion book on Leanpub & Amazon. Start Learning
Listmonk: High-Performance Open-Source Newsletter and Mailing List Manager
Open Source

Listmonk: High-Performance Open-Source Newsletter and Mailing List Manager

Listmonk handles millions of subscribers on a single server β€” Go-powered, PostgreSQL-backed, with templating, segmentation, and analytics.

LB
Luca Berton
Β· 1 min read

What Is Listmonk?

Listmonk is a high-performance newsletter and mailing list manager. Written in Go, backed by PostgreSQL β€” it handles millions of subscribers on a single server. 16K+ GitHub stars.

Listmonk vs Mailchimp vs Kit.com

FeatureListmonkMailchimpKit.com
Self-hostedβœ…βŒβŒ
Subscribers (free)Unlimited50010,000
Monthly emailsUnlimited1,000Unlimited
Price$0 + SMTP$13-350/mo$0-29/mo
Template editorβœ… HTML + WYSIWYGβœ…βœ…
Segmentationβœ… SQL-poweredβœ…βœ…
Analyticsβœ… Opens/clicksβœ…βœ…
Automation⚠️ Basicβœ…βœ…
Landing pagesβŒβœ…βœ…
Data ownershipβœ…βŒβŒ

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         Listmonk (Go)            β”‚
β”‚                                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  Web UI   β”‚  β”‚  REST API   β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚        β”‚                β”‚         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚        Core Engine          β”‚  β”‚
β”‚  β”‚  β€’ Campaign Manager         β”‚  β”‚
β”‚  β”‚  β€’ Template Renderer        β”‚  β”‚
β”‚  β”‚  β€’ Subscriber Manager       β”‚  β”‚
β”‚  β”‚  β€’ Queue + Rate Limiter     β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                β”‚                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚       PostgreSQL           β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                   β”‚
β”‚  SMTP: SES, Mailgun, Postmark    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Docker Deployment

version: "3.9"
services:
  listmonk:
    image: listmonk/listmonk:latest
    ports:
      - "9000:9000"
    environment:
      - TZ=Europe/Amsterdam
    volumes:
      - ./config.toml:/listmonk/config.toml
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    environment:
      - POSTGRES_USER=listmonk
      - POSTGRES_PASSWORD=listmonk
      - POSTGRES_DB=listmonk
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

config.toml

[app]
address = "0.0.0.0:9000"
admin_username = "admin"
admin_password = "your-secure-password"

[db]
host = "db"
port = 5432
user = "listmonk"
password = "listmonk"
database = "listmonk"

# Amazon SES
[smtp.ses]
enabled = true
host = "email-smtp.eu-west-1.amazonaws.com"
port = 587
auth_protocol = "login"
username = "YOUR_SES_KEY"
password = "YOUR_SES_SECRET"
max_conns = 10
max_msg_retries = 3
idle_timeout = "15s"

Performance

Listmonk is written in Go β€” it’s incredibly efficient:

SubscribersSend RateServer Requirements
10K500/min1 CPU, 1GB RAM
100K5,000/min2 CPU, 2GB RAM
1M50,000/min4 CPU, 8GB RAM
10M200,000/min8 CPU, 16GB RAM

Compare: Mailchimp charges $350/month for 100K subscribers. Listmonk handles it on a $10/month VPS.

SMTP Provider Costs

ProviderPer 1K emails100K emails/mo
Amazon SES$0.10$10
Mailgun$0.80$80
Postmark$1.25$125
SendGrid$0.75$75

Total cost for 100K subscribers: Listmonk ($0) + Hetzner VPS ($8) + SES ($10) = $18/month vs Mailchimp’s $350/month.

Key Features

SQL-Powered Segmentation

-- Target subscribers who opened last campaign but didn't click
SELECT * FROM subscribers
WHERE id IN (
  SELECT subscriber_id FROM campaign_views
  WHERE campaign_id = 42
)
AND id NOT IN (
  SELECT subscriber_id FROM link_clicks
  WHERE campaign_id = 42
);

Template System

{{ template "header" . }}

<h1>Hello {{ .Subscriber.FirstName }}!</h1>

{{ if eq .Subscriber.Attribs.plan "pro" }}
  <p>As a Pro member, here's your exclusive content...</p>
{{ else }}
  <p>Upgrade to Pro for exclusive access.</p>
{{ end }}

{{ template "footer" . }}

REST API

# Add subscriber
curl -u admin:password http://listmonk:9000/api/subscribers \
  -d '{"email":"new@user.com","name":"New User","lists":[1]}'

# Send transactional email
curl -u admin:password http://listmonk:9000/api/tx \
  -d '{"subscriber_email":"user@domain.com","template_id":1,"data":{"order_id":"12345"}}'

When to Use Listmonk

  • βœ… Budget-conscious (under $20/mo for any scale)
  • βœ… Data ownership requirements (GDPR, regulated industry)
  • βœ… Developer-friendly (API-first, SQL segmentation)
  • βœ… High volume (millions of subscribers)
  • ❌ Non-technical team (no landing page builder)
  • ❌ Need complex automation sequences (use n8n + Listmonk)

Free 30-min AI & Cloud consultation

Book Now