NotifKit vs Novu
Novu is an open-source notification system built around a web portal and a microservices stack that needs MongoDB. NotifKit is a lean notification engine on PostgreSQL + Redis, for developers who want code-first workflows, a small infrastructure footprint and native AI integration.
The short version
Novu suits organisations that want a full web dashboard where product and marketing managers configure workflows visually. Self-hosting it means running a heavy microservices deployment (API, Worker, Web Dashboard, Ingestion, MongoDB cluster, Redis, WebSocket gateway).
NotifKit is a minimal, fast engine for developers, running on the stack they already have: PostgreSQL + Redis. Workflows live in code, versioned in Git, with under 150MB idle RAM and a native Model Context Protocol (MCP) server for AI coding assistants.
Feature comparison
| Capability | Novu | NotifKit |
|---|---|---|
| Primary Database & State Storage | Dedicated MongoDB 5+ cluster required for all subscriber profiles, workflows, and message states. | Standard relational PostgreSQL 14+ tables with SQL migrations; Redis 7+ Streams for high-throughput message queuing. |
| Self-Hosted Infrastructure Footprint | Heavy multi-service NestJS cluster: API, Worker, Ingestion service, WebSocket Gateway, Web Portal Dashboard, Redis, and MongoDB (requires 4GB–8GB+ RAM). | Lean stateless worker binary (<150MB RAM idle); runs on existing database and a single $10 VPS or Docker container. |
| Workflow Authoring & Execution | @novu/framework bridge architecture: exposes a serve() HTTP endpoint called remotely via webhook round-trips for every step, plus web dashboard visual editor. |
Pure in-process TypeScript DSL (workflow()) with step.notify(), step.wait(), step.waitForEvent(), and memoised step.run() side effects (no external bridge tunnels or webhook callback loops). |
| Workflow State Durability | Coordinated via HTTP callbacks to your bridge endpoint; state tracked in MongoDB. | Each step outcome is committed to PostgreSQL before the next step executes; workflows resume cleanly after restarts or redeploys with zero duplicate sends. |
| In-App Notification Feed Component | Pre-built drop-in UI: @novu/inbox component for React, Vue, Angular, and WebComponents with real-time WebSockets and unread notification bell. |
Backend delivery only: Dispatches to webhook or queries PostgreSQL directly; no pre-packaged frontend UI widget. |
| Multi-Channel Delivery & Fallback | Step conditions and channel steps configured in visual workflow DAG or framework code. | Native channel arrays (channels: ["push", "sms", "email"]) with fallback: true for sequential failover or false for parallel multicast. |
| User Preferences & Quiet Hours | Subscriber preference center widget with category toggles. | PostgreSQL user JSON with IANA timezone quiet hours (quietHours: [{ start: "22:00", end: "08:00" }] with midnight wrap support), channel toggles, and topic opt-outs. |
| Template System & Personalization | Visual template builder in web dashboard + React Email integration. | Code-first Handlebars templates versioned in Git, validated against JSON Schema, with optional LLM aiPrompts for send-time dynamic copy generation. |
| Dead-Letter Queue & Incident Replay | Activity Feed in web dashboard; manual status inspection. | Dedicated /v1/dlq API with programmatic replay (POST /v1/dlq/{id}/replay), Prometheus /metrics, and local dashboard. |
| AI / IDE Coding Assistant Tooling | Agent Communication Infrastructure (ACI) & Novu Connect for chat/email agents, with Claude managed agents, AI SDK, LangChain, and MCP tools. | Built-in Model Context Protocol (MCP) server for Claude, Cursor, and Antigravity IDEs to inspect health, preview templates, and triage DLQ directly inside your editor. |
| Custom Transports & Extensibility | Community provider integrations managed inside monorepo. | Minimal TypeScript Transport interface (send(task): Promise<DeliveryResult>); register custom internal SMS/webhooks via registerTransport(). |
| Open Source License | MIT (open-core; proprietary commercial license for enterprise modules). | MIT / Apache 2.0 (fully permissive commercial license; zero restrictions on internal or commercial use). |
Pricing & total cost of ownership (TCO)
Teams often overlook two costs: database/cluster operational maintenance and underlying transport deliverability (Twilio SMS, Resend/SES Email, FCM Push).
| Cost dimension | Novu Cloud (SaaS) | Novu Self-Hosted | NotifKit (Self-Hosted) |
|---|---|---|---|
| Software license | Free (10k runs/mo) → Pro ($30/mo, 30k runs) → $250/mo (Team, 250k runs) + overages | Free & Open Source ($0) | $0 Free & Open Source |
| Team seat taxes | Free plan: 3 members. Pro ($30/mo plan): 7-day retention. Team ($250/mo plan): unlimited members | Unlimited internal users ($0) | Unlimited seats ($0) |
| Infrastructure stack | Managed cloud multi-tenant | API, Workers, Web UI, MongoDB cluster, Redis, WebSocket gateway | PostgreSQL + Redis (uses your existing stack) |
| Idle RAM footprint | N/A | 4 GB – 8 GB+ RAM across microservices | < 150 MB RAM (single lean binary/process) |
| Direct provider bills | Twilio, Resend, SES, FCM direct | Twilio, Resend, SES, FCM direct | Twilio, Resend, SES, FCM direct (0% markup) |
| Monthly infrastructure / platform | $30–$250/mo (Pro / Team plan) + $0.001–$0.0012/run overage | $48 – $150/mo (8GB–16GB VPS for microservices + MongoDB) | $10 – $20/mo (<150MB binary on existing Postgres + Redis) |
Total cost of ownership by send volume
Monthly TCO by volume, assuming a standard channel mix (10% SMS @ $0.0079 via Twilio, 70% Email @ $0.0001–$0.0008 via Resend/SES, 20% Push @ $0 via FCM), Novu Cloud's Pro tier ($30/mo base for 30k runs + $1.20/1k overage) at 50k sends, and Team tier ($250/mo including 250k events + $0.001/msg overage) above that:
| Monthly volume | Direct providers (Twilio/Resend/FCM) | Novu Cloud (SaaS) TCO | NotifKit (Self-hosted) TCO | Annual savings with NotifKit |
|---|---|---|---|---|
| 50,000 sends | ~$43 / mo | $97 / mo ($54 Pro SaaS + $43 prov) | $53 / mo ($10 infra + $43 prov) | $528 / yr (45% saved) |
| 250,000 sends | ~$218 / mo | $468 / mo ($250 SaaS + $218 prov) | $233 / mo ($15 infra + $218 prov) | $2,820 / yr (50% saved) |
| 1,000,000 sends | ~$860 / mo | $1,860 / mo ($1,000 SaaS + $860 prov) | $895 / mo ($35 infra + $860 prov) | $11,580 / yr (52% saved) |
| 5,000,000 sends | ~$4,300 / mo | $9,300 / mo ($5,000 SaaS + $4,300 prov) | $4,320 / mo ($20 infra + $4,300 prov) | $59,760 / yr (54% saved) |
* Self-hosting both? Novu Community Edition's licence is $0, but its 6 NestJS microservices and MongoDB need an 8GB–16GB RAM server (~$48–$150/mo in VPS hosting). NotifKit runs in <150MB idle RAM on your existing PostgreSQL with a $10–$20/mo worker, saving hundreds in memory and database complexity.
Key differences deep-dive
1. Database alignment: PostgreSQL vs MongoDB
Most web backends already run PostgreSQL. Novu means provisioning, monitoring, backing up and securing a separate MongoDB cluster just for notification state.
NotifKit uses PostgreSQL as its system of record: logs, preferences, contacts and workflow state, with standard schema migrations. Queueing and worker coordination happen in Redis Streams.
2. Native Redis Streams execution vs external bridge endpoints
Novu Framework uses an external HTTP bridge: your app exposes a serve() endpoint, and
Novu's cloud/backend calls it back on every workflow step.
NotifKit runs workflows inside your infrastructure on Redis Streams and PostgreSQL state machines: no bridge round-trips, tunnels or webhook callback vulnerabilities. Workflows survive process restarts and node redeploys automatically:
import { workflow } from "notifkit";
workflow("security-alert", async ({ step, event }) => {
const { ip, device } = event;
// 1. Send push alert immediately
await step.notify({
template: "new-login-push",
channels: ["push"],
data: { ip, device },
});
// 2. Wait 10 minutes for user confirmation
const acknowledged = await step.waitForEvent("login.confirmed", {
timeout: "10m",
match: { userId: event.user.id },
});
// 3. If unacknowledged, escalate to SMS and notify security Slack channel
if (!acknowledged) {
await step.notify({
template: "urgent-login-sms",
channels: ["sms"],
priority: "high",
});
await step.notify({
user: "usr_security_ops",
template: "suspicious-activity",
channels: ["slack"],
data: { userId: event.user.id, ip, device },
});
}
});
3. Built for AI coding assistants via Model Context Protocol (MCP)
NotifKit ships a Model Context Protocol (MCP) server. AI agents (Claude, Cursor, Copilot, Antigravity) can check system health, trigger test workflows, preview templates and triage dead letters from your IDE, without a web dashboard.
When to choose what
- Non-technical team members need a web portal to manage workflows visually.
- Your infrastructure team already runs MongoDB clusters.
- You want a hosted cloud service (Novu Cloud) with an integrated web UI.
- You want a lean, Postgres-native engine that fits your existing database stack.
- You prefer code-first workflows in TypeScript versioned in Git.
- You want minimal compute overhead (<150MB RAM) and instantaneous local testing.
- You want native AI integration via the Model Context Protocol (MCP).