Install Listmonk
Send newsletters from your own server, with unsubscribe that works and consent you can show.
Last reviewed:
What Listmonk is
A program for newsletters and mailings. You set up a list of subscribers, write a letter, and send it to everyone at once. Then you see how many opened it and which links they clicked.
That sounds like something you can do from the company email account, and for twenty recipients that is true. At two hundred you no longer can. Email programs have limits on how many recipients are accepted per day, the unsubscribe link must be there and work, and the person who receives the letter should not see the addresses of everyone else. Listmonk handles that part.
There is also a legal side. If you send marketing to private individuals in Sweden, the main rule is that they must have said yes in advance, and that every mailing contains an easy way to say no (there are exceptions for existing customers who receive similar offers and have not said no). If the recipient is instead a company (B2B), that prior consent does not apply. Listmonk inserts the unsubscribe link automatically, but you must collect the consent yourself, and you must be able to show it.
This is a server program
Listmonk needs a database and a machine to run on. Docker handles both. If you do not have Docker, start with Install Docker.
The program does not send the emails itself. It needs a so-called SMTP server, meaning an account with a service that actually delivers the mail. The company's regular email account works for small sends, a sending service is the right choice when the volume grows. Listmonk is free and open source, but the sending service often is not, so include that cost in your calculations.
Windows and Linux Mint
The same file on both. Create a folder called listmonk in the home folder, that is in C:\Users\ert-namn on Windows and in /home/ert-namn on Linux Mint, and an empty subfolder in it called uploads. Then put a text file called compose.yaml in the listmonk folder:
services:
app:
image: listmonk/listmonk:latest
depends_on:
- db
ports:
- "9000:9000"
command: [sh, -c, "./listmonk --install --idempotent --yes --config '' && ./listmonk --upgrade --yes --config '' && ./listmonk --config ''"]
environment:
LISTMONK_app__address: 0.0.0.0:9000
LISTMONK_db__host: db
LISTMONK_db__port: 5432
LISTMONK_db__user: listmonk
LISTMONK_db__password: BYT_UT_MIG
LISTMONK_db__database: listmonk
LISTMONK_db__ssl_mode: disable
LISTMONK_ADMIN_USER: admin
LISTMONK_ADMIN_PASSWORD: BYT_UT_MIG_ADMIN
TZ: Europe/Stockholm
volumes:
- ./uploads:/listmonk/uploads:rw
restart: unless-stopped
db:
image: postgres:17-alpine
environment:
POSTGRES_USER: listmonk
POSTGRES_PASSWORD: BYT_UT_MIG
POSTGRES_DB: listmonk
volumes:
- listmonk-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U listmonk"]
interval: 10s
timeout: 5s
retries: 6
restart: unless-stopped
volumes:
listmonk-data:
The long command line looks complicated but does something simple: it sets up the database the first time, runs any updates on later starts, and then starts the program. Do not touch it.
The two lines called BYT_UT_MIG are the database password and must be identical. BYT_UT_MIG_ADMIN is your own login password.
Open the terminal and go into the folder. On Windows that is PowerShell:
cd $HOME\listmonk
On Linux Mint the program is called Terminal:
cd ~/listmonk
Then start:
docker compose up -d
If Docker cannot find a compose.yaml you are in the wrong folder, and the cd line fixes that. Then open http://localhost:9000. We just ran this setup and logged in with the account above.
localhost means your own computer and nothing else. If you want to show the mailing to someone in the company, you cannot send the link: that person ends up on their own machine. Building lists and templates locally works well. If several people are to handle the mailings, Listmonk needs to run on a machine that is switched on and is reached at that machine's address.
Three things to do first
- Fill in the sender details under Settings before you create any mailing: sender name, sender address and the SMTP settings from your email provider. A message without a working sender ends up in everyone's spam folder.
- Send a test mailing to yourselves and to someone outside the company, preferably using a different email program. That is the only way to see that the unsubscribe link works and that the message looks the way you think it does.
- Create two lists from the start: one for customers and one for interested people. Splitting them later requires someone to sort the rows by hand.
The most common trap
Importing an address list you have not received permission to email. It is tempting to add everyone in your contact book, everyone in your network and everyone who has bought something once. The rules in the Marketing Act and the GDPR see things differently, and it is a question a supervisory authority can ask.
Do this instead: collect the addresses through Listmonk's own signup form, with a checkbox where the person actively says yes. Then the consent is documented with a date, and you can show it.
The second common mistake is purely technical. If you send two hundred messages in a minute from an ordinary email account, the provider throttles you, often without telling you. Under Settings and the Performance tab there is a setting for how many messages Listmonk may send. Set it low, preferably one per second, and let the sendout take the time it takes.