In this release, we are very excited to introduce a lot of new improvements to some of our core features as well as completely new functionalities to help with creating better notification experiences for your users.
Let's deep dive in the new things available:
E-mail Layouts
You can now create and manage email layouts for notification templates. This feature makes it easier for you to customize the look and feel of your e-mail notifications and ensure that they are consistent across templates. Once a layout is created, you can then attach particular notifications to that layout. All the regular variables that are available on the template level will also be available when compiling the layout content.
To read more about layouts, visit our documentation page: https://docs.novu.co/platform/layouts
Is Online Filters
Really excited to share that from now you can send or not send notifications depending on the online status of the current subscriber in your system. When using the Novu notification center, we will track the current active session of the subscriber and allow filtering by its current status. You can filter by currently online, or online in the last X minutes.
Read more about it here.
Reply Callbacks with Inbound E-mail Parsing (Cloud Only)
Subscribers can now reply to e-mails you send them, similar to the behavior you might see when replying to a GitHub issue comment e-mail and your reply e-mail automagically appears as a GitHub comment.
You can enable Reply Callbacks for a particular notification template. Novu will modify the reply to the field to add a unique identifier when a subscriber replies to this e-mail. After parsing novu will call you the webhook URL defined in the template containing information about the particular notification and the e-mail contents for you to perform extra business logic for it.
Novu Starter E-mail Provider (Cloud only)
For new accounts evaluating Novu you could now have up to 300 free e-mails using the built novu provider to evaluate novu without the need to connect your SendGrid account.
Breaking changes
@novu/notification-center
changes
NovuProvider
:
Added the new prop initialFetchingStrategy
which allows deciding about fetching strategy. By default feed notifications and user preferences are not fetched, this behavior is particularly implemented for the PopoverNotificationCenter
as we don’t want to make the request for the feed before the notification center is opened, it might not be opened at all. But, sometimes it might be useful to fetch them during the hook mounting, ex. when you build custom UI components, ex. notifications list page, then you can use this prop to define that you want to fetch “right away”. Also, you can change the fetching strategy manually using the useNovuContext
and setFetchingStrategy
functions.
Hooks
:
Changed the return interface of the useNotifications
hook:
updateAction
prop moved to a separate hookuseUpdateAction
markAsRead
renamed tomarkNotificationAsRead
, it takes now only themessageId
as the argumentmarkAllAsRead
renamed tomarkAllNotificationsAsRead
, it doesn’t require args to passmarkAsSeen
renamed tomarkNotificationAsSeen
, it takes now only themessageId
as the argumentfetching
renamed toisFetching
- removed
onWidgetClose
andonTabChange
as these props have nothing to do with this hook and they were only needed for internal use - added props:
storeId, stores, unseenCount, isLoading, isFetchingNextPage, setStore, markAllNotificationsAsSeen
Split useSubscriberPreference
into two separate hooks: useFetchUserPreferences
and useUpdateUserPreferences
New hooks: useUpdateUserPreferences, useUpdateAction, useFetchNotifications, useFetchOrganization, useFeedUnseenCount, useMarkNotificationsAs
Hooks removed: useAuth
, useApi
, useScreens
, useUnseenController
- used for internal purpose
Hooks exposed: useSocket, useUnseenCount, useNotifications, useNovuContext, useNovuTheme, useNotificationCenter, useTranslations, useUpdateUserPreferences, useUpdateAction, useFetchNotifications, useFetchOrganization, useFeedUnseenCount, useFetchUserPreferences, useMarkNotificationsAs
Other notable changes
- strict null checks refactor by @scopsy in #2390
- chore(docs): improve-topics-swagger by @p-fernandez in #2422
- fix(api): improve
subscriberId
validation by @mocherfaoui in #2428 - Updating json web token library by @Cxxshyy in #2425
- fix(docs): add topics tag to swagger bootstrap by @p-fernandez in #2430
- fix: typescript error for messageIds by @BiswaViraj in #2435
- fix: add backwards compatability for auth header by @scopsy in #2440
- fix: fix double scroll bars in admin panel by @caiopiassali in #2333
- fix: improve env validator for storage providers by @titenkov in #2433
- feat(dal): add relationship between message template and layout by @p-fernandez in #2444
- feat(api): create layouts module by @p-fernandez in #2454
- feat: add usecase to calculate if predefined provider should be used by @davidsoderberg in #2429
- feat: add copy functionality for vars in variable manager by @paolapog in #2412
- fix: remove redundant cache invalidation by @djabarovgeorge in #2463
- fix: remove redundant update by @djabarovgeorge in #2467
- feat: online status handler by @BiswaViraj in #2441
- fix: duplicate preference rows on update by @ainouzgali in #2450
- chore(web): fixed deepsource issues with wai aria by @LetItRock in #2477
- feat(api): update step filter type for is online filters by @LetItRock in #2458
- feat(api): run step filters - is online logic by @LetItRock in #2472
- feat(api): filter layouts endpoint by @p-fernandez in #2479
- Nv 1464 web create layout page by @ainouzgali in #2474
- fix(api): is online filters - skip processing old subscribers by @LetItRock in #2483
- chore: fixed additional deepsource issue by @LetItRock in #2478
- Feature/dynamic onboarding by @davidsoderberg in #2456
- feat: Added form UI for the online filters by @BiswaViraj in #2460
- fix(api): topics pagination was wrong by @p-fernandez in #2480
- refactor: change es cache service key by @scopsy in #2488
- feat(api): update subscriber online status endpoint by @LetItRock in #2475
- feat: consolidate sign up events by @scopsy in #2482
- feat: upgrade newrelic by @scopsy in #2492
- fix: Add api body params to mark subscriber feed by @codingmickey in #2476
- refactor: add new parsing queue for events by @scopsy in #2501
- fix: use class validators 0.14.0 by @scopsy in #2494
- fix: page flickering issue while using light theme on system by @BiswaViraj in #2502
- feat: add endpoint to get novu limits by @davidsoderberg in #2495
- feat: added tests for filters by @BiswaViraj in #2491
- feat(api): add delete layout endpoint by @p-fernandez in #2487
- feat(api): add update endpoint by @p-fernandez in #2497
- feat(api): add field description to layout by @p-fernandez in #2498
- feat: assign layout to template and dropdown in web by @ainouzgali in #2506
- feat(api): add endpoint to set a layout as default by @p-fernandez in #2514
- Nv 1488 web delete and update by @ainouzgali in #2505
- fix(notification-center-vue): fixed react, react dom dependencies issue by @LetItRock in #2515
- CLI Onboarding - email and password registration by @scopsy in #2508
- feat: Support serving uploaded files from CDN by @JoeyEamigh in #2513
- docs: online filter documentation by @BiswaViraj in #2516
- Nv 1486 remove env from the vercel project if by @BiswaViraj in #2503
- fix: Add support for Minio local S3 storage by upgrading AWS SDK by @JoeyEamigh in #2511
- feat: improve execution details for step filters by @LetItRock in #2499
- feat(api,ws): is online filters analytics by @LetItRock in #2519
- feat: is online filters by @LetItRock in #2473
- feat: add limit bar and analytics by @davidsoderberg in #2522
- feat(api): integrate set default layout in creation and update flows by @p-fernandez in #2526
- feat: add ses email info doc and few FAQs by @jainpawan21 in #2445
- Fix novu integration limit by @davidsoderberg in #2531
- Configure Renovate by @renovate in #2536
- feat(api): sort and order query params for filtering layouts by @p-fernandez in #2535
- chore(deps): update dependency @storybook/testing-library to v0.0.13 by @renovate in #2537
- chore(deps): update dependency @types/react to v17.0.53 by @renovate in #2539
- chore(deps): update dependency @types/express to v4.17.15 by @renovate in #2538
- Complete
novu/node
integrations module by @codingmickey in #2533 - Nv 1458 web abstract variable manager to not by @ainouzgali in #2529
- Layouts - compile layout with email content by @ainouzgali in #2527
- chore(deps): update dependency @types/react-helmet to v6.1.6 by @renovate in #2544
- feat: update logo by @davidsoderberg in #2548
- feat: change logo in header nav by @davidsoderberg in #2549
- feat(api): disallow delete of assigned by @p-fernandez in #2545
- chore(deps): update dependency cypress-intellij-reporter to ^0.0.7 by @renovate in #2547
- chore(deps): update dependency @types/react-dom to v17.0.18 by @renovate in #2542
- NV-1541: handle default novu layout by @scopsy in #2551
- chore(deps): update dependency eslint-plugin-spellcheck to v0.0.20 by @renovate in #2552
- chore(deps): update dependency inquirer to v8.2.5 by @renovate in #2553
- fix: rearranged the order of statements inside the cleanup function by @BiswaViraj in #2556
- fix: update ci pipelines to remove build before building docker image by @scopsy in #2562
- fix: add missing redis cache service config by @titenkov in #2532
- Add Helmet Secruity Headers to WebSocket Service by @Cliftonz in #2563
- chore(deps): update commitlint monorepo to v17.4.2 by @renovate in #2560
- fix(deps): update dependency styled-components to v5.3.6 by @renovate in #2559
- fix(deps): update dependency @nestjs/axios to v0.1.1 by @renovate in #2557
- fix(deps): update dependency react-scripts to v4.0.3 by @renovate in #2558
- feat: add reply callback step controller by @djabarovgeorge in #2462
- feat(wip): add reply callback support by @djabarovgeorge in #2465
- Reply callbacks wip by @djabarovgeorge in #2525
- Layout - dropdown searchable, layout required by @ainouzgali in #2534
- Nv 1457 web move update button to top header by @ainouzgali in #2572
- refactor: provider card for novu integrations by @davidsoderberg in #2546
- feat(api): create a layout change by @p-fernandez in #2521
- fix: ensure one default layout in set as default by @ainouzgali in #2575
- feat: show layout changes in web by @ainouzgali in #2574
- Nv 1490 e2e tests for the filter condition by @BiswaViraj in #2554
- feat: Added the filter condition component on UI by @BiswaViraj in #2550
- feat(api): promote changes of layouts by @p-fernandez in #2520
- fix: env for get novu integration by @davidsoderberg in #2576
- Layouts Feature by @ainouzgali in #2540
- chore(deps): update dependency react-error-overlay to v6.0.11 by @renovate in #2555
- feat: add footer link for home by @vishnu-kyatannawar in #2528
- fix: long text overflows container by @mocherfaoui in #2570
- Reply callbacks by @djabarovgeorge in #2571
- Format code with prettier by @deepsource-autofix in #2581
- fix: update mail server domain env by @djabarovgeorge in #2580
- fix: add env files by @djabarovgeorge in #2582
- Reply callbacks by @djabarovgeorge in #2584
- fix: description in layout not being promoted by @ainouzgali in #2586
- fix: blueprint modal tests by @davidsoderberg in #2579
- chore(deps): update dependency @angular/cli to ~15.1.0 by @renovate in #2566
- feat: ensure one default layout by @ainouzgali in #2587
- Install the CodeSee workflow. by @codesee-maps in #2588
- fix: edit layout page, navigate to screens per env change by @ainouzgali in #2591
- chore(deps): update dependency @types/express to v4.17.16 by @renovate in #2578
- fix: fixes radius issue by @BhuvaneshPatil in #2391
- fix: add env config by @djabarovgeorge in #2593
- feat(api): tests for layout promotion by @p-fernandez in #2595
- feat: add locale property to subscriber model by @katyaterletskaya in #2509
- feat: add python utils by @djabarovgeorge in #2597
- Nv 1579 useintercom must be inside by @BiswaViraj in #2599
- chore(deps): update dependency eslint-config-airbnb-typescript to v16.2.0 by @renovate in #2594
- chore(deps): update dependency eslint-plugin-react to v7.32.1 by @renovate in #2600
- Update changes count badge on layout change by @ainouzgali in #2598
- fix: so changes are aggregated into one by @ainouzgali in #2596
- Add description to layout table by @ainouzgali in #2607
- fix: so blueprint id is saved on auth pages by @davidsoderberg in #2609
- chore(deps): update dependency http-server to ^0.13.0 by @renovate in #2604
- chore(deps): update dependency jira-prepare-commit-msg to v1.7.1 by @renovate in #2611
- fix(package): fix tests and the implementation of the get topic by @p-fernandez in #2614
- fix: copy when there is no email integration active by @davidsoderberg in #2617
- chore(deps): update dependency cypress to v10.11.0 by @renovate in #2592
- chore(notification-center): refactor notification center context with react-query by @LetItRock in #2382
- chore(deps): update dependency lerna to v5.6.2 by @renovate in #2618
- feat: add redis tls option by @katyaterletskaya in #2616
- Format code with prettier by @deepsource-autofix in #2621
- chore(deps): update dependency markdownlint-cli to ^0.33.0 by @renovate in #2619
- Feat: Add Logrocket Monitoring by @Cliftonz in #2610
New Contributors
- @caiopiassali made their first contribution in #2333
- @titenkov made their first contribution in #2433
- @paolapog made their first contribution in #2412
- @vishnu-kyatannawar made their first contribution in #2528
- @codesee-maps made their first contribution in #2588
- @katyaterletskaya made their first contribution in #2509
Full Changelog: v0.10.3...v0.11.0