listmonk

High-performance, self-hosted newsletter and mailing list manager packaged as a single binary with built-in analytics, transactional messaging, and multi-channel delivery.

19.2Kstars
1.9Kforks
GNU Affero General Public License v3.0
Go

listmonk is a standalone, self-hosted newsletter and mailing list manager built for developers and organizations that want full ownership over their email infrastructure. It ships as a single statically-compiled binary with no runtime dependencies, backed by PostgreSQL for reliable, scalable storage of subscribers, campaigns, and analytics data. The dashboard provides everything from campaign creation to real-time delivery tracking in one cohesive interface.

What sets listmonk apart is its multi-messenger architecture: beyond standard SMTP email, it supports transactional SMS, WhatsApp, and custom HTTP postback integrations via a pluggable messenger interface. Campaigns and transactional messages share the same Go template engine, giving operators a unified way to personalize content across channels. SQL-based subscriber segmentation allows fine-grained targeting without requiring external tooling.

listmonk is actively developed and widely adopted in the self-hosting community, with over 21,000 GitHub stars and contributions from 220+ developers. Recent versions have added TOTP two-factor authentication, a visual drag-and-drop email builder, per-campaign SMTP selection, OIDC SSO with granular role-based permissions, and a built-in bounce management system. The upgrade path is idempotent — operators run a single --upgrade flag to apply schema migrations safely.

Deployment is straightforward via Docker Compose or binary download, with environment variable configuration and TOML fallback for all settings. For teams that need privacy by default, listmonk ships with configurable tracking opt-outs and anonymized analytics, making it a strong choice for NGOs, independent media, and compliance-sensitive organizations.

What You Get

  • Single Binary Deployment - listmonk compiles to a self-contained static binary with no runtime dependencies; deploy it directly on any Linux server or use the official Docker image without managing language runtimes or package managers.
  • PostgreSQL-Backed Storage - All subscriber, campaign, bounce, and analytics data is stored in PostgreSQL with materialized views for dashboard aggregations, giving operators full SQL access for custom reporting and backups.
  • Go + Sprig Template Engine - Compose email and transactional message content using Go’s template syntax enriched with 100+ Sprig helper functions for string manipulation, date formatting, and conditional logic per subscriber attribute.
  • Visual Drag-and-Drop Email Builder - Create and edit HTML email campaigns with a visual block-based builder, CodeMirror-powered HTML/CSS editor, Markdown mode, or plain text—switchable per campaign with one-click format conversion.
  • Multi-Channel Messenger API - Send email, SMS, WhatsApp, or custom notifications through a unified RESTful API using the /api/tx endpoint with pluggable postback messenger support for any HTTP-based notification backend.
  • Built-in Campaign Analytics - Track open rates, click-throughs, bounce rates, subscriber activity, and top-performing links in real time through materialized view-powered dashboards with per-campaign drill-down.
  • Granular Role-Based Permissions + OIDC SSO - Define custom roles with per-list, per-campaign, and per-feature permissions; authenticate users via OpenID Connect with auto-provisioning and TOTP two-factor authentication support.
  • Bounce Management & POP3 Scanning - Automatically process hard and soft bounces from SMTP webhooks or POP3 mailbox polling, with configurable blocklisting thresholds and bulk subscriber blocklisting from the bounces UI.

Common Use Cases

  • Independent newsletter publishing - A journalist or creator self-hosts listmonk to own their subscriber list entirely, using SQL-based segments to target paying members, free readers, or geographic cohorts without depending on Mailchimp or Substack.
  • Open-source project community updates - A project maintainer sends release announcements and changelogs to hundreds of thousands of subscribers using Go templates to personalize content per subscriber attribute, with high throughput and zero per-email cost.
  • Multi-channel transactional notifications - A SaaS company uses the /api/tx endpoint to fire password reset emails, SMS OTPs via a postback messenger, and onboarding sequences from a single template system, eliminating multiple vendor integrations.
  • Privacy-first marketing for NGOs and compliance-heavy orgs - A nonprofit deploys listmonk on-premises to keep subscriber data within their own infrastructure, configures tracking opt-outs for GDPR compliance, and uses OIDC SSO to manage team access across departments.
  • Agency-managed email campaigns for clients - A digital agency runs a shared listmonk instance with granular list-level permissions, allowing each client team to manage only their own lists and campaigns without visibility into other accounts.

Under The Hood

Architecture listmonk follows a pragmatic monolith pattern built around a single App struct that wires together a well-defined Core CRUD layer, an internal/manager campaign scheduling engine, and a messenger abstraction layer behind a Messenger interface. HTTP handlers in the cmd/ package call into Core methods for all data operations, while the Manager runs campaign batches asynchronously via its own goroutine-based pipeline. The Store interface separating the Manager from the database is particularly clean — it allows future storage backends without touching dispatch logic. Configuration is handled by koanf with layered TOML and environment variable sources, and database schema upgrades are versioned SQL migration files applied idempotently at startup. Frontend assets are embedded into the binary at build time via stuffbin, producing a completely self-contained artifact.

Tech Stack The backend is written in Go, compiled as a static binary without CGO, and exposes HTTP APIs via the Echo framework. PostgreSQL is the sole data store, accessed through sqlx with raw SQL queries defined in separate .sql files organized by domain. Campaign template rendering uses Go’s html/template package augmented with the Sprig v3 function library and Goldmark for Markdown conversion. The frontend is a Vue 3 application with Buefy UI components, built with Vite and TypeScript, then embedded into the binary at release time using GoReleaser for multi-architecture Docker and binary packages. OIDC authentication is provided by coreos/go-oidc, SMTP pooling by the author’s own smtppool library, and media storage via the simples3 S3-compatible client.

Code Quality The Go codebase has no unit test files — testing relies entirely on a Cypress end-to-end suite with eleven spec files covering subscribers, campaigns, lists, templates, bounces, settings, users, forms, archive, dashboard, and import flows. Error handling is consistent: all Core methods return echo.HTTPError values that handlers pass directly to the client without wrapping, which simplifies error propagation but loses structured error types for programmatic handling. Naming conventions are clear and consistent, with domain-separated query files, model files, and handler files. The codebase was recently refactored to split a monolithic queries.sql and models.go into per-domain files, improving navigability significantly. CI runs on GitHub Actions with linting and build checks across platforms.

What Makes It Unique listmonk’s most distinctive design choice is the pluggable messenger abstraction: the Messenger interface allows any HTTP-reachable service to receive campaign or transactional messages, enabling SMS gateways, WhatsApp APIs, or custom notification systems to operate alongside SMTP without code changes. The ability to select different SMTP server pools per campaign — with round-robin load balancing across named server groups — is rare in self-hosted email tools. Equally notable is the built-in visual email builder integrated directly into the admin UI via email-builder-js, eliminating the need for external design tools while preserving raw HTML editing mode. The ALTCHA proof-of-work CAPTCHA implementation for public subscription forms avoids third-party tracking dependencies entirely, consistent with the project’s privacy-by-default ethos.

Self-Hosting

listmonk is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). In plain terms, this means you can freely use, modify, and self-host listmonk for any purpose, including commercial use. The key obligation AGPL adds beyond GPL is the network-use clause: if you modify listmonk and offer it as a network service to others — for example, as a managed newsletter platform for customers — you must make your modified source code available under the same license. Operators running listmonk purely for their own organization, even commercially, are not required to publish source code changes.

Running listmonk yourself requires PostgreSQL as the sole external dependency. The application itself is a single binary or Docker container, so infrastructure needs are minimal: a small VPS or dedicated server is sufficient for low-to-medium volume, while high-volume deployments (millions of subscribers) benefit from a tuned PostgreSQL instance and connection pooling. Operators are responsible for database backups, schema upgrades (run manually with --upgrade), SMTP relay configuration, TLS certificate management, and monitoring. The upgrade path is idempotent and well-documented, but production deployments should follow the project’s recommendation of backing up the database before each upgrade. There is no built-in high-availability or clustering; those must be layered on through standard PostgreSQL replication and reverse-proxy configurations.

listmonk has no official paid or cloud tier — it is entirely community-supported software with no commercial entity behind it. This means there are no SLAs, no managed upgrade services, no enterprise support contracts, and no cloud-hosted option from the upstream project. Community support is available through GitHub Issues, and a Discord community exists for general help. Third-party managed hosting providers (Pikapods, Cloudron, Fly.io, and others) offer one-click deployment options for operators who want lower operational overhead without building infrastructure from scratch. The trade-off versus a SaaS provider is clear: you gain complete data ownership and zero per-email costs, but you own all operational burden including deliverability setup, IP reputation management, and bounce handling.

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack

No spam. Unsubscribe anytime.

Join 750+ subscribers
No spam. Unsubscribe anytime.

Search