Newsletter Subscription Flow

Sitzio Newsletter
Subscription Flow

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.
Listmonk API
Listmonk
mail.lte-speedtest.com
Self-hosted newsletter engine. Manages subscribers, lists, and triggers double opt-in confirmation emails.
SMTP relay
Brevo SMTP
smtp-relay.brevo.com
Transactional SMTP relay. Delivers the opt-in confirmation email to the teacher's inbox.
delivers email
User Inbox
Confirmation email
Teacher receives the opt-in email. Clicking the confirmation link completes the subscription in Listmonk.
user clicks confirm link → Listmonk marks "confirmed"
Detailed walkthrough
What happens at each step
01
Frontend
Form Submission
User enters their email on the newsletter page and clicks "Jetzt anmelden". The React component validates the format client-side first.
POST /api/newsletter/subscribe
{ "email": "lehrer@schule.de",
  "siteKey": "sitzio" }
02
Auth Server
Guard Rails
The Hono server enforces rate limiting per IP (5 requests per 10 minutes) and validates the email format server-side. Bad requests get rejected early.
Rate limit: 5 req / 10min / IP
429 → rate_limited
400 → invalid_email
03
Listmonk
Subscriber Lookup
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.