Door zelf te hosten draait Listmonk op een VPS waar je toch al voor betaalt. Het versturen kost wat je SMTP-relay per duizend e-mails rekent. Het aantal abonnees verandert geen van beide getallen. Dat is de structurele verschuiving die self-hosting de installatietijd waard maakt zodra je een gratis managed plan ontgroeit.
Listmonk is een open-source nieuwsbriefbeheerder geschreven in Go. Je krijgt onbeperkt abonnees, lijsten en campagnes voor de kosten van een VPS plus een SMTP-relay-account. Eén ding moet helder zijn voordat je ook maar één commando typt: Listmonk regelt alles behalve het daadwerkelijke versturen. Of je e-mail in de inbox of in de spammap belandt, wordt bepaald door de SMTP-relay die je instelt en de DNS-records die je op je verzenddomein zet.
Wat deze gids behandelt
- Listmonk en PostgreSQL uitrollen met Docker Compose achter een Nginx (of Caddy) reverse proxy met HTTPS
- De juiste SMTP-relay kiezen voor jouw volume en budget (Amazon SES, Postmark, Brevo of een andere)
- SPF, DKIM en DMARC instellen op je verzenddomein
- Vier productie-faalscenario's vermijden die vaak geen duidelijke fout geven
- Geschatte tijd: 30 minuten als je een VPS en een domein klaar hebt
- Buiten scope: drip-automatisering, transactionele e-mail, multi-instance-opzetten (zie FAQ)
Wanneer Listmonk de verkeerde tool is
Listmonk is het juiste antwoord voor een specifieke situatie. Is jouw situatie anders, dan is er een beter antwoord.
Volume onder ~10K e-mails per maand. Gratis managed plannen bij Brevo of Mailchimp kosten op deze schaal misschien minder all-in dan een VPS plus een SMTP-relay. Self-hosting begint pas rendabel te worden zodra je dat bereik voorbij gaat. Toets de getallen aan je werkelijke aantal abonnees en verzendfrequentie voordat je gaat uitrollen.
Niet-technisch team. Mailchimp en Brevo hebben echt betere UI's voor mensen die niet in een terminal werken. Listmonk gaat ervan uit dat iemand in het team via SSH op een server kan, Docker-logs kan lezen en DNS-propagatie kan interpreteren. Bestaat die persoon niet, dan zijn managed diensten de juiste keuze.
Behoefte aan automatiseringsflows. Listmonk verstuurt campagnes. Het ondersteunt geen drip-reeksen, gedragsgetriggerde e-mails of visuele workflow-builders. Heb je die nodig, draai dan Mautic of koppel Listmonk aan n8n voor de automatiseringslaag.
GDPR-gevoelige abonneelijsten. Zitten je abonnees voornamelijk in de EU of valt je lijst onder GDPR-regels voor dataresidentie, draai Listmonk dan in een Europees datacenter. Wij bieden locaties in Frankfurt en Londen die voldoen aan de EU-residentievereisten.
Wat je nodig hebt voordat je begint
Listmonk plus PostgreSQL plus een gematigde queue-belasting heeft minimaal 2 GB RAM nodig. 4 GB is het comfortabele productiedoel.
Hardware. Voor een persoonlijke lijst onder 50K e-mails per maand volstaat een VPS met 2 vCPU, 4 GB RAM en 120 GB NVMe-opslag. Groeiende lijsten van 200K+ per maand hebben 4 vCPU en 8 GB RAM nodig. Wij draaien deze Compose-opzet op een 4 GB VPS in Frankfurt. Kies waar mogelijk een locatie dicht bij je abonnees. Verzendlatentie maakt weinig uit; de responsiviteit van het adminpaneel wel.
Domein. Een domein dat via een A-record naar je VPS wijst. Gebruik een subdomein voor de adminomgeving, bijvoorbeeld mail.example.com. Het verzenddomein en het adminsubdomein mogen hetzelfde hoofddomein zijn.
SMTP-relay-account. Maak er nog geen aan. De relaykeuze is de meest bepalende beslissing in deze gids en hangt af van je volume. Spring vooruit naar de sectie "Je SMTP-relay kiezen", kies een provider en kom dan hier terug met de SMTP-host, poort, gebruikersnaam en wachtwoord bij de hand.
Software op de VPS. Ubuntu 22.04 LTS of 24.04 LTS. Docker Engine 24.0 of hoger met de Docker Compose-plugin. UFW of een vergelijkbare firewall met poorten 22, 80 en 443 open. SSH-toegang als een non-root sudo-gebruiker.
Listmonk uitrollen met Docker Compose

Maak een directory voor de uitrol aan en plaats er een docker-compose.yml bestand in met twee services: postgres voor de database en listmonk voor de applicatie. Beide herstarten bij een fout. Listmonk bindt aan 127.0.0.1 zodat de reverse proxy het enige is dat het kan bereiken.
Het Docker Compose-bestand
I notice your message seems incomplete. Could you please provide the English text you'd like me to translate to Dutch? docker-compose.yml. Controleer de exacte image-tags en namen van omgevingsvariabelen tegen de officiële Listmonk-installatiedocumentatie. Ze worden bij elke release bijgewerkt.
# docker-compose.yml
services:
postgres:
image: postgres:16-alpine
container_name: listmonk-postgres
restart: unless-stopped
environment:
POSTGRES_USER: listmonk
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: listmonk
volumes:
- listmonk-postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U listmonk"]
interval: 10s
timeout: 5s
retries: 6
app:
image: listmonk/listmonk:latest
container_name: listmonk-app
restart: unless-stopped
# Bind to loopback only. The reverse proxy is the public entrypoint.
ports:
- "127.0.0.1:9000:9000"
depends_on:
postgres:
condition: service_healthy
environment:
LISTMONK_app__address: "0.0.0.0:9000"
LISTMONK_db__host: postgres
LISTMONK_db__port: 5432
LISTMONK_db__user: listmonk
LISTMONK_db__password: ${POSTGRES_PASSWORD}
LISTMONK_db__database: listmonk
volumes:
listmonk-postgres:
Maak een .env bestand met POSTGRES_PASSWORD= ingesteld op een lange willekeurige string. Start dan de stack en voer de eenmalige database-installatie uit:
# Pull images and start the database first
docker compose up -d postgres
# Run the install step (creates schema and the first admin user)
docker compose run --rm app ./listmonk --install --idempotent --yes
# Start the application
docker compose up -d
De --install commando vraagt om een admin-e-mail en wachtwoord. Bewaar ze. Controleer of beide containers draaien:
docker compose ps
Verwachte uitvoer: twee services in de lijst, beide met de status Up. De postgres-regel hoort (healthy) te tonen.
De 127.0.0.1:9000 binding is bewust. Listmonk heeft geen ingebouwde rate-limiter voor authenticatie en geen IP-allowlisting. Poort 9000 blootstellen aan het publieke internet betekent dat iedereen ter wereld je admin-login kan benaderen. De reverse proxy is wat die login uitsluitend via HTTPS bereikbaar maakt.
Nginx reverse proxy en SSL
Installeer Nginx en Certbot uit de Ubuntu-repositories. Maak een siteconfiguratie aan op /etc/nginx/sites-available/listmonk met de proxy-headers die Listmonk nodig heeft om correcte campagnelinks te genereren:
# /etc/nginx/sites-available/listmonk
server {
listen 80;
server_name mail.example.com;
location / {
proxy_pass http://127.0.0.1:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Listmonk streams campaign progress over WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Maak er een symlink van naar sites-enabled, test de config, herlaad Nginx en geef dan een certificaat uit:
sudo ln -s /etc/nginx/sites-available/listmonk /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d mail.example.com
Certbot herschrijft het serverblok om op 443 te luisteren met het nieuwe certificaat en voegt een HTTP-naar-HTTPS-redirect toe. Controleer:
curl -I https://mail.example.com
Verwachte uitvoer: HTTP/2 200 met een geldige strict-transport-security-header. Krijg je een redirect-loop, controleer dan of de X-Forwarded-Proto header is ingesteld in de Nginx-config hierboven. Negen van de tien keer zit de loop in die header.
Is Listmonk het enige op deze VPS, gebruik dan Caddy in plaats daarvan. De Caddyfile is drie regels en regelt de certificaatvernieuwing zonder cronjob:
mail.example.com {
reverse_proxy 127.0.0.1:9000
}
Repareer de Message-ID-header
Standaard gebruikt Listmonk de systeem-hostname in de uitgaande Message-ID-header. Is de hostname van je VPS localhost of iets anders dat geen geldige FQDN is, dan verstuurt Listmonk Message-ID: <[email protected]>. Spamfilters bij Gmail en Outlook markeren dit meteen. Dit staat gedocumenteerd in Cloudron Forum thread 15410.
De fix is één regel in Listmonk's config.toml. Genereer voor een verse installatie het bestand via docker compose run --rm app ./listmonk --new-config. Stel dan in:
[app]
hostname = "mail.example.com"
Herstart de app-container na het bewerken:
docker compose restart app
Doe dit voordat je ook maar één campagne verstuurt. Een lijst die besmet is met localhost.localdomain Message-ID's is lastiger te herstellen dan een die schoon begon.
Professioneel advies
Wil je de Compose-opzet liever overslaan, bekijk dan onze one-click Listmonk VPS om Listmonk in een paar minuten met één klik uit te rollen. De instance komt voorgeconfigureerd met PostgreSQL. Je moet nog steeds je SMTP-relay instellen en je DNS-records toevoegen. Die stappen zijn niet optioneel, ongeacht hoe je uitrolt.
Je SMTP-relay kiezen

Al het versturen gaat via een relay die je instelt. De IP-reputatie, rate limits en bounce-afhandeling van de relay bepalen of je e-mail in de inbox of in de spammap belandt.
Hier is de functionele vergelijking. Prijzen en limieten van gratis plannen veranderen. Controleer ze elk op de officiële prijspagina van de provider voordat je je vastlegt.
| Leverancier | Kostenstructuur | Bounce-webhooks | Beste voor |
|---|---|---|---|
| Amazon SES | Per e-mail, zeer laag bij volume | Ja, via SNS | Kosten bij volume; al op AWS |
| Postmark | Maandelijkse basis plus per e-mail | Ja, native | Deliverability voorop; transactionele reputatie |
| Brevo | Gratis plan voor laag volume, betaalde plannen daarboven | Ja | Laag volume met opschaalpad |
| Mailgun | Prijs per e-mail | Geen native webhook-endpoint; gebruik zo nodig de generieke bounce-API. | Vertrouwd voor devs |
Dat was slechts een korte blik op elke SMTP-relay. Nu behandelen we ze stuk voor stuk in detail.
Amazon SES (aanbevolen startpunt)
SES is de goedkoopste optie bij volume en de meest besproken in de Listmonk-community. De opzet heeft meer stappen dan Postmark of Brevo, maar het kostenverschil per e-mail is bij elk reëel volume groot genoeg om het werk te rechtvaardigen.
Stel het in drie fasen in. Maak eerst een IAM-gebruiker aan met de AmazonSESFullAccess policy (of een striktere custom policy met alleen ses:SendRawEmail en ses:GetSendQuota). Verifieer ten tweede je verzenddomein in de SES-console. SES leidt je door de DKIM-CNAME's die je moet toevoegen. Genereer ten derde SMTP-credentials in het SMTP-instellingenpaneel van SES. Dit zijn niet je AWS-toegangssleutels; SES genereert een aparte SMTP-specifieke gebruikersnaam en wachtwoord wanneer je op "Create SMTP credentials" klikt.
Voeg in Listmonk's admin onder Settings → SMTP een nieuwe server toe met:
- Gastheer:
email-smtp.<region>.amazonaws.com(gebruik de SES-regio waarin je het domein hebt geverifieerd) - Poort: 587
- Auth-protocol: LOGIN
- TLS: STARTTLS
- Gebruikersnaam en wachtwoord: de SMTP-credentials die SES genereerde
SES vereist STARTTLS op poort 587. Laat je TLS op none staan of kies je poort 465, dan maakt Listmonk verbinding, retourneert SES 530 Must issue a STARTTLS command first, en kan de SMTP-credentialtest in het adminpaneel toch succes tonen. Stuur een echte testmail naar een persoonlijke inbox die je beheert voordat je een campagne draait.
Nieuwe SES-accounts beginnen in sandbox-modus. In de sandbox kun je alleen naar geverifieerde e-mailadressen versturen, wat voor een abonneelijst nutteloos is. Open een supportticket vanuit de SES-console om productietoegang aan te vragen. Goedkeuring duurt doorgaans één werkdag.
Postmark (deliverability-first alternatief)
Postmark kost meer per e-mail dan SES, maar heeft native ondersteuning voor bounce-webhooks en een reputatie voor hoge inbox-percentages met strikt afzenderbeleid. De moeite waard als je nieuwsbrieven bedrijfskritiek zijn of je het sandbox-naar-productie-goedkeuringsproces van SES niet wilt beheren.
De Listmonk-configuratie heeft dezelfde vorm als SES: host, poort 587, STARTTLS, credentials uit het API-tokenspaneel van de Postmark-server. Verifieer je verzenddomein in de signature-setup van Postmark, voeg de DKIM-records toe die Postmark genereert, en je bent klaar om te versturen.
Kies Postmark wanneer deliverability belangrijker is dan de kosten per e-mail. Kies SES wanneer volume belangrijker is dan extra begeleiding.
Een waarschuwing over de SMTP-credentialtest. De verbindingstest in Listmonk's admin meldt altijd succes, zelfs met ongeldige credentials. Dit staat gedocumenteerd in een paar GitHub issues. Vertrouw hem niet. Stuur na het instellen van een relay een campagne naar één enkele test-abonnee en bevestig ontvangst in de doelinbox voordat je naar je volledige lijst verstuurt.
Vermijd Mailersend voor het verzenden van bulkcampagnes. De limiet van 5 e-mails per verbinding levert 421 Service not available fouten op die Listmonk als verzonden registreert, ook al is de bezorging mislukt. De campagne ziet er succesvol uit in Listmonk en laat zonder waarschuwing de meeste berichten vallen.
Zorgen dat e-mail echt aankomt: SPF, DKIM en DMARC

Dit zijn drie DNS-records op je verzenddomein die ontvangende mailservers vertellen dat jouw domein deze relay heeft gemachtigd om namens jou te versturen. Sla er ook maar één over en op schaal belandt een aanzienlijk deel van je verzendingen in spam, hoe schoon je relay of je tekst ook is. Voeg ze toe bij je DNS-provider voordat je de eerste campagne verstuurt.
SPF-record
SPF machtigt specifieke IP's of verzenddiensten om e-mail te versturen voor jouw domein. Voeg één TXT-record toe op de root van je verzenddomein met de include voor je relay. Voor SES ziet het record er zo uit:
v=spf1 include:amazonses.com ~all
Vervang voor Postmark de include door include:spf.mtasv.net. Controleer altijd de officiële SPF-documentatie van je relay voor de exacte include-waarde. Die verschilt per provider en soms per regio.
Een domein kan slechts één SPF-record hebben. Heb je er al een voor een andere dienst (Google Workspace, Microsoft 365), voeg de include dan samen in het bestaande record in plaats van een tweede toe te voegen.
DKIM
DKIM hangt een cryptografische handtekening aan uitgaande e-mails die ontvangende servers verifiëren tegen een publieke sleutel in je DNS. Je relay genereert het sleutelpaar. Je voegt de publieke sleutel toe als een TXT-record op een selector-subdomein (bijvoorbeeld sel1._domainkey.example.com) met de exacte waarde die de relay je geeft.
Listmonk regelt de DKIM-ondertekening niet. De relay doet dat. Er is geen Listmonk-specifieke DKIM-configuratie. Volg de DKIM-setupwizard van je relay, voeg de records toe die het geeft, en wacht op DNS-propagatie (meestal binnen 30 minuten; soms een paar uur).
DMARC
DMARC vertelt ontvangende servers wat ze moeten doen met e-mail die de SPF- of DKIM-controles niet doorstaat. Begin in monitoringmodus met p=none zodat je fouten in de aggregaatrapporten kunt zien zonder de deliverability te beïnvloeden terwijl je misconfiguraties wegwerkt. Voeg een TXT-record toe op _dmarc.example.com:
v=DMARC1; p=none; rua=mailto:[email protected]
Verscherp na twee of drie weken schone rapporten het beleid naar p=quarantine or p=reject. Sla de monitoringfase niet over. Een typefout in je SPF-include in combinatie met p=reject op dag één wist je eigen legitieme e-mail uit zonder enig signaal dat er iets misging.
De List-Unsubscribe-header (RFC 8058) wordt automatisch door Listmonk gegenereerd. Bevestig dat hij is ingeschakeld onder Settings → General. Gmail en Apple Mail tonen deze header als een uitschrijfoptie met één klik, wat de afzenderreputatie beschermt.
Wat er echt stukgaat in productie
Vier faalscenario's die pas opduiken als je je eerste echte campagne verstuurt. Vang ze voordat je abonnees dat doen.
Probleem 1: Het bouncepercentage komt niet overeen met het getal van je relay. Listmonk verwerkt bounces door een aangewezen bounce-e-mailadres uit te lezen via POP3 en elk bericht dat het leest te verwijderen. Dat omvat afwezigheidsantwoorden, bezorgbevestigingen en out-of-office-meldingen, allemaal geclassificeerd als bounces. Je relay telt alleen echte bezorgfouten die door ontvangende mailservers worden geretourneerd. Als SES 0.6% meldt en Listmonk 4%, is dit het verschil. De fix is om bounce-webhook-callbacks in te stellen in plaats van POP3. Gebruik voor SES SNS om bounce-meldingen aan Listmonk's webhook-endpoint te leveren. Wijs voor Postmark zijn native webhook naar hetzelfde endpoint. Webhook-bounces zijn nauwkeurig; POP3-bounces overdrijven.
Probleem 2: De SMTP-credentialtest zegt succes terwijl hij fout zit. Zoals vermeld in de relaysectie meldt de verbindingstest altijd succes, ongeacht of de credentials geldig zijn. Vertrouw hem niet. Stuur altijd een echte testmail nadat je een SMTP-instelling hebt ingesteld of gewijzigd.
Probleem 3: Een campagne stopt halverwege het versturen zonder fout. Listmonk markeert campagnes als Finished, zelfs als slechts 60% van de abonnees de e-mail heeft ontvangen. De resterende verzendingen werden geweigerd door de relay of geknepen op de netwerklaag van de VPS, en Listmonk toont geen van beide als een fout op campagneniveau (Cloudron Forum thread 13165). Toont een campagne minder verzendingen dan abonnees, open dan het dashboard van je relay voor het verzendvenster en vergelijk het geaccepteerde aantal van de relay met dat van Listmonk. De waarheid zit in de relay.
Probleem 4: Niemand maakt back-ups van PostgreSQL. De Compose-volume bewaart data over herstarts heen. Het beschermt niet tegen hostuitval, een per ongeluk uitgevoerde docker volume rm, of beschadigde upgrades. Voeg een dagelijkse pg_dump toe:
0 2 * * * docker exec listmonk-postgres pg_dump -U listmonk listmonk > /backups/listmonk-$(date +\%Y\%m\%d).sql
Voer de regel eerst één keer met de hand uit. Controleer of het uitvoerbestand niet leeg is voordat je de cron-entry vertrouwt. Een back-upscript dat een bestand van nul bytes wegschrijft zonder een fout te melden, is erger dan geen back-up, want je stopt erover na te denken.
Voordat je hier in productie iets van vertrouwt, stuur een testcampagne naar één abonnee en bevestig ontvangst in de doelinbox. Landt die ene e-mail netjes, dan doen de volgende tienduizend dat ook.
Veelgestelde vragen
Waarom zijn mijn Listmonk-bouncepercentages hoger dan wat Amazon SES rapporteert?
Listmonk's POP3-bounceverwerking blaast de tellingen op door out-of-office-antwoorden en vakantie-autoresponders als bounces te lezen. Stel SES SNS-webhook-callbacks in voor nauwkeurige tellingen.
Ondersteunt Listmonk transactionele e-mails?
Listmonk is een tool voor nieuwsbrieven en broadcastcampagnes. Het verwerkt transactionele e-mail (wachtwoordresets, orderbevestigingen, één-op-één getriggerde e-mails) niet native. Voor transactionele e-mail vanaf hetzelfde verzenddomein stel je het transactionele endpoint van je relay apart in, of gebruik je een speciale tool zoals Postal of Postmark's transactionele API naast Listmonk.
Hoe importeer ik mijn Mailchimp-abonnees in Listmonk?
Exporteer je Mailchimp-lijst als CSV via Audience → Export Audience. Ga in Listmonk naar Subscribers → Import en upload de CSV. Koppel de e-mail- en naamkolommen wanneer daarom wordt gevraagd. Listmonk accepteert standaard CSV-exports uit Mailchimp, ConvertKit en de meeste nieuwsbriefplatforms zonder formaatconversie.
Wat gebeurt er als iemand zich uitschrijft van een Listmonk-campagne?
Listmonk voegt standaard een uitschrijflink toe aan elke campagne-e-mail. Klikt een abonnee erop, dan wordt hij aan de blocklist toegevoegd en uit alle toekomstige campagnes verwijderd. De List-Unsubscribe-header (RFC 8058) wordt automatisch meegestuurd, zodat mailclients die uitschrijven met één klik ondersteunen (Gmail, Apple Mail) het native tonen. Het abonneerecord blijft in de database voor auditdoeleinden, maar er worden geen verdere campagnes naar verstuurd.