NotifKit vs Knock
Knock is a cloud-hosted developer notification API billed on message volume and active users. NotifKit is a self-hosted notification engine you run inside your PostgreSQL + Redis infrastructure with zero usage fees, zero vendor lock-in, and full operational transparency.
The short version
Knock provides a polished developer-facing SaaS experience and hosted in-app notification components. However, as your application grows, Knock’s monthly subscription tiers and per-notification overage charges accumulate quickly, while your customer data and notification payloads reside on their servers.
NotifKit is designed for teams who want the power of a modern notification engine—cross-channel routing, per-user preferences, quiet hours, retries, and durable multi-day workflows—without the SaaS price tag or cloud dependency.
Feature comparison
| Capability | Knock | NotifKit |
|---|---|---|
| Hosting & Data Residency | Closed-source multi-tenant cloud API. Customer emails, phone numbers, recipient profiles, and message payloads are stored in Knock's cloud database. | 100% self-hosted on your own PostgreSQL 14+ and Redis 7+ instances. Zero external data egress; private VPC data sovereignty. |
| Workflow Engine & Primitives | Visual workflow builder + declarative JSON steps (channel, batch digest windows, delay, branch conditions, throttle). |
Code-first TypeScript DSL (workflow()) with step.notify(), durable step.wait(), step.waitForEvent(), and memoised step.run() side effects. |
| Workflow State Durability | Orchestrated in Knock cloud engine; execution tree and run logs retained for 30 days on Starter plan. | PostgreSQL durable step outcome tables + Redis Streams consumer groups; completed steps are committed before subsequent steps run and survive worker redeploys without state loss. |
| In-App Notification Feed Component | Pre-built drop-in UI: Full-featured @knocklabs/react, React Native, Swift, Kotlin, and Flutter feed & guide components with real-time WebSockets. |
Backend delivery only: Dispatches to webhook or writes to PostgreSQL; no pre-built frontend UI feed components. |
| Environment Sync & CI/CD | Knock CLI (@knocklabs/cli) to push/pull workflow JSON definitions and sync template directories across cloud environments. |
Standard Git version control. Workflows and templates live in your code repository and deploy alongside application releases. |
| Multi-Channel Routing & Fallback | Branching conditions configured in visual workflow builder or channel step definitions. | Deterministic channel arrays in code: channels: ["push", "sms", "email"] with fallback: true for sequential failover or false for parallel multicast. |
| User Preferences & Quiet Hours | Hierarchical PreferenceSets (category, workflow, and channel levels) with hosted preference center components. | PostgreSQL user JSON with IANA timezone quiet hours (quietHours: [{ start: "22:00", end: "08:00" }] with midnight wrap support), channel opt-outs, and address suppression lists. |
| Template System & Personalization | Visual template editor in web dashboard supporting Markdown, HTML, and Liquid syntax. | Handlebars templates versioned in Git, validated with JSON Schema, with optional LLM aiPrompts for dynamic copy generation. |
| Dead-Letter Queue & Incident Replay | Cloud workflow run debugger with manual retry buttons. | Dedicated /v1/dlq API with single-request replay (POST /v1/dlq/{id}/replay), Prometheus /metrics, and local dashboard. |
| Local Development & CI Testing | Requires cloud connectivity, Knock test environment, and outbound API calls. | Runs 100% offline via Docker Compose or in-memory provider-console transport for instant unit testing. |
| AI / IDE Coding Assistant Tooling | Hosted Model Context Protocol (MCP) server, Knock CLI for AI coding agents, in-workflow agent function, and Claude/Cursor Skills. | Built-in Model Context Protocol (MCP) server for Claude, Cursor, and Antigravity IDEs to inspect queues, preview templates, and triage DLQ without leaving your editor. |
| Pricing Model & Platform Markup | Starter tier: $250/mo base (50k sends) + $0.0050/send overage ($5,000/mo at 1M sends) on top of your underlying Twilio/SES bills. | $0 platform fee, $0 per-message toll, unlimited users/sends; runs on your own ~$15–$35/mo PostgreSQL + Redis infra. |
Pricing & total cost of ownership (TCO)
Knock offers a free Developer tier (up to 10k messages/mo), and a Starter tier at $250/month (including 50,000 messages/mo). Additional volume is billed at $0.0050 per message overage. In addition, Knock users still pay direct provider delivery bills to Twilio, Resend, AWS SES, and APNs/FCM.
| Cost dimension | Knock (Cloud SaaS) | NotifKit (Self-hosted) |
|---|---|---|
| Base platform fee | $250 / month (Starter plan, includes 50k msgs) | $0 (Open source) |
| Volume overages | $0.0050 / send above 50k allowance | $0.00 (0% markup) |
| Team member seats | Included (Unlimited members on Starter) | Unlimited seats ($0) |
| Self-hosted infrastructure | Managed by Knock 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
The table below models total monthly TCO across notification scales, including standard multi-channel deliverability (10% Twilio SMS @ $0.0079, 70% Resend/SES Email @ $0.0001–$0.0008, 20% FCM Push @ $0):
| Monthly volume | Direct provider cost | Knock total monthly TCO | NotifKit total monthly TCO | Annual savings with NotifKit |
|---|---|---|---|---|
| 50,000 sends | ~$43 / mo | $293 / mo ($250 base + $43 prov) | $53 / mo ($10 infra + $43 prov) | $2,880 / yr (82% saved) |
| 250,000 sends | ~$218 / mo | $1,468 / mo ($1,250 SaaS + $218 prov) | $233 / mo ($15 infra + $218 prov) | $14,820 / yr (84% saved) |
| 1,000,000 sends | ~$860 / mo | $5,860 / mo ($5,000 SaaS + $860 prov) | $895 / mo ($35 infra + $860 prov) | $59,580 / yr (85% saved) |
| 5,000,000 sends | ~$4,300 / mo | $13,300 / mo (~$9.0k SaaS + $4.3k prov) | $4,380 / mo ($80 infra + $4.3k prov) | $107,040 / yr (67% saved) |
Key differences deep-dive
1. Predictable economics without a notification tax
As modern products grow, notification volume scales exponentially: transactional receipts, authentication codes, comment mentions, digests, failed-payment recovery, and security alerts. With Knock, every notification adds to your monthly SaaS bill.
NotifKit removes the middleman toll. Because it runs on lightweight Redis Streams and PostgreSQL, delivering 100,000 notifications costs the exact same in software licenses as delivering 10,000,000: $0. You only pay direct provider rates (e.g. $0 via FCM push or direct Twilio carrier fees).
2. Durable workflows that survive deploys
Both Knock and NotifKit support multi-step sequences with delays, batching, and conditional branching. However, NotifKit executes workflows directly inside your infrastructure using Redis Streams and PostgreSQL locks:
import { workflow } from "notifkit";
workflow("payment-recovery", async ({ step, event }) => {
const { invoiceId, amount } = event;
// Day 0: Immediate email notification
await step.notify({
template: "invoice-failed",
channels: ["email"],
data: { invoiceId, amount },
});
// Wait 48 hours for retry or customer update
await step.wait("48h");
const paid = await step.waitForEvent("invoice.paid", {
timeout: "24h",
match: { invoiceId },
});
if (!paid) {
// Escalate to urgent SMS with fallback to push
await step.notify({
template: "urgent-payment-action",
channels: ["sms", "push"],
fallback: true,
priority: "high",
data: { invoiceId, amount },
});
}
});
If your workers restart during a deploy or a node crashes midway through a 48-hour wait, NotifKit's consumer groups and scheduled timers resume execution without dropping state or sending duplicate alerts.
3. Full data sovereignty & local observability
With Knock, querying past delivery logs or inspecting payload contents requires calling cloud APIs or browsing their web console.
With NotifKit, all delivery events, contact statuses, and dead letters live in your PostgreSQL database and
Prometheus metrics stream. You can inspect dead letters via the local dashboard or resolve silent failures
directly through SQL or the /v1/dlq endpoint.
When to choose what
- You want a fully managed SaaS API and prefer not to run any backend workers.
- You want pre-built hosted in-app notification feed UI components.
- Your budget comfortably accommodates usage-based SaaS scaling.
- You want total infrastructure ownership with zero per-message costs.
- User data, push tokens, and phone numbers must remain inside your VPC.
- You want full transparency into Redis Streams, worker scaling, and dead letters.
- You use AI coding agents and want native MCP tool integration.