Self-hosted email marketing software runs on a server you control: subscriber list, signup forms, templates and campaign sending live with you instead of with a SaaS provider that bills per contact. The main options are Listmonk and phpList (both open source under AGPL-3.0), Mautic (open source under GPL-3.0, a full marketing automation suite) and Sendy (commercial, one-time payment, sends through Amazon SES). For a plain newsletter, Listmonk is the lean choice: a single binary plus PostgreSQL 12 or later, no license fee. None of them removes the sending side: you still need an SMTP service, a domain with SPF, DKIM and DMARC, and someone for updates, backups and bounces. As of November 2026, Listmonk 6.2.0 (June 26, 2026) is the current stable release and 7.0.0 has been in beta since October 20, 2026.
My newsletter, "From the Engine Room" (German: "Aus dem Maschinenraum"), runs on Listmonk, which we operate on our own servers at Hetzner; emails go out through the mail servers of the German host ALL-INKL as our processor, per my privacy policy (in German, section 7). Ralf, my AI employee for websites, maintains kevinwelter.com technically (Build and Modernize a Website With AI). If a hosted platform suits you better, compare the free plans in Newsletter Platforms Compared: Free Plans first.
Self-hosted email marketing software compared
Retrieved from each project's site and license file on November 6, 2026:
For a signup form and a weekly issue, Listmonk keeps it small: one binary, one database. Mautic fits branching automation and a heavier stack.
When self-hosting is worth it
Self-hosting removes the per-contact bill, not the work. The work moves to you.
A rule of thumb, simplified: if you already run servers you maintain anyway, Listmonk is one more small service. Without a server or technical help, a hosted platform is the faster, safer start. Hosted options and how to move a list with its consent records are in Mailchimp Alternatives (Free and Paid).
Installing Listmonk with Docker
Listmonk runs as a binary or with Docker Compose. Docker is the shorter route:
# Fetch the project's sample file, adjust it, then start
curl -LO https://github.com/knadh/listmonk/raw/master/docker-compose.yml
docker compose up -d
Then create the Super Admin on port 9000. The binary needs ./listmonk --new-config, ./listmonk --install and ./listmonk.
Before it faces the internet:
- Change the credentials. The database user and password in the sample are both
listmonk. Set your own, ideally through the supported _FILE variables rather than plain text.
- Do not expose port 9000. The sample publishes it on all interfaces. Put a reverse proxy with TLS in front and keep the port local (How to Check an SSL Certificate).
- Expose only the public routes. Per the docs, only
/subscription/*, /link/*, /campaign/*, /public/*, /uploads/* and /webhooks/service/* need to be reachable. /admin/* and /api/* belong behind a VPN or IP filter.
- Harden the server. Updates, keys instead of passwords, a firewall: see Securing Your Own Server: Linux and Windows.
Hosting types are compared in Web Hosting Comparison: Prices, Space, SFTP. I run my own services, including this website, on a k3s cluster on Hetzner Cloud (Kubernetes on Hetzner: k3s in Production); all related articles are in the Kubernetes hub. A newsletter alone needs nothing like that; a small server with Docker is enough.
Sending and deliverability: SMTP, SPF, DKIM, DMARC
Listmonk hands every message to an SMTP server; delivery depends on that server and your domain. Two hurdles:
Blocked ports. The Listmonk docs warn that some hosts block outgoing SMTP ports 25 and 465 and name Hetzner as an example. Hetzner's own FAQ confirms it for cloud servers: both ports are blocked by default, you can request an unblock only after a month and your first paid invoice, and decisions are made case by case. Port 587 to external mail delivery services is open (as of November 2026). So the simple setup is Listmonk on your server and sending through an SMTP service on port 587.
Mailbox provider rules. Google's email sender guidelines for Gmail recipients (as of November 2026):
- All senders: SPF or DKIM for the sending domain, valid forward and reverse DNS (PTR) for the sending IP, TLS, and a spam rate in Postmaster Tools below 0.3%.
- More than 5,000 messages a day to Gmail: SPF and DKIM plus DMARC (the policy may be
none), a From domain aligned with the SPF or DKIM domain, and one-click unsubscribe plus a visible unsubscribe link in marketing messages.
Your sending service gives you the SPF and DKIM DNS values. For one-click unsubscribe, Listmonk has a privacy setting that adds the List-Unsubscribe header. Ask your provider for its hourly and daily limits; Listmonk can throttle with a per-worker message rate and a sliding window cap.
Handling bounces
A bounce is a message that comes back. Ignored, they keep you mailing dead addresses. Listmonk offers two ways:
- A dedicated POP3 mailbox. Listmonk reads it, classifies each bounce as soft or hard and deletes the messages afterwards, which is why the docs say never to use your primary inbox.
- Provider webhooks. Ready endpoints exist for Amazon SES, Azure Communication Services, SendGrid, Postmark, Forward Email and Lettermint, plus a generic bounce API for anything else.
Per type you set how many bounces trigger none, blocklist or delete. For SES the docs recommend blocklisting after one hard bounce.
Double opt-in, templates and API
Lists are single or double opt-in. On double opt-in lists, campaigns only reach subscribers who clicked the link in the confirmation email, and Listmonk can record the opt-in IP address. The legal side and which records to keep are in Double Opt-In: Email Setup and Legal Basics. According to my privacy policy, nothing is stored on my side until the confirmation link is clicked; after that, time and IP address of signup and confirmation are kept as proof of consent.
Templates use Go templating, or the visual builder, Markdown or plain text. Three tags go into almost every template: {{ UnsubscribeURL }}, {{ TrackView }} for the tracking pixel (once, in the footer) and {{ TrackLink "…" }} for counted links. The API covers all features, transactional messages included.
Running it: updates, backups and privacy are your job
Updates. Back up the database before every upgrade, as the docs insist. Then pull the new version, run --upgrade and restart. Going back requires the pre-upgrade backup. Read the release notes: 6.2.0 fixed permission checks in multi-user setups, and the 7.0.0 beta replaces the admin UI and changes the sender setting in the settings API.
Backups. The database, for example with pg_dump, and the uploads folder, stored away from the server and restored once as a test. For Kubernetes, see Kubernetes Backup: etcd and Volumes.
Privacy. You are the controller. If you or your subscribers are in the EU, the GDPR asks you to be able to prove consent (Art. 7(1)), to use processors that give sufficient guarantees (Art. 28(1), so contracts with host and sending service), to restore data quickly after an incident (Art. 32(1)(c)) and to erase on request (Art. 17). Listmonk lets subscribers export or wipe their data and lets you switch off per-subscriber tracking. My privacy policy says opens and clicks older than twelve months are deleted once a month, and an unsubscribed entry is deleted 30 days later unless the address is on another list or blocked. This is a technical overview, not legal advice.
Where an AI employee helps
On the technical side, Ralf maintains kevinwelter.com with a fixed routine: inventory check, build, screenshots and click test, and he prepares the launch while approval stays with me. An example of what a Listmonk maintenance brief to an AI employee could look like: "Check the release notes of the new Listmonk version for changes that affect us, back up the database, apply the update on a test instance, send a test campaign to the internal inbox and bring me the result for approval."
For the issues themselves there is Conny, whose page lists newsletter drafts among the uses of her role (AI for Instagram Reels: How Conny Works). Anything that leaves the house, an email send included, only goes out with my explicit word. Where the newsletter sits next to blog and community: Marketing Funnel Examples: Stages in Practice.
Frequently asked questions
Is Listmonk free?
Yes, open source under AGPL-3.0. You pay for server, sending service and your time.
Can Listmonk send email by itself?
No. It hands messages to an SMTP server, your own or a delivery service. On many cloud servers, Hetzner among them, ports 25 and 465 are blocked at first; port 587 to an external service works.
What is the best self-hosted email marketing software?
For newsletters, Listmonk or phpList; for branching automation, Mautic; if you send through Amazon SES anyway and prefer a one-time license, Sendy. Decide by how much you want to run.
Can I move from Mailchimp or Brevo to Listmonk?
Yes. Listmonk imports CSV files, with a separate blocklist mode for unsubscribed contacts. Bring the consent records, meaning time and IP address of signup and confirmation. Brevo's pricing and limits are in Brevo Review: Pricing, Limits, Alternatives.
What to do next
Start Listmonk locally with Docker, build a double opt-in list and a template, and send a test campaign through your future SMTP account. It goes online only once SPF, DKIM, DMARC and bounce handling work. The whole path from idea to first issue is in How to Start a Newsletter: My Own Setup. To see what a self-hosted newsletter carries, pick a resource on my free resources page and sign up for "From the Engine Room": every week a real case from my office, the rule behind it and a template. Ralf, Conny and the other ready-made AI employees are in my community AI Employee Framework.