← back
Compare · NotifKit vs Courier

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 notification engine that runs inside your own infrastructure (PostgreSQL + Redis) with zero per-message markup, complete data privacy, and native AI integration.

The short version

If your company requires non-technical marketing staff to visually design transactional email templates inside a hosted web app and you are comfortable routing customer PII through a third-party cloud, Courier is built for that workflow.

If you are an engineering team that treats notifications as critical product infrastructure, wants workflows versioned in Git, refuses to pay a SaaS tax on every message, and must keep user data inside your private VPC, NotifKit gives you 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)

Courier charges a per-message platform toll on top of your notification volume once you exceed their free tier. Courier's standard self-serve pricing charges $0.005 per notification after the initial 10,000 free sends, or requires negotiation for enterprise contracts. You also pay underlying provider fees (Twilio, Resend, AWS SES, APNs/FCM) directly on top of Courier's SaaS 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 – $80/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

Here is the complete Total Cost of Ownership across volumes, incorporating 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,380 / mo ($80 infra + $4.3k prov) $149,040 / yr (74% saved)

Key architectural differences

1. Data privacy and compliance

Courier is a multi-tenant cloud service. To send a notification, your application must transmit the recipient's email address, phone number, device push tokens, and the interpolated message payload (which often contains billing amounts, reset tokens, or personal health/financial data) to Courier's servers.

NotifKit runs in your private network. Customer profiles, contact endpoints, and notification logs remain inside your PostgreSQL database. When a delivery occurs, NotifKit speaks directly to the upstream gateway (e.g. Resend, Twilio, FCM) over TLS. No third-party data processor agreement (DPA) or external data retention audit is required.

note

For teams subject to HIPAA, GDPR, or strict banking regulations, self-hosting eliminates the compliance overhead and security review cycles required for SaaS notification aggregators.

2. Code-defined workflows vs cloud automation graphs

Courier coordinates multi-channel sequences using Courier Automations (a node-based DAG builder and JSON schema API). While visual automation builders appeal to marketing and non-technical stakeholders, they create synchronization drift between application state and notification logic.

In NotifKit, workflows are defined directly in TypeScript code and executed by durable Redis Stream state machines. Workflows can sleep for days, wait for external 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 platforms support the Model Context Protocol (MCP) for AI coding assistants like Claude Code and Cursor. However, Courier's MCP server interacts with its remote multi-tenant cloud API, while NotifKit's built-in MCP server runs locally inside your private network, allowing coding assistants to inspect PostgreSQL recipient records, preview Handlebars rendering, and query Redis Stream queues directly without transmitting operational data to a third party.

When to choose what

Choose Courier if
  • 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 transmitting customer PII to external SaaS vendors.
Choose NotifKit if
  • You want zero per-message SaaS markups 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.