📬 Infrastructure Guide

One Listmonk.
Unlimited Niche Sites.

How a single self-hosted instance powers newsletters, contact forms, and outreach for your entire portfolio of niche websites.

50+
Sites Supported
1
Listmonk Instance
€3.29
Per Month
50k+
Emails / Day (SES)

01 — Architecture

How Everything Connects

Every niche site talks to the same Listmonk instance. No per-site email backend needed.

sitzio.de
lte-speedtest.com
niche-3.com
niche-4.com
+46 more...
POST /api/public/subscription
📬
Listmonk
mail.lte-speedtest.com
🐘
PostgreSQL 16
Subscribers & Lists
SMTP :465 SSL
☁️
AWS SES
eu-central-1 · lte-speedtest.com
Delivered
📥
Subscriber Inboxes
Gmail · Outlook · etc.
🔒 Caddy (TLS)
Auto Let's Encrypt
🖥 Hetzner VPS
Debian 13 · 2 vCPU / 3.7 GB
🐳 Docker Compose
Listmonk + PostgreSQL

02 — Subscriber Flow

From Signup to Subscriber

Listmonk handles the entire double opt-in process automatically. You only build the signup form.

1
You build this

User submits email

Frontend calls POST /api/public/subscription with email and the site's list UUID. No auth needed.

2
Automatic

Confirmation email sent

Listmonk immediately sends a "please confirm your email" message via SES. Subscriber status is unconfirmed.

3
Automatic

User clicks confirm link

Listmonk verifies the token, marks subscriber as confirmed, and sends a welcome email (if configured).

4
You do this

Send campaigns

Create a campaign in the Listmonk UI, pick the site's list, pick the branded template, write content, send.

5
Automatic

Unsubscribe handled

Every email includes an unsubscribe link. Listmonk processes it, removes from list, never emails again.

TypeScript · Frontend Subscribe
// Same code for every site
// Only list_uuids differs

const subscribe = async (email: string) => {
  const res = await fetch(
    'https://mail.lte-speedtest.com'
    + '/api/public/subscription',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        email,
        list_uuids: [
          '<this-site-list-uuid>'
        ]
      })
    }
  );
  if (res.ok) return 'check-inbox';
  throw new Error('subscribe failed');
};
Bash · Create a new site list
curl -u "outreach-api:<token>" \
  -X POST \
  https://mail.lte-speedtest.com/api/lists \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-site.com Newsletter",
    "type": "public",
    "optin": "double",
    "tags": ["my-site.com"]
  }'

# Save the returned uuid → use in frontend

03 — Multi-Site Model

One Instance, Many Sites

Each site gets its own mailing list. Subscribers never mix. Campaigns target exactly one list.

Mailing Lists
sitzio.de
lte-speedtest.com
niche-site-3.com
niche-site-4.com
+ 46 more lists
sitzio.de Newsletter
0
Subscribers
double
Opt-in
public
Type
List UUID: 932770eb-bc02-49cc-a8b7-...
Use this UUID in the sitzio.de subscribe form
Active
GDPR Compliant Double Opt-in
🔀

Zero Cross-Contamination

A subscriber on sitzio.de only gets sitzio.de campaigns. Campaigns target exactly one list. No accidental blasts to the wrong audience.

🎨

Per-Site Branding

Each site gets its own email template — colors, logo, tone. The campaign engine picks the right template automatically.

🔑

One API, All Sites

The same outreach-api token works for everything. Or create per-site API users in Settings → Users for isolation.

3 Steps Per New Site

Create list via API, copy UUID into the frontend subscribe form, done. No new servers, no new credentials, no configuration.


04 — Contact Form

Contact Form Flow

Contact forms aren't newsletter functions — they route through the auth-server backend, then notify you via Listmonk transactional email.

1
User submits contact form
Name, email, message → frontend validates first
2
Auth-server: POST /api/contact
Validates input, sanitizes HTML, checks email format
3
Saved to SQLite
contact_submissions table with timestamp
4
Admin notification via Listmonk /api/tx
Transactional email → hi@adeelafz.al with form data
5
Return { success: true } to frontend
UI shows "Nachricht gesendet!" confirmation
Bash · Transactional Email
# Admin notification from contact form
curl -u "outreach-api:<token>" \
  -X POST \
  https://mail.lte-speedtest.com/api/tx \
  -H "Content-Type: application/json" \
  -d '{
    "subscriber_email": "hi@adeelafz.al",
    "template_id": <contact-template-id>,
    "subject": "New Contact: sitzio.de",
    "data": {
      "name": "John Doe",
      "email": "john@example.com",
      "message": "Hello..."
    }
  }'

# Response: {"data": true}

05 — API Reference

Key Endpoints

Base URL: https://mail.lte-speedtest.com/api/ · Auth: Basic outreach-api:<token>

Method Endpoint Auth Use Case
POST /api/public/subscription
None
Frontend subscribe form (all sites)
POST /api/tx
Required
Contact form admin notification
POST /api/lists
Required
Create list for new site
GET /api/lists
Required
View all site lists
GET /api/subscribers
Required
View / search subscribers
POST /api/campaigns
Required
Create a newsletter campaign
PUT /api/campaigns/:id/status
Required
Start, pause, or cancel campaign
POST /api/templates
Required
Create branded email template

06 — Email Delivery

AWS SES — Sending Pipeline

All emails go through SES in eu-central-1. SMTP connects via SSL on port 465 from the Listmonk container.

Item Status Notes
SES Account Mode
Sandbox
Production access pending — case #177579845700418
Daily Send Limit
200/day
Fine for testing; jumps to 50k+ after production approval
Verified Domain
lte-speedtest.com
DKIM enabled. Used as From domain.
From Address
Active
Listmonk <hi@lte-speedtest.com>
SMTP Connection
SSL :465
email-smtp.eu-central-1.amazonaws.com
Verified To Address
hi@adeelafz.al
Sandbox: can only send to verified addresses

07 — Compliance

GDPR — What's Handled Automatically

Listmonk covers the core compliance requirements. A few things remain your responsibility per site.

Auto Double Opt-in

Listmonk sends confirmation email, records consent timestamp, only activates after click. No code needed.

Auto Unsubscribe Links

Every campaign email includes an unsubscribe link via {{ UnsubscribeURL }}. Processed automatically.

Auto List-Unsubscribe Header

Added to all emails. Allows one-click unsubscribe directly from Gmail, Outlook, and other clients.

Your Task: Privacy Policy

Each site's /datenschutz page must mention newsletter data processing, Listmonk, and lte-speedtest.com as infrastructure.

Your Task: Form Link

Link to /datenschutz from every subscribe form and contact form. Required for lawful consent.

Your Task: Contact Data

Contact form submissions stored in SQLite. Mention this in privacy policy and define a retention period.


08 — Checklist

New Site Onboarding

Everything to do when adding a new niche site to the Listmonk infrastructure.

Create mailing list via API
POST /api/lists → save returned uuid
Add UUID to frontend subscribe form
list_uuids in the /api/public/subscription call
Create opt-in confirmation template
Branded, German, inline CSS, 600px max
Create welcome email template
Sent after subscriber confirms
Create campaign template
Newsletter layout matching site branding
Add /newsletter page to site
Standalone signup landing page
Add subscribe form to footer
Inline signup on every page
Add /kontakt page with contact form
Routes through auth-server → Listmonk /api/tx
Update /datenschutz
Mention Listmonk, newsletter processing, lte-speedtest.com
Link /datenschutz from subscribe & contact forms
Required for GDPR consent validity