NotifKit vs Courier
Courier is a hosted, multi-tenant notification platform built around visual designers and SaaS tiers. NotifKit is a self-hosted, code-first engine in your own infrastructure (PostgreSQL + Redis), with zero per-message markup, complete data privacy and native AI integration.
The short version
If non-technical marketing staff must design transactional email templates in a hosted web app, and you're comfortable routing customer PII through a third-party cloud, Courier is built for that.
If your engineering team treats notifications as critical infrastructure, wants workflows in Git, won't pay a SaaS tax per message, and must keep user data in your private VPC, NotifKit is a battle-tested engine you own completely.
Feature comparison
| Capability | Courier | NotifKit |
|---|---|---|
| Deployment & Data Residency | Closed-source multi-tenant cloud SaaS. Recipient emails, phone numbers, and notification payloads leave your VPC and reside on Courier AWS infrastructure. | 100% self-hosted inside your private network (Docker, K8s, bare metal). Zero external data egress; all PII and logs remain in your private PostgreSQL database. |
| Workflow Orchestration & DSL | Courier Automations: visual DAG node builder + JSON Automations API (steps: send, delay, filter, fetch-data, cancel). |
Code-first TypeScript DSL (workflow()) with step.notify(), durable step.wait(), step.waitForEvent(), and memoised step.run() side effects. |
| Workflow State Durability | Managed by Courier cloud state machines; run history and event tracking retained for 30–90 days on standard plans. | PostgreSQL durable step records + Redis Streams consumer groups; step outcomes are persisted permanently and survive container redeploys without state loss. |
| Template Authoring & Editing | Courier Elemental (JSON-based declarative notification specification with conditional logic) and Courier Studio drag-and-drop designer. | Git-versioned Handlebars templates validated against JSON Schema, with optional LLM aiPrompts for send-time copy generation. |
| In-App Notification Feed Component | Pre-built drop-in UI: Courier Elements SDK (embeddable React, iOS, Android, and Flutter notification inbox widgets with real-time WebSockets). | Backend delivery only: Dispatches to webhook or queries PostgreSQL directly; no pre-packaged frontend UI components. |
| Cross-Channel Fallback & Routing | Provider routing hierarchies and retry configurations defined in web dashboard. | Deterministic channel arrays in code: channels: ["push", "sms", "email"] with fallback: true for sequential rollover or false for parallel multicast. |
| User Preferences & Opt-Outs | Hosted subscription center widget with topic and channel preferences. | Full user preference engine: channel opt-outs, topic rules, and IANA timezone-aware quiet hours with midnight wrap. |
| Batching & Digest Windows | Native digest node in Courier Automations builder with timed aggregation windows. | Engine executes individual/scheduled sends via API or cron; digest queries and recipient aggregations are handled in application code and your database. |
| Dead Letter Queue & Incident Triage | Live delivery logs in web dashboard; manual per-notification retry. | Dedicated /v1/dlq API with programmatic replay (POST /v1/dlq/{id}/replay), Prometheus /metrics, and local dashboard. |
| AI / IDE Assistant Integration | Hosted Model Context Protocol (MCP) server for Claude Code and Cursor, Courier CLI, and REST APIs. | Built-in Model Context Protocol (MCP) server for Claude, Cursor, and Antigravity IDEs to inspect health, preview templates, and triage DLQ without leaving your editor. |
| Custom Transports & Extensibility | Proprietary closed-source cloud integration catalog; custom transports require enterprise plan or proxy webhooks. | Extensible TypeScript Transport interface (send(task): Promise<DeliveryResult>); register custom internal SMS/webhooks via registerTransport(). |
| Cost Structure at 1M Sends/Month | $4,950+/mo platform toll ($0.005/msg markup on 990k messages) + direct provider fees. | $0 platform toll forever; run on existing database and a $35/mo VPS + direct provider fees. |
Pricing & total cost of ownership (TCO)
Past the free tier, Courier charges per message. Standard self-serve pricing is $0.005 per notification after the first 10,000 free sends, or a negotiated enterprise contract. Provider fees (Twilio, Resend, AWS SES, APNs/FCM) come on top of Courier's platform fee.
| Cost element | Courier (SaaS) | NotifKit (Self-hosted) |
|---|---|---|
| Free tier allowance | 10,000 sends / mo included | Unlimited ($0) |
| SaaS platform fee | $0.0050 per send above 10k allowance | $0 (Free & Open Source forever) |
| Team member seats | Included on Developer / Standard | Unlimited seats ($0) |
| Self-hosted infrastructure | Managed by Courier cloud | $10 – $20/mo (PostgreSQL + Redis VPS) |
| Direct provider deliverability | Direct to Twilio, Resend, AWS SES, FCM | Direct to Twilio, Resend, AWS SES, FCM (0% markup) |
Monthly TCO by notification volume
Total cost of ownership by volume, with a standard delivery mix (10% Twilio SMS @ $0.0079, 70% Resend/SES Email @ $0.0001–$0.0008, 20% FCM Push @ $0):
| Monthly volume | Direct provider cost | Courier total monthly TCO | NotifKit total monthly TCO | Annual savings with NotifKit |
|---|---|---|---|---|
| 50,000 sends | ~$43 / mo | $243 / mo ($200 SaaS + $43 prov) | $53 / mo ($10 infra + $43 prov) | $2,280 / yr (78% saved) |
| 250,000 sends | ~$218 / mo | $1,418 / mo ($1,200 SaaS + $218 prov) | $233 / mo ($15 infra + $218 prov) | $14,220 / yr (84% saved) |
| 1,000,000 sends | ~$860 / mo | $5,810 / mo ($4,950 SaaS + $860 prov) | $895 / mo ($35 infra + $860 prov) | $58,980 / yr (85% saved) |
| 5,000,000 sends | ~$4,300 / mo | $16,800 / mo (~$12.5k SaaS + $4.3k prov) | $4,320 / mo ($20 infra + $4.3k prov) | $149,760 / yr (74% saved) |
Key architectural differences
1. Data privacy and compliance
Courier is a multi-tenant cloud service. Every send transmits the recipient's email address, phone number, push tokens and the rendered message (often billing amounts, reset tokens, or personal health and financial data) to Courier's servers.
NotifKit runs in your private network. Customer profiles, contacts and logs stay in your PostgreSQL database, and NotifKit talks directly to the upstream gateway (e.g. Resend, Twilio, FCM) over TLS. No third-party data processor agreement (DPA) or external retention audit needed.
Under HIPAA, GDPR or strict banking rules, self-hosting removes the compliance overhead and security reviews that SaaS notification aggregators require.
2. Code-defined workflows vs cloud automation graphs
Courier coordinates multi-channel sequences with Courier Automations (a node-based DAG builder and JSON schema API). Visual builders appeal to non-technical stakeholders but let notification logic drift out of sync with application state.
In NotifKit, workflows are TypeScript, run by durable Redis Stream state machines. They can sleep
for days, wait for domain events (like setup.completed), and resume cleanly across
worker restarts:
import { workflow } from "notifkit";
workflow("user-onboarding", async ({ step, event }) => {
// Step 1: Send welcome email immediately
await step.notify({
template: "welcome-email",
channels: ["email"],
data: { name: event.name },
});
// Step 2: Wait for 3 days (survives restarts and deploys)
await step.wait("3d");
// Step 3: Check if user completed setup; if not, send reminder
const completed = await step.waitForEvent("setup.completed", {
timeout: "2d",
match: { userId: event.user.id },
});
if (!completed) {
await step.notify({
template: "setup-reminder",
channels: ["push", "sms"],
fallback: true,
});
}
});
3. Local-first AI agent integration via Model Context Protocol (MCP)
Both support the Model Context Protocol (MCP) for assistants like Claude Code and Cursor. Courier's MCP server talks to its remote multi-tenant cloud; NotifKit's runs inside your private network, so assistants can inspect PostgreSQL recipient records, preview Handlebars rendering and query Redis Stream queues without sending operational data to a third party.
When to choose what
- Non-engineers need a visual drag-and-drop email builder.
- You do not want to manage PostgreSQL or Redis instances.
- Your notification volume is low and predictable.
- Your compliance policy allows sending customer PII to external SaaS vendors.
- You want no per-message SaaS markup and predictable infrastructure costs.
- Customer data privacy and regulatory compliance (HIPAA, GDPR) are paramount.
- You prefer writing workflows in code with Git version control and CI testing.
- You want seamless AI toolchain integration via native MCP.