The Broadcast module sends bulk and transactional messages on every channel AppMint supports. Email, SMS, WhatsApp, and push notifications all share the same campaign model, the same template variables, and the same delivery log — so a multi-channel "abandoned cart" campaign reads as a single record, not four parallel ones.
What's in the box
- Email broadcasts — through SES, SendGrid, Mailgun, or Resend (configured via Upstream). Domain provisioning with SPF/DKIM/DMARC. Health monitoring per sender account. Sender rotation across accounts.
- SMS — through Twilio (also Vonage where configured). A2P 10DLC and toll-free verification handled via the Phone module's
register-smsflow. - WhatsApp — Twilio WhatsApp Business API. Per-template approval workflow.
- Push notifications — FCM (Android, web) and APNs (iOS). Topic broadcasts and per-device targeting.
- Delivery tracking — provider webhooks (
delivered,opened,clicked,bounced,complained) feedbroadcast_deliveryrecords and update CRM activities.
How it fits together
┌─ Email account(s) ─→ SES / SendGrid / Mailgun / Resend
Campaign / template ─┼─ Twilio account ───→ SMS, WhatsApp
└─ FCM / APNs ───────→ Push
│
└─ broadcast_delivery (per-recipient log) ─→ webhooks ─→ CRM activity
The campaign holds the content and the audience; per-recipient delivery rows hold status. Provider webhooks update those rows so you always know who got what.
Models
| Collection | Purpose |
|---|---|
email_broadcast | A campaign — subject, content, sender account(s), recipient method |
email_account | Sender identity ([email protected]) plus health and warmup state |
domain_registration | Domain status with the email provider — DKIM, SPF, MX |
broadcast_delivery | One row per (broadcast × recipient): status, opens, clicks, bounces |
email_health | Daily snapshot of an account's reputation, bounce rate, spam rate |
The same machinery handles SMS and push — the email_broadcast record's channel field selects the transport.
Where to go next
- Email deliverability — domains, SPF, DKIM, DMARC
- SMS and WhatsApp — Twilio messaging service
- Push notifications — FCM and APNs
- Campaigns and templates — the send pipeline
- Delivery tracking — webhooks and bounce handling
Service agreement gating
Bulk email requires an explicit service agreement before any send is allowed. The first time you POST /broadcast/{id}/send an org without one accepted, the response is 402 Payment Required with an acceptUrl pointing at:
/org-management/services/bulk-email/agreement/acceptJWTAfter acceptance, subsequent sends proceed. The acceptance is recorded on the company record under data.serviceAgreements[].
Email is the most regulated channel — domain auth, suppression, agreement gating. SMS adds carrier registration. Push has the gentlest setup. Most setup time goes into email; the rest is configuration.