Skip to main content
AC
Content & Publishing4.3 KBMIT licensed

listmonk-publisher

Original, written for TechTide client work

Deploy and operate Listmonk, the self-hosted open-source newsletter engine, as a sovereign email list with custom segmentation. Use when evaluating or running a self-hosted list, wiring an SMTP relay, or deciding hosted vs self-hosted newsletter infrastructure. Not for a full CMS with memberships and a website: use ghost-publisher. Not for hosted newsletter operations, monetization, and ad network: use beehiiv.

  • listmonk
  • publisher

SKILL.md

Listmonk Publisher

Listmonk is a single Go binary plus PostgreSQL that scales to millions of subscribers at near-zero per-email cost through an SMTP relay. It buys data sovereignty and price control, and it costs you deliverability ownership. Default to hosted until a trigger fires.

Deploy or defer

Deploy Listmonk when at least one holds:

  • Hosted pricing breaks at your list size (typically 100k+ subscribers where hosted tiers jump 3-4x).
  • You need full data sovereignty (EU or regulated verticals).
  • You want near-zero marginal send cost via SES or similar (~$0.10 per 1k emails).

None hold: stay on the hosted platform as primary. Keep Listmonk as the documented exit path, that alone is negotiating leverage against lock-in.

Setup

  1. Run PostgreSQL, then the Listmonk binary or container on an internal port (default 9000). Do not expose the admin UI publicly, put it behind a reverse proxy with auth or a private network.
  2. Configure an SMTP relay (Amazon SES, Postmark, or similar). Sending from a raw VPS IP is a deliverability death sentence.
  3. Set DNS before the first send: SPF, DKIM, and DMARC records for the sending domain, verified in the relay's console.
  4. Store credentials as env vars: $LISTMONK_URL, $LISTMONK_API_USER, $LISTMONK_API_KEY. Never in the repo.
  5. Create lists and enable double opt-in. Import existing subscribers only with their opt-in provenance intact.

Operate

  • Publish campaigns via the admin UI or POST /api/campaigns with the API key, always to a test list first.
  • Segment with SQL-based subscriber queries, that is Listmonk's edge over hosted tools.
  • Warm up a new sending domain: start with your most engaged segment, grow volume over weeks.
  • Watch bounce and complaint rates in the relay console after every send, not monthly.

Alternatives map

Listmonk (Go, AGPL): fastest, leanest. Mautic (PHP, GPL): full marketing automation, heaviest. Keila (Elixir, AGPL): Mailchimp-like UI. Ghost (Node, MIT): CMS with newsletter, see ghost-publisher. Postal (Ruby, MIT): SMTP server for transactional, not a list manager.

Good vs bad

Bad: 4k subscribers, hosted plan is cheap, but "self-hosted is cooler", so a weekend goes into Listmonk plus SES, DKIM never gets set, and the first campaign lands in spam for half the list.

Good: 120k subscribers, hosted bill about to triple. Deploy Listmonk with SES, verify SPF/DKIM/DMARC, warm the domain on the most engaged 10%, migrate segment by segment while watching bounce rates, and cut the bill by an order of magnitude.

Verification

Before the first real campaign, send a test campaign to a seed list including Gmail and Outlook addresses. Check headers on the received mail. Expect: spf=pass, dkim=pass, dmarc=pass, landing in the inbox, not spam. Any fail: fix DNS and relay config before sending to subscribers, warming a burned domain takes months.

Completion checklist

  • [ ] Deploy decision backed by a trigger, not preference
  • [ ] Admin UI not publicly exposed
  • [ ] SMTP relay configured, no direct-IP sending
  • [ ] SPF, DKIM, DMARC verified passing on a seed test
  • [ ] Credentials in env vars only
  • [ ] Double opt-in on, import provenance clean
  • [ ] Domain warm-up plan for new sending domains

Any box unchecked: not done. Fix or say so.

Footguns

  • DNS skipped, domain burned. Sends without SPF/DKIM/DMARC train providers to junk your domain, and the reputation damage outlives the fix. Fix: verify all three pass on a seed test before any subscriber send.
  • Full-volume day one. A fresh domain blasting 100k emails looks exactly like a spammer. Fix: warm up over weeks, engaged segments first.
  • Dirty list import. Importing scraped or stale addresses spikes bounces and gets the relay account suspended. Fix: import only provable opt-ins, run a hygiene pass on anything old.

More in Content & Publishing

All skills