Journey 7: Email Campaigns

Listmonk broadcasts to 43K contacts and 5K emails

1
2
3
4
5
6
Step 1 Listmonk Admin

Campaign created in Listmonk

Campaigns are created in Listmonk — the self-hosted email marketing platform. Six design variations are available: white/clean, cream/gold, navy, and three calendar-themed templates, each matching different campaign types and tone.

Gotcha: Oshun SMTP auth failing (535 error) — needs cPanel password reset. Gmail fallback available via smtp.gmail.com:587 using nexushub.ai@gmail.com.
Technical details
Template files
Oshun/email_previews/
SMTP
mail.oshunja.com:587 — user: karen@oshunja.com
Env var
SMTP_PASSWORD (NOT SMTP_PASS)
Step 2 Database

Audience segmented

Two major lists are available: 5,082 email addresses and 43,090 phone numbers (used for WhatsApp broadcast). Campaigns can target all contacts, previous patients, contacts with a specific procedure interest, or a geographic area.

Technical details
Contact source
src/contacts.js — Listmonk subscribers synced from contacts table
Import script
scripts/import_oshun_phones.js
Source file
Oshun/Client list/oshun_emails_phones_only.csv
Database tables
contacts, Listmonk internal
Step 3 Listmonk → SMTP → Inboxes

Campaign sent

Listmonk sends in batches through SMTP, handling rate limiting and bounce processing automatically. Campaign 1 ("We Miss You") was sent 2026-03-28 — 2,554 of 5,082 emails were delivered.

Technical details
Sending
Listmonk handles batching, rate limiting, and bounce processing natively.
Campaign 1 result
2,554 / 5,082 delivered — sent 2026-03-28
Step 4 Listmonk Analytics

Delivery tracked

Listmonk tracks delivered, opened, clicked, bounced, and unsubscribed counts per campaign. These metrics feed into the weekly briefing report Karen generates for Oshun leadership.

Technical details
Weekly briefing
src/consolidator_briefings.js → sendDailyBriefing() includes email metrics
Database tables
content_distributions
Step 5 Email → Chatwoot → Karen AI

Responses routed to Karen

If a recipient replies to a campaign email, the response comes in through SMTP. For contacts already in Chatwoot, the reply appears in their existing conversation thread — Karen responds naturally in context, just like any other message.

Technical details
Inbound routing
Chatwoot email channel handles inbound routing — reply threads into the existing contact conversation.
Step 6 Listmonk

Unsubscribes handled

Every campaign email includes an unsubscribe link (required by law). Listmonk processes removals automatically — the contact is removed from future campaigns but their conversation history and contact record are fully preserved.

Gotcha: Campaigns 2 and 3 are still in DRAFT status and have not been sent.
Technical details
Unsubscribe handling
Listmonk built-in. Contact record in contacts table is NOT deleted — only removed from Listmonk subscriber list.