NotifKit vs SuprSend
SuprSend is a proprietary cloud notification platform with web campaign builders and usage-based tiers. NotifKit is an open-source, self-hosted engine on PostgreSQL and Redis Streams, with full queue visibility, modular TypeScript providers and no platform fees.
The short version
SuprSend targets product and growth teams managing multi-channel campaigns through a web UI. As a closed-source SaaS, it stores your customer data on its servers, its queues are black boxes, and volume spikes trigger costly overages.
NotifKit gives developers direct control. Queues, delivery logs, dead letters and preference rules live in your own database, with modular transports you can inspect and customise in TypeScript.
Feature comparison
| Capability | SuprSend | NotifKit |
|---|---|---|
| Hosting & Data Residency | Multi-tenant cloud platform SaaS. Customer contact records, emails, phone numbers, and notification payloads reside on SuprSend cloud infrastructure. | 100% self-hosted on your own PostgreSQL 14+ and Redis 7+ instances. Zero external data egress; private subnet compliance. |
| Workflow Authoring & Primitives | Visual node-based canvas (Triggers, Logic, Content, Vendors) with drag-and-drop delay, digest batching, and routing blocks. | Code-first TypeScript DSL (workflow()) with step.notify(), durable step.wait(), step.waitForEvent(), and memoised step.run() side effects. |
| Workflow State Durability | Managed by SuprSend cloud orchestration engine. | PostgreSQL durable step records + Redis Streams consumer groups; step outcomes are committed to disk before advancing, surviving worker restarts without duplicate sends. |
| In-App Notification Feed Component | Pre-built drop-in UI: Embeddable In-App Inbox SDKs for React, Flutter, React Native, Angular, iOS, and Android with multi-tab filtering. | Backend delivery only: Dispatches to webhook or queries PostgreSQL directly; no pre-built frontend UI widgets. |
| Template System & Localization | Unified visual multi-channel template composer with dynamic variables and multi-language translation support in web portal. | Git-versioned Handlebars templates with JSON Schema validation, CLI sync on deploy, and optional LLM aiPrompts for dynamic copy generation. |
| Channel Routing & Fallback | Vendor routing hierarchies configured inside SuprSend web console. | Deterministic channel arrays in code: channels: ["push", "sms", "email"] with fallback: true for sequential failover or false for parallel multicast. |
| Custom Transports & Extensibility | Restricted to SuprSend supported vendor catalog or generic webhook endpoints. | Minimal TypeScript Transport interface (send(task): Promise<DeliveryResult>); register any internal gateway or carrier via registerTransport(). |
| User Preferences & Quiet Hours | 3-level preference system (Global, Category, Channel-in-Category) with hosted preferences widget. | 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. |
| Dead-Letter Queue & Incident Replay | Cloud analytics dashboard and delivery logs. | Dedicated /v1/dlq API with single-request replay (POST /v1/dlq/{id}/replay), Prometheus /metrics, and local dashboard. |
| Local Development & CI Testing | Requires cloud sandbox environment, API keys, and outbound network calls. | Runs 100% offline via Docker Compose or in-memory provider-console transport for instant unit test suites. |
| AI / IDE Coding Assistant Tooling | Hosted MCP server (CLI), Agent SDK for runtime notifications, and plugins for Claude Code & Cursor Copilot. | 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 | Business tier: $250/mo base (50k sends) + $0.005/msg overage ($5,000/mo at 1M sends) on top of raw provider fees. | $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)
SuprSend has a free tier (10k notifications/mo), an Essentials plan at $100/month (50,000 notifications/mo included) and a Business plan at $250/month, with overage at $0.002/msg on Essentials and $0.005/msg on Business. Provider rates (Twilio SMS, Resend, AWS SES, FCM Push) come on top.
| Cost element | SuprSend (Cloud SaaS) | NotifKit (Self-hosted) |
|---|---|---|
| Base tier & overages | $100 – $250+/mo (Essentials / Business) | $0 (Open source forever) |
| Volume overages | $0.002 / msg (Essentials) · $0.005 / msg (Business) above 50k | $0.00 (0% markup, ever) |
| Seat licenses | Included in standard tiers | Unlimited seats ($0) |
| Self-hosted infrastructure | Managed by SuprSend cloud | $10 – $20/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
Monthly TCO by volume, with a standard channel mix (10% Twilio SMS @ $0.0079, 70% Resend/SES Email @ $0.0001–$0.0008, 20% FCM Push @ $0):
| Monthly volume | Direct provider cost | SuprSend total monthly TCO | NotifKit total monthly TCO | Annual savings with NotifKit |
|---|---|---|---|---|
| 50,000 sends | ~$43 / mo | $143 / mo ($100 base + $43 prov) | $53 / mo ($10 infra + $43 prov) | $1,080 / yr (63% 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 | $29,300 / mo (~$25k SaaS + $4.3k prov) | $4,320 / mo ($20 infra + $4.3k prov) | $299,760 / yr (85% saved) |
Key differences deep-dive
1. Transparent Redis Stream mechanics vs black-box SaaS
When delivery fails on a proprietary cloud aggregator, finding out why a message was dropped or delayed often means a support ticket or opaque webhook errors.
NotifKit's delivery engine runs across distinct Redis Streams:
Inbound Stream → Enricher → Outbound Stream → Delivery Worker → Gateway (Resend/Twilio/FCM)
↳ Retry / DLQ Stream
Priorities are separate physical streams (critical, normal,
low), so bulk campaigns can't starve urgent authentication codes. A permanently
failed delivery lands in the Dead-Letter Queue (/v1/dlq) to inspect, replay or debug.
2. Extensibility with modular TypeScript packages
Adding a transport or internal webhook needs no proprietary plugin marketplace. Every transport implements one TypeScript contract:
import type { Transport, NotificationDispatchedPayload, DeliveryResult } from "notifkit";
export class CustomSmsTransport implements Transport {
readonly channel = "sms" as const;
async send(task: NotificationDispatchedPayload): Promise {
if (!task.destination) {
return { success: false, error: "no destination resolved for sms" };
}
const content = task.renderedContent.content as Record;
const body = (content.text ?? content.body) as string | undefined;
if (!body) return { success: false, error: "template produced no text" };
const response = await fetch("https://internal-sms-gateway.company.com/send", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
to: task.destination,
message: body,
}),
});
if (!response.ok) {
return { success: false, retryable: response.status >= 500, error: await response.text() };
}
return { success: true, providerMessageId: (await response.json()).id };
}
}
When to choose what
- Product managers need a web UI to orchestrate marketing notification campaigns.
- You prefer not to maintain PostgreSQL or Redis infrastructure.
- Your compliance policy allows cloud SaaS data aggregation.
- You want complete data privacy and full infrastructure ownership.
- You want no per-notification SaaS markup.
- You want transparent queue mechanics, dead-letter recovery, and code-defined workflows.
- You want first-class AI coding agent integration via MCP.