Got it—let’s lock in a stack that’s cheap, reliable, and scales.
TL;DR (my recommended mix)
Email (primary): Amazon SES — industry-low pricing, rock-solid deliverability. ()
SMS (India-first, with global fallback): MSG91 or Exotel + Twilio fallback — Indian routes are far cheaper with local CPaaS; keep Twilio as a global safety net. (, , )
WhatsApp: Meta WhatsApp Business Platform (Cloud API) via 360dialog or Gupshup — direct Meta per-message pricing from July 1, 2025; BSP adds minimal or flat fees. (, , )
OTP: Prefer WhatsApp Authentication (cheaper in India) → fallback to SMS OTP (MSG91/Exotel), and always offer TOTP (Google Authenticator) as a no-SMS backup. ()
Why these choices (cost + reliability)
Email — Amazon SES
Base pricing ~$0.10 per 1,000 emails (volume discounts at scale). Extremely hard to beat on price. (, )
SMS — Local CPaaS first (MSG91 / Exotel), then Twilio
MSG91 and Exotel advertise India pricing optimized for large volumes (e.g., Exotel notes ≈₹0.18/SMS at 100k tier). Twilio India SMS is notably higher per message. Use local first, Twilio when you need global reach or specific features. (, , )
WhatsApp — Meta Cloud API + BSP
Meta moved to per-message billing from July 1, 2025 (utility/authentication very low in India); BSPs like 360dialog (license fee, no message markup) or Gupshup (tiny platform fee) are common choices. (, , , )
Reference price signals (so you can budget)
SES: $0.10/1k emails (volume discounts apply). ()
Twilio India SMS: page shows outbound India at a much higher unit price vs local CPaaS (context for “use as fallback”). ()
Exotel SMS (India): starts around ₹0.18 at 100k volume (indicative). ()
WhatsApp in India (2025): authentication/utility roughly ₹0.126–₹0.155 per message after pricing change (illustrative India rates). ()
Note: WhatsApp pricing is now per-message and varies by category (marketing vs utility vs authentication), country, and monthly volume tier per Meta’s official tables. Always check your exact destinations before campaigns. ()
Architecture blueprint (medium → large scale, multi-provider)
Provider-agnostic messaging service in your backend (Node/Go/PHP) exposing:
/send-email, /send-sms, /send-whatsapp, /send-otp
Implements strategy + routing rules (by country, channel, cost, historical delivery).
Routing policy examples
India: WhatsApp-Auth → SMS (MSG91/Exotel) → Email as last resort.
Global: WhatsApp (where opted-in) → Twilio SMS fallback.
Template & localization layer
Store templates (per channel) with variables, versioning & A/B; keep WhatsApp templates in sync with Meta approvals. ()
Retries, idempotency & webhooks
Message table with message_id, dedupe_key, status; retry w/ exponential backoff; webhook consumers for SES bounces/complaints, SMS DLRs, WhatsApp statuses.
OTP flow (best-cost)
Try WhatsApp “authentication template” → if undelivered in 10–20s, auto-fallback to SMS OTP → always offer TOTP enrollment (no per-message cost).
Compliance & trust
India DLT registration for SMS, proper sender IDs, double opt-in for WhatsApp, DMARC/DKIM/SPF for email (SES verifies domains). ()
Observability
Dashboards per channel: send volume, delivery, time-to-deliver, cost/1k, provider failure rates, WhatsApp template acceptance.
Cost guardrails
Quotas per org/country, campaign throttles, and real-time “cost per 1k” meters by channel to prevent bill shock.
Concrete vendor setup (what to implement)
Email: SES
Verify domains, set up DKIM/SPF/DMARC, use SES API/SMTP, enable feedback loops & suppression list. ()
SMS India: MSG91 or Exotel
Complete DLT registration, configure sender IDs, connect via REST; add Twilio as a global fallback path. (, , )
WhatsApp: Meta Cloud API via 360dialog or Gupshup
Create WABA, verify business, register numbers, add authentication/utility templates; understand new per-message pricing and monthly tiers. (, , )
Rollout checklist (fast path)
Pick defaults: SES (email), MSG91 (IN SMS), WhatsApp via 360dialog. Twilio only as fallback. (, , )
Provision & keys: store in a secret manager; rotate quarterly.
Templates: Create multilingual templates for OTP, signup, password reset, order updates; submit WhatsApp templates first. ()
DLT + compliance: register headers/sender IDs in India.
Webhook pipeline: ingest SES bounces/complaints, SMS DLRs, WhatsApp delivery/read; update status & retry rules.
Dashboards: cost/1k, delivery %, TTD (time-to-deliver), failures by provider; monthly review to rebalance routing.
User experience: prefer WhatsApp OTP in India → fewer failures & lower cost; show “Try SMS instead” button after 10–20s.
If you want, I can sketch a tiny provider-agnostic interface (PHP/Laravel or Node) and the DB schema for messages + a routing policy file so your team can plug in keys and go.