Novu
Open-source notification infrastructure for developers. Unify in-app, email, SMS, push, and Slack notifications with a single API, workflow engine, and self-hostable dashboard.
Why Novu?
Multi-channel notifications (email + in-app + push + SMS) from one API
You want user notification preferences and digests built-in
Self-hosting is a requirement — Novu is fully open-source
Signal Breakdown
What drives the Trust Score
Download Trend
Last 12 months
Tradeoffs & Caveats
Know before you commitEmail-only notifications — Resend is simpler and cheaper
Simple SMS — Twilio is more reliable
Enterprise scale — Novu's managed offering is still maturing
Pricing
Free tier & paid plans
30k events/mo free
From $250/mo
Self-hostable for free
Alternative Tools
Other options worth considering
All-in-one customer messaging platform for push notifications, in-app messages, email, and SMS. Industry-leading free web push tier makes it the go-to for early-stage products.
Often Used Together
Complementary tools that pair well with Novu
Learning Resources
Docs, videos, tutorials, and courses
Get Started
Repository and installation options
View on GitHub
github.com/novuhq/novu
npm install @novu/nodeQuick Start
Copy and adapt to get going fast
import { Novu } from '@novu/node';
const novu = new Novu(process.env.NOVU_API_KEY!);
// Identify subscriber
await novu.subscribers.identify('user-123', {
email: 'alice@example.com',
firstName: 'Alice',
phone: '+15558675310',
});
// Trigger multi-channel notification
await novu.trigger('order-update', {
to: { subscriberId: 'user-123' },
payload: { orderId: 'ORD-456', status: 'shipped' },
});Code Examples
Common usage patterns
In-app notification feed
Show real-time in-app notifications with Novu
// React component using @novu/notification-center
import { NovuProvider, NotificationBell, PopoverNotificationCenter } from '@novu/notification-center';
export function NotificationWidget({ userId }: { userId: string }) {
return (
<NovuProvider
subscriberId={userId}
applicationIdentifier={process.env.NEXT_PUBLIC_NOVU_APP_ID!}
>
<PopoverNotificationCenter>
{({ unseenCount }) => <NotificationBell unseenCount={unseenCount} />}
</PopoverNotificationCenter>
</NovuProvider>
);
}Digest workflow
Batch notifications into a daily digest
// In Novu dashboard: create workflow with Digest step
// Digest accumulates events for 24 hours then sends one email
// Trigger individual events (they get batched):
await novu.trigger('comment-digest', {
to: { subscriberId: req.user.id },
payload: {
commenter: 'Bob',
postTitle: 'My Article',
comment: 'Great post!',
},
});
// User receives one email per day with all comments summarizedCommunity Notes
Real experiences from developers who've used this tool