← back
Compare · NotifKit vs Novu

NotifKit vs Novu

Novu is an open-source notification system centered around a web portal and a multi-service microservices stack requiring MongoDB. NotifKit is a lean, PostgreSQL + Redis native notification engine built for developers who prioritize code-first workflows, minimal infrastructure footprint, and native AI integration.

The short version

Novu is designed for organizations that want a full-featured web dashboard and management portal where product and marketing managers can configure workflows visually. However, self-hosting Novu requires running and managing a heavy microservices deployment (API, Worker, Web Dashboard, Ingestion, MongoDB cluster, Redis, WebSocket gateway).

NotifKit is built for developers who want a minimalist, high-performance notification engine that runs on the stack they already use: PostgreSQL + Redis. Workflows live in code, versioned in Git, with an idle RAM footprint under 150MB and native Model Context Protocol (MCP) server support 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)

When calculating notification infrastructure costs, engineering teams frequently overlook the dual costs of 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 – $80/mo (<150MB binary on existing Postgres + Redis)

Total cost of ownership by send volume

The table below models true monthly TCO across notification scales, incorporating standard multi-channel deliverability (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) for 50k sends, and Team tier ($250/mo including 250k events + $0.001/msg overage) for larger volumes:

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,380 / mo ($80 infra + $4,300 prov) $59,040 / yr (53% saved)

* What if you self-host both? Novu Community Edition has a $0 software license, but running its 6 NestJS microservices and MongoDB database requires an 8GB–16GB RAM cloud server (~$48–$150/mo in VPS hosting). NotifKit runs in <150MB idle RAM on your existing PostgreSQL database with a lightweight $10–$80/mo worker, saving hundreds in operational memory and database complexity.

Key differences deep-dive

1. Database alignment: PostgreSQL vs MongoDB

Almost every modern web backend already operates a PostgreSQL database. Adopting Novu requires your infrastructure team to provision, monitor, back up, and secure a separate MongoDB cluster purely for notification state.

NotifKit uses PostgreSQL as its system of record. Notification logs, recipient preferences, contacts, and workflow states are stored directly in PostgreSQL with standard relational schema migrations. All high-speed queueing and worker coordination happens in Redis Streams.

2. Native Redis Streams execution vs external bridge endpoints

Novu Framework uses an external HTTP bridge architecture: your application exposes a serve() endpoint, and Novu's cloud/backend calls this bridge via webhook callbacks on every workflow step.

NotifKit executes workflows directly inside your infrastructure using Redis Streams and PostgreSQL state machines. There are no external bridge round-trips, tunneling setups, 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 includes a built-in Model Context Protocol (MCP) server. AI agents (Claude, Cursor, Copilot, Antigravity) can query system health, trigger test workflows, preview template interpolation, and triage dead letters directly from your IDE without switching context to a web dashboard.

When to choose what

Choose Novu if
  • You require a full-featured web portal for non-technical team members to manage workflows visually.
  • Your infrastructure team already operates and manages 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 into 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).