Novu

TextWithPicture

You can set many different options to change the side of text and image, as well as add or remove the button.

Learn more
Placeholder image

TextWithPicture

You can set many different options to change the side of text and image, as well as add or remove the button.

Placeholder image

TextWithPicture

You can set many different options to change the side of text and image, as well as add or remove the button.

Learn more
Placeholder image

TextWithPicture

You can set many different options to change the side of text and image, as well as add or remove the button.

Placeholder image

TextWithPicture

You can set many different options to change the side of text and image, as well as add or remove the button.

Placeholder image
Learn more

TextWithPicture

You can set many different options to change the side of text and image, as well as add or remove the button.

Placeholder image

SectionWithSmallIcons

  • Runs in your IT boundary

    Runs in your IT boundary

    Deploy within your organization`s VPC, Kubernetes, serverless setups, or locally for secure data access.

  • Limitless integrations

    Limitless integrations

    Use ReactEmail, MJML, LaunchDarkly (and more!), and fetch content and values from anywhere.

  • Easy migration

    Easy migration

    Seamlessly integrate with existing services and legacy systems to facilitate adoption.

  • No-code editor

    No-code editor

    Product teams can manage workflow configurations without the risk of breaking notification flows.

  • Powerful debugging

    Powerful debugging

    Rapidly identify and solve previously complicated content hydrating and notification routing issues.

  • Speaks your language

    Speaks your language

    Native developer experience and autocomplete in your code and IDE of choice.

SectionWithSmallIcons

True omnichannel notifications are just a few clicks away.

  • Runs in your IT boundary

    Runs in your IT boundary

    Deploy within your organization`s VPC, Kubernetes, serverless setups, or locally for secure data access.

  • Limitless integrations

    Limitless integrations

    Use ReactEmail, MJML, LaunchDarkly (and more!), and fetch content and values from anywhere.

  • Easy migration

    Easy migration

    Seamlessly integrate with existing services and legacy systems to facilitate adoption.

  • No-code editor

    No-code editor

    Product teams can manage workflow configurations without the risk of breaking notification flows.

  • Powerful debugging

    Powerful debugging

    Rapidly identify and solve previously complicated content hydrating and notification routing issues.

  • Speaks your language

    Speaks your language

    Native developer experience and autocomplete in your code and IDE of choice.

SectionWithSmallIcons

  • Runs in your IT boundary

    Runs in your IT boundary

    Deploy within your organization`s VPC, Kubernetes, serverless setups, or locally for secure data access.

  • Limitless integrations

    Limitless integrations

    Use ReactEmail, MJML, LaunchDarkly (and more!), and fetch content and values from anywhere.

  • Easy migration

    Easy migration

    Seamlessly integrate with existing services and legacy systems to facilitate adoption.

  • No-code editor

    No-code editor

    Product teams can manage workflow configurations without the risk of breaking notification flows.

  • Powerful debugging

    Powerful debugging

    Rapidly identify and solve previously complicated content hydrating and notification routing issues.

  • Speaks your language

    Speaks your language

    Native developer experience and autocomplete in your code and IDE of choice.

SectionWithBigIcons

SectionWithBigIcons

SectionWithBigIcons

  • Create content

    Help others discover Novu with videos and blog articles.

  • Present at meetups

    Share your experience and represent Novu in public meetups.

  • Report bugs

    Find and fix bugs in the code, then submit pull requests to resolve them.

Create account

Testimonials

Deploy within your organization's VPC, Kubernetes, serverless setups, or locally for secure data access. Integrate content across notification channels and use Novu to choose when and where to notify users. Rapidly identify and solve previously complicated content hydrating and notification routing issues.

Jesselynn Mah

Jesselynn MahKnowledgeTouch

SectionWithLogos

Built from scratch to integrate your existing tooling and content with the Novu Platform.

  • MJML
  • NestJS
  • Remix
  • Astro
  • Hono
  • Twilio Segment
  • React Email
  • LaunchDarkly
  • Express
  • Koa

SectionWithLogos

Built from scratch to integrate your existing tooling and content with the Novu Platform.

  • MJML
  • NestJS
  • Remix
  • Astro
  • Hono
  • Twilio Segment
  • React Email
  • LaunchDarkly
  • Express
  • Koa
  • Express
  • Koa

Events

Let’s say you’ve been tasked to build an application to help consumers find agencies providing a specific service tasked to build. To build an application to help consumers

View all events

EventsWithImages

Let’s say you’ve been tasked to build an application to help consumers find agencies providing a specific service tasked to build. To build an application to help consumers

  • Placeholder image
    WebinarDiscord

    Webinar marketing planning

    An application to help consumers find agencies providing a specific service tasked to build.

    Webinar marketing planning - Learn more
  • Placeholder image
    MeetupDiscord

    7 Strategies for success

    Tasked to build an application to help consumers find agencies providing a specific service tasked to build.

    7 Strategies for success - Learn more
  • Placeholder image
    ConferenceDiscord

    Application to help consumers

    Let’s say you’ve been tasked to build an application to help consumers find agencies providing a specific.

    Application to help consumers - Learn more
View all events

BlogPosts

category: Announcement

Novu Pro tier – From Builders, For Builders

We’re introducing Novu Pro, a new pricing tier designed for developers who need more flexibility, more scale, and more control.

Dima Grossman
Dima Grossman
category: Product updates

Postmortem on DNS Name Server Migration Interruption

This is a postmortem of a 55-minute global service interruption during our DNS migration from AWS Route 53 to Cloudflare users have experienced on Mar 23, 2025.

Emil Pearce
Emil Pearce
category: Announcement

2025 Winter Season Launch Week

The Winter Season Launch Week 2025 brings five major updates to Novu's notification platform: Multi-Environment Support, Template Store, Variable Popover, Auto-Generated SDKs, and Step Conditions. These features enhance workflow management, provide pre-built templates, simplify dynamic content creation, expand SDK support, and enable advanced conditional logic for notifications.

Emil Pearce
Emil Pearce
Submit Your Content

CTA

  • Self-Hosted

    Create complex workflows, access local data, and reuse existing content.

    Learn more
  • Get started now

    Create complex workflows, access local data, and reuse existing content.

    Book a demo

CTA

  • Self-Hosted

    Create complex workflows, access local data, and reuse existing content.

    Learn more
  • Get started now

    Create complex workflows, access local data, and reuse existing content.

    Book a demo

CTA

  • Self-Hosted

    Create complex workflows, access local data, and reuse existing content.

    Learn more
  • Get started now

    Create complex workflows, access local data, and reuse existing content.

    Book a demo

CtaWithForm

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

npx novu-labs@latest echo

CtaWithForm

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

SectionWithVideo

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

SectionWithVideo

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

SectionWithVideo

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

Transcript

Like concerts, live webinars are time-based and singular events. Sure, you can have on-demand webinars, but there is something special about attending a live webinar - the excitement leading up to the presentation and the energy between presenter and the audience.

Since live webinars only happen once, planning for promotion of your webinar event is crucial to maximize the value for your business. On average, 85% of registrations occur in the last 2 weeks leading up to the webinar, with 29% registering on the same day.

This means that capturing the other 15% will require you to start marketing your webinar several weeks or more prior to the event.

In this article, we’ll go over the benefits of planning for your webinar and top actionable tips to get you moving forward with your webinar marketing strategy.

Like concerts, live webinars are time-based and singular events. Sure, you can have on-demand webinars, but there is something special about attending a live webinar - the excitement leading up to the presentation and the energy between presenter and the audience.

Since live webinars only happen once, planning for promotion of your webinar event is crucial to maximize the value for your business. On average, 85% of registrations occur in the last 2 weeks leading up to the webinar, with 29% registering on the same day.

1import { Echo } from '@novu/echo';
2
3const echo = new Echo();
4
5const commentWorkflow = echo.workflow('comment-on-post', async (event) => {
6  const inAppResponse = await event.step.inApp('notify-user', async () => ({
7    body: renderReactComponent(event.payload.postId)
8  }));
9
10  const { events } = await event.step.digest('1 week');
11
12  await event.step.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 });
18}, { payloadSchema: z.object({ postId: z.string() }) }
19);
20
21// Use the same familiar syntax to send a notification
22commentWorkflow.trigger({
23  to: { subscriberId: 'joe@acme.com' },
24  payload: { postId: '12345' }
25});

CodeSectionNew

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

Learn more
1import { Echo } from '@novu/echo';
2
3const echo = new Echo();
4
5const commentWorkflow = echo.workflow('comment-on-post', async (event) => {
6  const inAppResponse = await event.step.inApp('notify-user', async () => ({
7    body: renderReactComponent(event.payload.postId)
8  }));
9
10  const { events } = await event.step.digest('1 week');
11
12  await event.step.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 });
18}, { payloadSchema: z.object({ postId: z.string() }) }
19);
20
21// Use the same familiar syntax to send a notification
22commentWorkflow.trigger({
23  to: { subscriberId: 'joe@acme.com' },
24  payload: { postId: '12345' }
25});

CodeSectionNew

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

Learn more
1import { Echo } from '@novu/echo';
2
3const echo = new Echo();
4
5const commentWorkflow = echo.workflow('comment-on-post', async (event) => {
6  const inAppResponse = await event.step.inApp('notify-user', async () => ({
7    body: renderReactComponent(event.payload.postId)
8  }));
9
10  const { events } = await event.step.digest('1 week');
11
12  await event.step.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 });
18}, { payloadSchema: z.object({ postId: z.string() }) }
19);
20
21// Use the same familiar syntax to send a notification
22commentWorkflow.trigger({
23  to: { subscriberId: 'joe@acme.com' },
24  payload: { postId: '12345' }
25});

CodeSectionNew

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

1import { Echo } from '@novu/echo';
2
3const echo = new Echo();
4
5const commentWorkflow = echo.workflow('comment-on-post', async (event) => {
6  const inAppResponse = await event.step.inApp('notify-user', async () => ({
7    body: renderReactComponent(event.payload.postId)
8  }));
9
10  const { events } = await event.step.digest('1 week');
11
12  await event.step.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 });
18}, { payloadSchema: z.object({ postId: z.string() }) }
19);
20
21// Use the same familiar syntax to send a notification
22commentWorkflow.trigger({
23  to: { subscriberId: 'joe@acme.com' },
24  payload: { postId: '12345' }
25});

CodeSectionNew

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

Learn more
1import { Echo } from '@novu/echo';
2
3const echo = new Echo();
4
5const commentWorkflow = echo.workflow('comment-on-post', async (event) => {
6  const inAppResponse = await event.step.inApp('notify-user', async () => ({
7    body: renderReactComponent(event.payload.postId)
8  }));
9
10  const { events } = await event.step.digest('1 week');
11
12  await event.step.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 });
18}, { payloadSchema: z.object({ postId: z.string() }) }
19);
20
21// Use the same familiar syntax to send a notification
22commentWorkflow.trigger({
23  to: { subscriberId: 'joe@acme.com' },
24  payload: { postId: '12345' }
25});

CodeSectionNew

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

Learn more
1import { Echo } from '@novu/echo';
2
3const echo = new Echo();
4
5const commentWorkflow = echo.workflow('comment-on-post', async (event) => {
6  const inAppResponse = await event.step.inApp('notify-user', async () => ({
7    body: renderReactComponent(event.payload.postId)
8  }));
9
10  const { events } = await event.step.digest('1 week');
11
12  await event.step.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 });
18}, { payloadSchema: z.object({ postId: z.string() }) }
19);
20
21// Use the same familiar syntax to send a notification
22commentWorkflow.trigger({
23  to: { subscriberId: 'joe@acme.com' },
24  payload: { postId: '12345' }
25});

CodeSectionNew

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

1import { Echo } from '@novu/echo';
2
3const echo = new Echo();
4
5const commentWorkflow = echo.workflow('comment-on-post', async (event) => {
6  const inAppResponse = await event.step.inApp('notify-user', async () => ({
7    body: renderReactComponent(event.payload.postId)
8  }));
9
10  const { events } = await event.step.digest('1 week');
11
12  await event.step.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 });
18}, { payloadSchema: z.object({ postId: z.string() }) }
19);
20
21// Use the same familiar syntax to send a notification
22commentWorkflow.trigger({
23  to: { subscriberId: 'joe@acme.com' },
24  payload: { postId: '12345' }
25});

CodeSectionNew

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

Learn more
1import { Echo } from '@novu/echo';
2
3const echo = new Echo();
4
5const commentWorkflow = echo.workflow('comment-on-post', async (event) => {
6  const inAppResponse = await event.step.inApp('notify-user', async () => ({
7    body: renderReactComponent(event.payload.postId)
8  }));
9
10  const { events } = await event.step.digest('1 week');
11
12  await event.step.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 });
18}, { payloadSchema: z.object({ postId: z.string() }) }
19);
20
21// Use the same familiar syntax to send a notification
22commentWorkflow.trigger({
23  to: { subscriberId: 'joe@acme.com' },
24  payload: { postId: '12345' }
25});

CodeSectionNew

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

Learn more
1import { Echo } from '@novu/echo';
2
3const echo = new Echo();
4
5const commentWorkflow = echo.workflow('comment-on-post', async (event) => {
6  const inAppResponse = await event.step.inApp('notify-user', async () => ({
7    body: renderReactComponent(event.payload.postId)
8  }));
9
10  const { events } = await event.step.digest('1 week');
11
12  await event.step.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 });
18}, { payloadSchema: z.object({ postId: z.string() }) }
19);
20
21// Use the same familiar syntax to send a notification
22commentWorkflow.trigger({
23  to: { subscriberId: 'joe@acme.com' },
24  payload: { postId: '12345' }
25});

CodeSectionNew

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

1import { Echo } from '@novu/echo';
2
3const echo = new Echo();
4
5const commentWorkflow = echo.workflow('comment-on-post', async (event) => {
6  const inAppResponse = await event.step.inApp('notify-user', async () => ({
7    body: renderReactComponent(event.payload.postId)
8  }));
9
10  const { events } = await event.step.digest('1 week');
11
12  await event.step.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 });
18}, { payloadSchema: z.object({ postId: z.string() }) }
19);
20
21// Use the same familiar syntax to send a notification
22commentWorkflow.trigger({
23  to: { subscriberId: 'joe@acme.com' },
24  payload: { postId: '12345' }
25});

CodeSectionNew

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

Learn more
1import { Echo } from '@novu/echo';
2
3const echo = new Echo();
4
5const commentWorkflow = echo.workflow('comment-on-post', async (event) => {
6  const inAppResponse = await event.step.inApp('notify-user', async () => ({
7    body: renderReactComponent(event.payload.postId)
8  }));
9
10  const { events } = await event.step.digest('1 week');
11
12  await event.step.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 });
18}, { payloadSchema: z.object({ postId: z.string() }) }
19);
20
21// Use the same familiar syntax to send a notification
22commentWorkflow.trigger({
23  to: { subscriberId: 'joe@acme.com' },
24  payload: { postId: '12345' }
25});

CodeSectionNew

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

Learn more
1import { Echo } from '@novu/echo';
2
3const echo = new Echo();
4
5const commentWorkflow = echo.workflow('comment-on-post', async (event) => {
6  const inAppResponse = await event.step.inApp('notify-user', async () => ({
7    body: renderReactComponent(event.payload.postId)
8  }));
9
10  const { events } = await event.step.digest('1 week');
11
12  await event.step.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 });
18}, { payloadSchema: z.object({ postId: z.string() }) }
19);
20
21// Use the same familiar syntax to send a notification
22commentWorkflow.trigger({
23  to: { subscriberId: 'joe@acme.com' },
24  payload: { postId: '12345' }
25});

CodeSectionNew

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

Novu <Inbox />

Inbox
  • Your account is pending verification.

    steve@acme.co is pending verification, please verify your account to protect against fraud and abuse.

    Today at 7:41 AM
  • Joe requested to view Q4 2024 report.

    joe@acme.co requested view access to Q4 2024 report.

    Last Friday at 8:40 PM
  • 2 new comments from Radek and Dima.

    You have 2 new comments on the Acme figma file.

    Last Monday at 13:45 PM
  • Your account is pending verification.

    steve@acme.co is pending verification, please verify your account to protect against fraud and abuse.

    Today at 7:41 AM
  • Joe requested to view Q4 2024 report.

    joe@acme.co requested view access to Q4 2024 report.

    Last Friday at 8:40 PM
  • 2 new comments from Radek and Dima.

    You have 2 new comments on the Acme figma file.

    Last Monday at 13:45 PM
Novu dark

Inbox

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

Learn more

Novu <Inbox />

Inbox
  • Your account is pending verification.

    steve@acme.co is pending verification, please verify your account to protect against fraud and abuse.

    Today at 7:41 AM
  • Joe requested to view Q4 2024 report.

    joe@acme.co requested view access to Q4 2024 report.

    Last Friday at 8:40 PM
  • 2 new comments from Radek and Dima.

    You have 2 new comments on the Acme figma file.

    Last Monday at 13:45 PM
  • Your account is pending verification.

    steve@acme.co is pending verification, please verify your account to protect against fraud and abuse.

    Today at 7:41 AM
  • Joe requested to view Q4 2024 report.

    joe@acme.co requested view access to Q4 2024 report.

    Last Friday at 8:40 PM
  • 2 new comments from Radek and Dima.

    You have 2 new comments on the Acme figma file.

    Last Monday at 13:45 PM
Novu dark

Inbox

Redesigned local experience to author configurable workflows tailored to optimize Developer Experience, with a matching interface for non-technical users.

Learn more

SectionWithForm

We're here to support you in navigating the open-source notification infrastructure for developers.

  • Seamless integration

    Integrate Novu effortlessly into your workflow for streamlined notification management.

  • Customization at its core

    Tailor notifications to your unique needs with Novu's flexible and customizable features.

  • Developer-friendly

    Empowering developers with an open-source infrastructure, Novu simplifies the way you handle notifications.

SectionWithForm

We're here to support you in navigating the open-source notification infrastructure for developers.

  • Seamless integration

    Integrate Novu effortlessly into your workflow for streamlined notification management.

  • Customization at its core

    Tailor notifications to your unique needs with Novu's flexible and customizable features.

  • Developer-friendly

    Empowering developers with an open-source infrastructure, Novu simplifies the way you handle notifications.