Documentation

Broadcast overview

One engine, four channels — email, SMS, WhatsApp, and push — with shared templates, delivery tracking, and usage metering.

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-sms flow.
  • 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) feed broadcast_delivery records 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

CollectionPurpose
email_broadcastA campaign — subject, content, sender account(s), recipient method
email_accountSender identity ([email protected]) plus health and warmup state
domain_registrationDomain status with the email provider — DKIM, SPF, MX
broadcast_deliveryOne row per (broadcast × recipient): status, opens, clicks, bounces
email_healthDaily 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

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:

POST/org-management/services/bulk-email/agreement/acceptJWT

After 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.