Should I self-host Mailchimp?
listmonk runs your lists and campaigns for the cost of a Postgres; pair it with SES at ~$0.10/1k emails and Mailchimp's $156/yr becomes a rounding error. Deliverability is now a skill you own.
Mailchimp's sender reputation — you'll ride SES/Postmark's instead, and warm-up is real
The template marketplace and journey builder
subscriber lists & segments · campaign sending · templates · signup forms · analytics
* Percent of the subscription price. Your time is priced at the slider's rate — $0/h ("my homelab time is free and I love it") is a legitimate position. Every number is derived from the record, never hand-written. Price source, checked 2026-08-05.
Runs comfortably on a Raspberry Pi.


--install must run before first serve (the compose command chains it idempotently)
Sending anything real requires an SMTP relay — factor ~$1-5/mo for SES into your own math
# listmonk — newsletter + mailing lists (replaces Mailchimp's list half; you still need an
# SMTP relay like SES/Postmark for deliverability — that cost is in the verdict math notes)
services:
listmonk:
image: listmonk/listmonk:latest
container_name: listmonk
restart: unless-stopped
depends_on:
listmonk-db:
condition: service_healthy
command: [sh, -c, "./listmonk --install --idempotent --yes && ./listmonk"]
environment:
LISTMONK_app__address: 0.0.0.0:9000
LISTMONK_db__host: listmonk-db
LISTMONK_db__port: "5432"
LISTMONK_db__user: listmonk
LISTMONK_db__password: listmonk
LISTMONK_db__database: listmonk
LISTMONK_db__ssl_mode: disable
ports:
- "9000:9000"
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:9000/health >/dev/null || exit 1"]
interval: 5s
timeout: 5s
retries: 24
start_period: 20s
listmonk-db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: listmonk
POSTGRES_PASSWORD: listmonk
POSTGRES_DB: listmonk
volumes:
- listmonk-pg:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U listmonk"]
interval: 5s
timeout: 5s
retries: 12
volumes:
listmonk-pg:
Want a guided install instead? caniselfhostit.com/mailchimp has AI-agent prompts that assume a bare machine — that's their half of the stool, and it's good.
FULL TIMED LOG
# Timed setup log: Mailchimp → listmonk **Protocol:** v1 · **Verified by:** zernonia · **Date:** 2026-08-10 **Assistant:** claude-code · **Environment:** containerized runner, 2 vCPU class, Docker 29.3 / Compose v5.1 ## Timeline | Step | Time | |---|---| | Read upstream docs, draft compose with healthcheck | ~20 min | | **Boot: all services healthy in 16 s (measured, `compose up --wait`)** | — | | Endpoint-level workflow check (login/health/API serve) + re-run from clean volumes | ~20 min | | **Total: ~60 min** | | Boot and endpoint checks are machine-verified; `setup_min` is the wall-clock total for this session including authoring, diagnosis and re-runs. Endpoint-level ≠ full human UI workflow — dispute anything that doesn't reproduce (CONTRIBUTING.md). ## What broke - --install must run before first serve (the compose command chains it idempotently) - Sending anything real requires an SMTP relay — factor ~$1-5/mo for SES into your own math ## Verdict-relevant notes - Verdict assumes the Essentials list-size tier; large lists change both sides of the equation.