When a teacher enters their email at sitzio.de/newsletter, the request flows through
four systems before a confirmation email arrives. Here is the complete data path from form submit to confirmed subscriber.
System topology
Frontend
sitzio.de/newsletter
React form collects email, POSTs { email, siteKey } to the auth server. Shows "Fast fertig!" on success.
POST /subscribe
Auth Server
Hono on Node.js
Rate limits by IP (5 per 10 min), validates email, routes siteKey to the correct Listmonk list.
The auth server queries Listmonk to check if this email already exists. If new, it creates a subscriber on list 3. If existing, it adds them to the sitzio list.
GET /api/subscribers?query=email POST /api/subscribers { lists: [3], preconfirm: false }
04
Listmonk
Double Opt-In Trigger
After creating or updating the subscriber, the auth server triggers Listmonk's built-in opt-in flow. This generates a unique confirmation link and queues the email.
POST /api/subscribers/42/optin → queues confirmation email
05
Brevo SMTP
Email Delivery
Listmonk hands the confirmation email to Brevo's SMTP relay for delivery. Brevo handles DNS authentication (SPF, DKIM) and inbox placement.
SMTP → smtp-relay.brevo.com:587 From: noreply@lte-speedtest.com To: lehrer@schule.de
06
Confirmed
User Confirms
The teacher opens the email and clicks the confirmation link. Listmonk flips the subscription status from "unconfirmed" to "confirmed" on the sitzio list.
Click confirm link → Listmonk subscription_status: "confirmed" list_id: 3 (sitzio)
Multi-tenant ready for 50+ sites
The siteKey parameter maps each niche website to its own Listmonk list.
The auth server reads LISTMONK_SITE_CONFIGS_JSON at startup — new sites are added
by appending to the config, zero code changes needed. If a subscriber already exists from another
niche (e.g. lte-speedtest.com), they are simply added to the new list instead of being duplicated.