You shouldn't need five integrations to send one notification.

Dispatch routes notifications across SMS, email, push, WhatsApp, webhooks, and in-app from a single API. Self-hosted. Open source core. No per-message fees on email.

MIT licensed Self-hosted No vendor lock-in

Why we built this

We were managing five provider integrations, three template systems, and zero visibility into what actually got delivered.

The cost problem

Twilio charges per SMS. SendGrid per email. At 50K notifications/day across a fintech app in Côte d'Ivoire, that's $3,000+/month just in messaging costs. We built our own Postal email engine and Pushly SMS gateway to cut that to near-zero for email and local-rate for SMS.

The integration problem

Every channel has its own SDK, its own webhook format, its own retry logic. Adding WhatsApp meant another integration, another dashboard, another thing to monitor at 2 AM. Dispatch is one API, one webhook format, one place to look.

The template problem

Product managers shouldn't need to file engineering tickets to change “Your payment of {{amount}} was received” to “You received {{amount}} from {{sender}}”. Templates live in Dispatch with variables, conditionals, and per-channel formatting — editable by anyone.

How it works

One endpoint. You pick the channels. Dispatch handles the rest.

POST to /v1/send with a template name, recipient, and channel list. Dispatch resolves the template, formats per channel, delivers with retries, and reports back via webhook.

Provider failover — if SMS fails via Pushly, reroute to Twilio backup
Batch send — up to 10K recipients per call with rate limiting
Delivery tracking — per-message status via webhook or polling
Template versioning — rollback bad changes without deploys
send-notification.ts
// One call. Six channels. Done.
const response = await dispatch.send({
  to: "user_awa_diallo",
  template: "payment-received",
  channels: ["sms", "email", "push"],
  data: {
    amount: "25,000 XOF",
    sender: "Moussa K.",
    ref: "TXN-8291"
  }
});

// response: { delivered: 3, failed: 0, latency: "142ms" }

Channels

Six channels. One API. Each with real infrastructure behind it.

Not just API wrappers. Dispatch includes a self-hosted Postal email engine (no SendGrid dependency) and Pushly SMS gateway for West African mobile networks.

Email

Postal engine, no per-send fees

SMS

Pushly gateway, local routes

Push

FCM + APNs, silent & visible

WhatsApp

Business API, templates

Webhooks

HMAC-signed, retry-safe

In-App

Real-time via WebSocket

notify.py
# Python
pip install dispatch-notify

from dispatch import Dispatch
client = Dispatch(api_key="dp_live_...")

client.send(
    to="user_123",
    template="kyc-approved",
    channels=["sms", "whatsapp"],
    data={"name": "Awa"}
)

SDKs

Node.js, Python, Go. Or just curl.

Type-safe SDKs with autocomplete for templates and channels. Or use the REST API directly — it's a single POST endpoint.

OpenAPI 3.0 spec — generate clients in any language
Webhook delivery receipts with HMAC signatures
Sandbox mode — test without sending real messages
Tenant isolation — per-org API keys and rate limits

Pricing

Self-host for free. Or let us run it.

The open source core is free forever. Managed hosting adds monitoring, backups, and support.

Self-Hosted

Free

forever, MIT license

  • All 6 channels
  • Unlimited notifications
  • Postal email engine
  • Template management
  • Community support
Deploy Yourself
Most teams choose this

Managed

$49/mo

+ usage for SMS/WhatsApp

  • Everything in Self-Hosted
  • Managed infrastructure
  • Automatic backups
  • Priority support
  • Delivery analytics dashboard
  • 99.9% uptime SLA
Start Free Trial

Enterprise

Custom

volume pricing

  • Everything in Managed
  • Dedicated infrastructure
  • Custom SLA
  • SSO & RBAC
  • On-premise deploy option
  • Dedicated account manager
Talk to Us

Read the docs. Deploy in an afternoon. Send your first notification tonight.

Docker Compose up and you're running. No signup required for self-hosted.