Listmonk is a single-binary, self-hosted newsletter manager written in Go. It's fast, handles large lists comfortably, and frees you from per-subscriber pricing. You bring your own database and an SMTP provider for sending; Listmonk handles subscribers, campaigns, templates, and analytics.
This guide deploys Listmonk with a managed PostgreSQL database and a transactional email provider.
What you need
- Listmonk container — the Go app (official image).
- Managed PostgreSQL — stores subscribers, lists, campaigns. Required (Listmonk is PostgreSQL-only).
- SMTP provider — Listmonk does not send mail itself; it relays through an SMTP server you configure.
A note on deliverability: self-hosting Listmonk does *not* mean self-hosting an SMTP server. Running your own mail server with good deliverability is a deep specialty (SPF/DKIM/DMARC, IP reputation, feedback loops). Use a reputable transactional email provider for the actual sending — that's the pragmatic, deliverable choice.
Step 1: Provision managed PostgreSQL
Listmonk requires PostgreSQL. On [PandaStack](https://dashboard.pandastack.io), create a managed PostgreSQL (14.x or 16.x). Note the connection details — Listmonk reads them from its config or environment.
Step 2: Initialize the database schema
Listmonk needs a one-time --install to create its schema. Run this as a pre-deploy/init step using the Listmonk image, pointed at your managed PostgreSQL:
listmonk --install --yesThis creates all tables in the target database. It's idempotent-safe to skip on subsequent deploys — run it only once.
Step 3: Configure Listmonk
Listmonk reads a config.toml or environment variables. The database section:
LISTMONK_db__host=<managed-postgres-host>
LISTMONK_db__port=5432
LISTMONK_db__user=<user>
LISTMONK_db__password=<password>
LISTMONK_db__database=listmonk
LISTMONK_db__ssl_mode=require
LISTMONK_app__address=0.0.0.0:9000Listmonk's env-var convention uses double underscores to represent nested config keys.
Step 4: Deploy the container
FROM listmonk/listmonk:latest
# Serves on port 9000Pin a specific version in production rather than latest.
- 1Push the repo (or reference the image) to GitHub.
- 2Create a container app on PandaStack.
- 3Set the
LISTMONK_db__*env vars (password as a secret). - 4Expose port
9000. - 5Add a custom domain — SSL is automatic.
Step 5: Configure SMTP for sending
Log into the Listmonk admin and go to *Settings > SMTP*. Add your transactional email provider's SMTP credentials:
| Field | Example |
|---|---|
| Host | smtp.your-provider.com |
| Port | 587 (STARTTLS) or 465 (TLS) |
| Username | provider API user |
| Password | provider API key (store securely) |
| Max connections | Start at 10; tune to provider limits |
Set the "From" address to a domain you control and have authenticated (SPF/DKIM) with your provider — this is what gets your campaigns into inboxes instead of spam.
Step 6: Authenticate your sending domain
Deliverability lives or dies here. With your email provider:
- 1Add SPF record authorizing the provider to send for your domain.
- 2Add DKIM keys the provider gives you.
- 3Add a DMARC policy (start with
p=noneto monitor, then tighten).
These are DNS records on your sending domain. Skipping them means your newsletters land in spam regardless of how well Listmonk runs.
Step 7: Create lists and send
- 1Create a subscriber list.
- 2Add a subscription form (Listmonk generates embeddable HTML) or import a CSV.
- 3Build a campaign with the template editor.
- 4Send a test, then schedule or send the campaign.
Listmonk's performance is a real selling point — it can push large volumes quickly, bounded mainly by your SMTP provider's rate limits.
Operating tips
- Back up PostgreSQL — it holds your entire subscriber base and campaign history. Use scheduled backups.
- Handle bounces — configure bounce processing so you stop mailing dead addresses (protects sender reputation).
- Respect rate limits — match Listmonk's concurrency settings to your provider's allowed throughput.
- Keep an unsubscribe link — Listmonk includes one; never strip it (legal requirement in most jurisdictions).
References
- [Listmonk documentation](https://listmonk.app/docs/)
- [Listmonk installation](https://listmonk.app/docs/installation/)
- [Listmonk Docker image](https://hub.docker.com/r/listmonk/listmonk)
- [SPF, DKIM, DMARC overview (RFC 7489)](https://datatracker.ietf.org/doc/html/rfc7489)
---
Listmonk gives you a fast, ownership-first newsletter platform — pair it with managed PostgreSQL and a reputable SMTP provider and you're sending in an afternoon. PandaStack handles the database (with scheduled backups) and the container deploy. Start on the free tier at [dashboard.pandastack.io](https://dashboard.pandastack.io).