Create powerful notification workflows and content using code
Create complex workflows, access local data, and reuse existing content templates with Novu Echo.

Code-based notification infrastructure for modern teams
Bring your own code
Define workflows as code, re-use components, and deploy confidently while developing in your IDE of choice.
Type Safe
Bring your own JSON schemas for full end‑to‑end validation across all your team members.
Powerful debugging
Rapidly identify and solve previously complicated content hydrating and notification routing issues.
GitOps Notifications
Experience seamless GitOps Notifications revolutionizing workflow management.
The last platform you will ever need for your notification needs.
Runs in your IT boundary
Deploy within your organization`s VPC, Kubernetes, serverless setups, or locally for secure data access.
Limitless integrations
Use ReactEmail, MJML, LaunchDarkly (and more!), and fetch content and values from anywhere.
Easy migration
Seamlessly integrate with existing services and legacy systems to facilitate adoption.
No-code editor
Product teams can manage workflow configurations without the risk of breaking notification flows.
Powerful debugging
Rapidly identify and solve previously complicated content hydrating and notification routing issues.
Speaks your language
Native developer experience and autocomplete in your code and IDE of choice.
Developer-first with product in mind
1import { Echo } from '@novu/echo';
2
3const echo = new Echo(alias) new Echo({ apiKey, ... opts }?: ClientOptions): EchoEcho, the Notifications as Code client.();
4
5const commentWorkflow = echo.workflow('comment-on-post', async (event(parameter) event: { environment: { ... }; inputs: { ... }; payload: { postId: string }; step: Step; subscriber: { firstName: string; ... };}The event that triggered the workflow.) => {
6 const inAppResponse = await event.step.inApp('notify-user', async () => ({
7 body: renderReactComponent(event.payload(property) payload: { postId: string }The payload for the event, provided during trigger.postId)
8 }));
9
10 const { events } = await event.step.digest('1 week');
11
12 await event.step(method) email: ChannelStep<{ body: string }, { seen: boolean; ... }>Send an email..email('weekly-comments', async (inputs) => {
13 return {
14 subject: `Weekly post comments (${events.length + 1})`,
15 body: renderReactEmail(inputs, events)
16 };
17 }, { skip: () => inAppResponse.seen(property) seen: booleanFlag indicating if the notification has been seen. });
18}, { payloadSchema: z.object({ postId: z.string() }) }
19);
20
21// Use the same familiar syntax to send a notification
22commentWorkflow.trigger(method) trigger: TriggerTrigger a notification workflow.({
23 to: { subscriberId: 'joe@acme.com' },
24 payload: { postId: '12345' }
25});



Integrates with anything
Built from scratch to integrate your existing tooling and content with the Novu Platform.
and literally anything else...
Complete control and flexibility
Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for Non-Technical users.
Read docs
Get started now
Create and send your first code-based notification in less than five minutes.