Back to Blog
Tutorial9 min read2026-06-30

How to Deploy Listmonk Newsletter Manager

Listmonk is a blazing-fast, self-hosted newsletter and mailing list manager. This guide deploys it with managed PostgreSQL and wires up an SMTP provider for reliable delivery.

Ajay Kumar
Ajay Kumar
Founder & DevOps, PandaStack

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 --yes

This 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:9000

Listmonk's env-var convention uses double underscores to represent nested config keys.

Step 4: Deploy the container

FROM listmonk/listmonk:latest
# Serves on port 9000

Pin a specific version in production rather than latest.

  1. 1Push the repo (or reference the image) to GitHub.
  2. 2Create a container app on PandaStack.
  3. 3Set the LISTMONK_db__* env vars (password as a secret).
  4. 4Expose port 9000.
  5. 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:

FieldExample
Hostsmtp.your-provider.com
Port587 (STARTTLS) or 465 (TLS)
Usernameprovider API user
Passwordprovider API key (store securely)
Max connectionsStart 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:

  1. 1Add SPF record authorizing the provider to send for your domain.
  2. 2Add DKIM keys the provider gives you.
  3. 3Add a DMARC policy (start with p=none to 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

  1. 1Create a subscriber list.
  2. 2Add a subscription form (Listmonk generates embeddable HTML) or import a CSV.
  3. 3Build a campaign with the template editor.
  4. 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).

Ready to deploy?

Start free on PandaStack.

Start free on PandaStack

More in Tutorial

Browse all Tutorial articles →

See also