Intelligent routing
Pick channels by user preference, locale, urgency, or quiet hours. notifkit chooses the order and skips what won't land.
6 channels, 1 API call. Completely free and open-source. We handle routing, retries, and fallbacks so you can focus on shipping features that boost retention and recover lost revenue.
You start with a simple email API. Then product asks for SMS. Then push. Suddenly you're debugging rate limits, managing 5 different SDKs, and writing custom retry queues. notifkit handles the nightmare so you can focus on shipping features that drive revenue.
Pick channels by user preference, locale, urgency, or quiet hours. notifkit chooses the order and skips what won't land.
Exponential backoff per provider. Set fallback: true and a dead channel rolls to the next one
automatically.
Write once with variables. notifkit renders per channel — rich HTML for email, plain text for SMS, blocks for Discord.
Delivery, open, and failure rates per channel and per template. Query the log or stream it to your warehouse.
Fire on an event, wait, branch, escalate. Define multi-step sequences without standing up a queue.
Stop sending generic alerts. Pass a cohort or user context, and the built-in AI dynamically rewrites and translates your templates for maximum engagement.
With a global cart abandonment rate of 70%, single-channel emails aren't enough. Use workflows to automatically escalate across channels—studies show omnichannel recovery recaptures up to 15% of lost revenue, with SMS boasting a 58% recovery rate.
workflow("cart-abandoned", ({ step }) => { step.notify({ channels: ["push"], template: "cart-nudge" }) step.wait("2h") // Escalate to a higher-friction channel if ignored step.notify({ channels: ["sms"], template: "cart-discount" }) })
Omnichannel apps retain 91% more customers. Keep users engaged with smart, personalized notifications—which drive up to 190% higher 90-day retention and 4x higher reaction rates compared to generic blasts.
await notify({ user: "usr_123", template: "weekly-digest", channels: ["email", "push"], // Automatically sends when the user is most likely to open smart_delivery: true })
Try the cheap channel first, escalate to the reliable one only if it fails. One flag turns the chain on.
await notify({ user: "usr_123", template: "auth-code", data: { code: "88421" }, channels: ["push", "sms", "whatsapp"], fallback: true // stop at first delivery })
Send, wait, then escalate if the user hasn't acted. No cron, no queue, no state machine to babysit.
workflow("invoice-overdue", ({ step }) => { step.notify({ channels: ["email"] }) step.wait("24h") step.notify({ channels: ["sms", "whatsapp"] }) step.wait("48h") step.escalate("#billing-alerts") // discord })
One source of truth. notifkit renders the right shape for each channel from the same payload.
await notify({ user: "usr_123", template: "order-shipped", data: { name: "Aanya", tracking: "1Z999AA", eta: "Fri, 27 Jun" } }) // HTML for email, plain text for SMS
Pass a cohort or rich context, and let our AI dynamically rewrite the template's tone, language, and length for each user before delivery.
await notify({ user: "usr_123", template: "subscription-renewed", channels: ["email", "sms"], context: { cohort: "high-ltv-power-user", recent_action: "upgraded-plan" }, ai_personalize: true })
No cap, we deleted the pricing table. Notifkit is 100% free and open source because gatekeeping infrastructure is cringe. Host it yourself, read the code, and keep your money. W vibes only.
fallback: true, notifkit advances to the next channel and stops at the first
confirmed delivery.Drop in your email and be the first to know when we launch the private beta.