Star
Compare · NotifKit vs Novu

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)
Interactive Pricing & Volume Calculator
NotifKit
$170/mo
~$15/mo infra + ~$155/mo prov
vs
Novu
$405/mo
$250/mo SaaS + ~$155/mo prov
250,000 / mo
10k 50k 250k 1M 3M 5M
Delivery provider
Includes ~$155/mo provider transport (Email + FCM Push · $0) + ~$15/mo self-hosted infra

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

Choose Novu if
  • 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.
Choose NotifKit if
  • 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).