Releases: novuhq/novu
v0.20.0
What’s new in Novu 0.20?
TL;DR: All you need to know about the latest Novu 0.20.0 release. Global User Preferences, Integrations conditions, Digest and delay filters and more!
0.20 Release Updates
We're thrilled to announce the newest features in our most recent release. Let's get started and explore what's waiting for you!
Global Channel Preferences for Subscribers API
It's now possible to set subscriber preferences globally for either a particular channel or all channels via API.
I'm really stoked about this because before now it was only available per workflow, /:subscriberId/preferences/:templateId
With these API URLs, you can fetch and update global subscriber preferences.
PATCH /subscribers/:subscriberid/preference
- Update a subscriber preference globally.GET /subscribers/:subscriberid/preferences/global
- Fetch a subscriber preference globally.
Note: These methods are also available in the NodeJS SDK. They will be available in other language SDKs very soon.
If you're using the Headless service and Notification Center Widgets, you can set or fetch via the following APIs:
widgets/preferences
- PATCH : Update subscriber preferences globally
{
"enabled": true,
"preferences": [
{
"type": "in_app",
"enabled": true
},
{
"type": "email",
"enabled": false
}
]
}
widgets/preferences/global
- GET : Fetch subscriber preferences globally.
The exposed methods from the widgets are:
fetchUserGlobalPrereferences
updateUserGlobalPreferences
Note: If a workflow is marked as critical, the subscriber global preferences will be ignored, and notifications will be sent.
Filters Usage in Digest and Delay Nodes
Users can now add filters to the digest and delay nodes inside the workflow editor to dynamically control if a digest should be used or not.
Digest Node: Adding filter
Delay Node: Adding filter
Improved Error Messages In The Workflow Editor
We have improved the error icons and states for each node in the workflow, when no provider is connected or not configured.
SMS & Email Custom Data Overrides
We now support adding custom data in email overrides as shown below:
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_API_KEY>');
await novu.subscribers.trigger("workflowIdentifier", {
to: "subscriberId",
payload: {
customKey: "customValue",
},
overrides: {
email: {
from: "support@novu.co",
// customData will work only for sendgrid
customData: {
"customKey": "customValue"
}
}
}
}
Email Custom Data overrides
Note: This works for Sendgrid only at the moment.
You can override sms values via the code below.
...
...
await novu.subscribers.trigger("workflowIdentifier", {
to: "subscriberId",
payload: {
customKey: "customValue",
},
overrides: {
sms: {
to: "<insert-phone-number>",
content: "<insert-content>"
}
}
}
SMS Overrides
Enabling The Addition of Conditions to Integrations
Users can now create conditions for the channel integrations to be executed for specific tenants only.
In the image above, you can add the condition (to an integration) to state that the integration should be used if the tenant identifier used in trigger matches the tenant identifier set here.
Note: The integrations are the provider instances on the Integration store dashboard.
When Novu runs a trigger code with a tenant Identifier attached to it like so:
import { Novu } from '@novu/node';
const novu = new Novu(process.env.NOVU_API_KEY);
await novu.trigger('<WORKFLOW_TRIGGER_ID>',
{
to: {
subscriberId: '<UNIQUE_SUBSCRIBER_IDENTIFIER>',
email: 'john@doemail.com',
},
tenant: "tenantIdentifier"
}
);
..Novu runs checks on the integrations in the Integration store to determine which integration matches to be used to send the notification based on any condition that has been set. If nothing was set, it defaults to the primary provider set for the channel used in the workflow.
Mailtrap Email Provider Integration
Now, you can use the Mailtrap Email provider on Novu.
Clicksend SMS Provider Integration
Now, you can use the Clicksend SMS provider on Novu.
All Changes
- refactor: replace node-apns library with parse implementation by @scopsy in #4085
- chore: upgrade mongoose version to 7 by @scopsy in #4106
- feat: init git submodule by @djabarovgeorge in #4049
- Nv 2781 move auth logic to application generic by @djabarovgeorge in #4064
- feat: add external oauth module by @djabarovgeorge in #4067
- chore: fix typo in spf.py by @eltociear in #4083
- Docs overhaul by @sumitsaurabh927 in #3835
- fix: unseen count default by @djabarovgeorge in #4082
- Fix unseen count by @djabarovgeorge in #4084
- Fix plunk missing square logo by @michaldziuba03 in #4087
- fix: unread request by @djabarovgeorge in #4088
- chore: fix typos by @omahs in #4089
- fix: so closing x is in the right place by @davidsoderberg in #4092
- Nv 2679 reusable conditions component by @ainouzgali in #4095
- chore: upgrade vite by @scopsy in #4090
- NV-2765 - 🐛 Bug Report: delay icon is not aligned with other steps icon by @gitstart in #4068
- Nv 2764 e2e tests by @djabarovgeorge in #4094
- fix: missing data prop in the compile payload by @ainouzgali in #4114
- Add ES i18n translations by @luisdoniad in #4110
- fix: select integration with condtions by @davidsoderberg in #4115
- refactor: conditions component by @ainouzgali in #4105
- feat: add nodejs sdk methods in readme by @jainpawan21 in #4047
- fix(ci): inbound mail pipeline indent by @p-fernandez in #4122
- Add Staging Web Pipeline by @Cliftonz in #4108
- Build submodule package by branch by @djabarovgeorge in #4121
- fix: angular version by @sr-26 in #4134
- add volume claim to mongodb deployment by @ahmadzana in #4135
- feat: add missing endpoints by @BiswaViraj in #4103
- fix: run rename by @djabarovgeorge in #4139
- Fix Inbound Mail Deployment by @djabarovgeorge in #4143
- Nv 2826 investigate failing digest tests by @davidsoderberg in [https://github.com...
v0.19.0
What’s new in Novu 0.19?
TL;DR: All you need to know about the latest Novu 0.19.0 release. Multi-tenancy management, bulk subscriber creation, override layouts and more!
0.19 Release Updates
We're eager to showcase the latest features in our most recent release. Let's dive in and discover what's in store for you!
Multi-tenancy Management
We are stoked to let you know that you can now manage tenants from the UI (Novu’s dashboard) and the API.
Self-hosted users need to add and turn on the IS_MULTI_TENANCY_ENABLED
env flag to be able to manage tenants in their Novu installation.
Tenants Usage in Workflows as Variables
With tenants feature now generally available, there are different ways you’ll be able to use it in your app depending on your use case.
One of those ways is using it as variables in your workflows and triggers. When triggering a notification using the events trigger endpoint, you can pass in a tenant property as a parameter like so:
import { Novu } from '@novu/node';
const novu = new Novu(process.env.NOVU_API_KEY);
await novu.trigger('<WORKFLOW_TRIGGER_ID>',
{
to: {
subscriberId: '<UNIQUE_SUBSCRIBER_IDENTIFIER>',
email: 'john@doemail.com',
firstName: 'John',
lastName: 'Doe',
},
payload: {
name: "Hello World",
organization: {
logo: 'https://happycorp.com/logo.png',
},
},
actor: "actorId"
tenant: "tenantIdentifier"
}
);
passing in tenant property when triggering a notification
The tenant can also be accessed in a workflow template like so:
{{ tenant.data.logo }}
accessing tenant properties in a workflow
Bulk Subscriber Creation
This release also ships the wildly requested “bulk subscriber creation.” Starting v0.19, you’ll be able to create subscribers in bulk (up to 500 at once) using an API endpoint.
Note: The bulk API is limited to 500 subscribers per request.
await novu.subscribers.bulkCreate([
{
subscriberId: 'test-subscriber-1',
email: 'test-user@sd.com',
firstName: 'subscriber-1',
lastName: 'test-1',
},
{
subscriberId: 'test-subscriber-2',
email: 'test-user-2@sd.com',
firstName: 'subscriber-2',
lastName: 'test-2',
},
{
subscriberId: 'test-subscriber-3',
},
]);
Addition of Tags in Workflow Settings
We have added the ability to use tags in the workflow settings screen.
This change allows use cases where you need to group multiple workflows under the same tag, and then use it to filter subscriber preferences for example.
Allow Override layout On Trigger
To override your assigned layout during a trigger event use the layoutIdentifier
property, the layout specified will be used for all emails in the context of that trigger event.
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_API_KEY>');
novu.trigger('workflow-identifier', {
to: {
subscriberId: '...',
},
payload: {
attachments: [
{
file: fs.readFileSync(__dirname + '/data/test.jpeg'),
name: 'test.jpeg',
mime: 'image/jpg',
},
],
},
overrides: {
layoutIdentifier: 'your-layout-identifier',
},
});
Show Primary Providers on Workflow Nodes
Now you can see the primary provider of a channel in the nodes that show on the workflow editor. This gives you more context and better identification without extra clicks!
Enhanced Workflow Nodes Misconfiguration Error
Nodes and workflows will now display mis-configured workflows on the dashboard like so:
All changes
- Nv 2474 styles tag css in email is not showing in few email clients by @davidsoderberg in #3978 - We now convert all email styles to inlince CSS for compatibility across browsers
- fix: so swagger json validates by @davidsoderberg in #3969 - Improved our swagger validation for the API Swagger data
- Reduce count 1000 to the db by @djabarovgeorge in #3993 - Breaking: For socket events we will return
hasMore
boolean field incase there are more than 100 results available. - feat: add tags for workflow settings by @scopsy in #4065 - Tags could now be added to workflows in the workflow settings page, once added they can be used later for usecases such as filtering the user preferences in the notification center
- Nv 2517 displays that workflow has nodes that will fail to send a notification by @BiswaViraj in #3966 - Nodes and workflows will now display mis-configured workflows
- feat: show providers on workflow nodes by @BiswaViraj in #3998 - Providers will be shown on nodes for better identifications
- feat: add override layout in trigger functionality by @ainouzgali in #3961 - You can now override the default layout using the
overrides
part of the trigger - feat(worker): remove performance svc as it was temporary by @p-fernandez in #3944
- Docs platform guide handlebars by @sumitsaurabh927 in #3833
- fix: sidebar intercepting workflow editor by @davidsoderberg in #3968
- feat(wip): initial bulk subscriber create by @ainouzgali in #3938
- Nv 2690 add identifier field to layouts scheme by @ainouzgali in #3956
- feat(ci): reuse instructions to tidy up pipelines by @p-fernandez in #3975
- feat: migration script to add identifier to layouts by @ainouzgali in #3967
- feat(ci): separate the swagger validation in own runner plus improvement by @p-fernandez in #3981
- fix(ci): indenting action by @p-fernandez in #3984
- patch : remove rows only when steps are truthy by @djabarovgeorge in #3980
- Update ReadMe to include Java SDK link by @mayorjay in #3974
- Add Analytics call to Track Deletion of Templates by @Cliftonz in #3971
- feat add organization id index in integration by @djabarovgeorge in #3983
- fix: so add a provider is not displayed in empty state by @davidsoderberg in #3985
- feat(ci): reusable action to run backend (api, worker) for clients by @p-fernandez in #3991
- fix(ci): proper settings for secrets for run backend by @p-fernandez in #3992
- Changed the sidebar position of Python by @bcsamrudh in #3997
- docs: add nestjs quickstart guide by @michaldziuba03 in #3747
- fix: remove github discussion link by @jainpawan21 in #4002
- feat: fix logger error order by @djabarovgeorge in #4003
- fix: add missing sharable url in the new integration form by @djabarovgeorge in #3986
- next fix logger error order by @djabarovgeorge in #4006
- clean patch - execution details no write concern by @djabarovgeorge in #4008
- optimization : merge two redis calls in api key authenticate by @djabarovgeorge in #3982
- Fix failing test for web and widget by @scopsy in [https://github.com//pull/4009](https://github.co...
v0.18.0
What’s new in Novu 0.18?
TL;DR: All you need to know about the latest Novu 0.18.0 release. General Layout design, multi-provider configuration and more!
0.18 Release Updates
We're excited to unveil the freshest developments in our latest release. Let's plunge right in and uncover what awaits you!
General Layout Design
We have refreshed the layout design to accommodate and provide a foundation for a lot of upcoming future updates regarding the navigation stack and general usability of the system.
Multi-provider Configuration
In the last update, I mentioned that Novu now supports multiple providers.
Now you can specify who should be the primary provider when you have multiple providers for a particular channel for a given environment. As mentioned in the last release, you can programmatically call a provider identifier during a trigger event.
await novu.trigger("<workflow_trigger_id>", {
to: {...},
payload: {...},
overrides: {
email: { integrationIdentifier: 'the identifier"} ,
sms: { integrationIdentifier: 'the identifier"}
}
});
Migration for Self-hosted Novu Users - BREAKING CHANGE
A migration needs to be run prior to the new version update:
cd apps/api
npm run migration:primary-provider
# .env file in apps/api/src/.env should have a MONGO_URL pointing to your deployment
Plunk Email Provider Integration
Now, you can use the Plunk Email provider on Novu.
All changes
- [New Email Provider]: Add Plunk email provider by @toyosi12 in #3787
- feat: add sort by handlebar helper by @jainpawan21 in #3935
- feat: create novu providers when organization is created by @davidsoderberg in #3843
- feat: add tenants route and shell page component by @djabarovgeorge in #3847
- NV-2601 - Add support in the client for tenant feature by @djabarovgeorge in #3846
- feat: add initial tenants ui by @djabarovgeorge in #3855
- Nv 2612 - Tenant Page Empty State by @djabarovgeorge in #3857
- chore(notification-center,node,shared): update the axios to latest version by @LetItRock in #3861
- fix: remove version 17 info in cookbook by @jainpawan21 in #3862
- fix(app-generic): adding context and information for logs for debugging by @p-fernandez in #3865
- NV 2613 - Tenant Page Pagination by @djabarovgeorge in #3859
- feat: remove get novu integration usecase by @davidsoderberg in #3852
- fix: so activating a provider deactivates novu provider by @davidsoderberg in #3871
- feat: remove novu providers for select provider by @davidsoderberg in #3867
- chore(*): remove
gitHead
field from all packages by @marvinjude in #3868 - NV 2602 - Hide Tenant functionality under the feature flag by @djabarovgeorge in #3860
- Fix broken link by @toyosi12 in #3874
- fix: allow return 'data' as response prop by @djabarovgeorge in #3876
- feat: add subscriber migration dotnet code by @jainpawan21 in #3878
- Nv 2452 tenant create + update a tenant sidebar by @ainouzgali in #3863
- test: fix failing test because of a run on same day by @ainouzgali in #3882
- feat: add delete item and name fields for novu providers by @davidsoderberg in #3864
- feat: add tenant page tests by @djabarovgeorge in #3877
- Stacked PR's Branch for Tenants Support by @djabarovgeorge in #3889
- chore: update cypress version due to security update by @scopsy in #3891
- feat: add migration script to add novu providers to database by @davidsoderberg in #3886
- feat: add few versions fields in bug template by @jainpawan21 in #3906
- chore: update dependencies with security issues by @scopsy in #3901
- fix(app-generic): circular dependency on subscriber pref use cases by @p-fernandez in #3907
- feat: add hover state for provider item by @davidsoderberg in #3903
- fix: add identifier in migration script for novu providers by @davidsoderberg in #3904
- feat: make identifier labels consistent by @davidsoderberg in #3900
- chore(deps): update pnpm to v7.33.4 [security] by @renovate in #3896
- fix: getContextPath did not work correctly when called in a browser by @DaveAtKeelvar in #3814
- Nv 2503 store novu providers email sms in the database by @davidsoderberg in #3898
- Nv 2588 multi provider multiple in app instances can be created by @davidsoderberg in #3910
- feat: render html in in app preview by @davidsoderberg in #3913
- feat: fix cursors for drag buttons and drop area by @davidsoderberg in #3922
- fix: fix update of digest jobs only for current subscriber by @ainouzgali in #3912
- feat(app-generic): add log for subscriber not processed when trigger by @p-fernandez in #3924
- Configure Email provider warning when Novu email provider is active by @djabarovgeorge in #3908
- feat: disable role toggle by @djabarovgeorge in #3929
- fix: icons on the digest playground and in-app sandbox by @BiswaViraj in #3933
- feat(ws): create unit test suite by @p-fernandez in #3921
- New Layout by @BiswaViraj in #3880
- Allow storing custom metadata on the workflow entity by @djabarovgeorge in #3890
- feat(tests): add tests for worker and queue services by @p-fernandez in #3936
- feat(web): select primary integration modal by @LetItRock in #3869
- feat(api): set integration as primary and priority system by @LetItRock in #3873
- chore(api): migration script for primary and priority integration fields by @LetItRock in #3875
- feat(app-generic): add test for add job use case to check the injected queue service by @p-fernandez in #3941
- feat(app-generic): revome queue and worker hardcoded names by @p-fernandez in #3940
- feat(api): notifications feed filtering by partial payload object by @LetItRock in #3939
- feat: get execution details endpoint by external subscriber id by @ainouzgali in #3945
- NV-2664 - Query count change only is the subscriber have connection. by @djabarovgeorge in #3937
- fix(web): fixed env switch popover issue by @LetItRock in #3953
- fix(web): general app layout updates for small and bigger screens by @LetItRock in #3949
New Contributors
- @toyosi12 made their first contribution in #3787
- @marvinjude made their first contribution in #3868
- @DaveAtKeelvar made their first contribution in #3814
Full Changelog: v0.17.2...v0.18.0
v0.17.1 - Release
What’s new in Novu 0.17.1?
TL;DR: All you need to know about the latest Novu 0.17.1 release. Multi-provider Integration support, Multi-tenancy support, cookbook, notification center updates and more!
0.17.1 Release Updates
We're excited to unveil the freshest developments in our latest release. Let's plunge right in and uncover what awaits you!
Multi-provider Integration Support (BETA)
Now you can connect multiple providers per channel and make them active. This feature is currently in beta.
We also redesigned the Integrations store page to make it more intuitive in selecting & enabling channel providers.
With this feature, you can now do the following:
Specify the provider you want when triggering notifications. Add the integrationIdentifier
to the overrides
object for the specific channel.
await novu.trigger("<workflow_trigger_id>", {
to: {...},
payload: {...},
overrides: {
email: { integrationIdentifier: 'the identifier"} ,
sms: { integrationIdentifier: 'the identifier"}
}
If you're self-hosting Novu, you'll need to pass the env flag, IS_MULTI_PROVIDER_CONFIGURATION_ENABLED
to all services.
Note: In the nearest future, you will be allowed to select a provider based on a tenant and other execution conditions.
Multi-tenancy Support (BETA)
We've been hard at work building the base flow, API and processes to support multi-tenancy. This feature is currently in beta testing. It will become generally available in the next release.
Delete Provider Credentials API
We have added support to delete a provider credentials via an API endpoint
Remove All Messages In Notification Center Widget & Headless Service
The Notification Center widget allows users to see all notification messages. Before now, you can only delete messages one after the other.
There are a few notable updates:
- We have added a useRemoveAllNotification hook in the React Notification Center widget. You can remove all notifications from a feed or entirely!
- We have also added a
removeAllNotifications
method to the headless service.
Additional Handlebar helpers
We have added a unique
and groupBy
handlebar helpers.
- unique: To remove duplicates in array iteration
{{#each (unique names "name")}}
--<b>{{this}}</b>---
{{/each}}
- groupBy: To group array values by property
{{#each (groupBy names "name")}}
<h1>{{key}}<h1>
{{#each items}}
{{age}}-
{{/each}}
{{/each}}
Notification Feed Page Size Changes (BREAKING CHANGE)
By default, the notification feed page will return 100 notifications and return a hasMore
field if more than 100 notifications exist.
Activity Feed & Subscriber API Changes (BREAKING CHANGE)
The Activity Feed & Subscriber API will no longer return totalCount
. Due to performance optimizations, they will return a hasMore
boolean flag in cases where there are more results to fetch.
listenNotificationReceive in Headless Service.
We have added a new function, listenNotificationRecieve
, to listen to when a new notification comes in!
It can be used to retrieve a new notification in real-time and trigger UI changes.
headlessService.listenNotificationReceive({
listener: (message: IMessage) => {
console.log(JSON.stringify(message));
},
});
Sendchamp SMS Provider Integration
Now, you can use the Sendchamp SMS provider on Novu.
Update on Workers
Workers will now wait for health check to pass before accepting jobs to process, and will perform a graceful shutdown on a terminate signal received by the service manager.
Docs, Cookbook & Guides
We currently offer [quickstart guides](https://docs.novu.co/overview/quickstart/general-quickstart) for a wide range of major languages and technologies. Feel free to explore these guides to swiftly begin your projects in your preferred programming language.
We have added a [Cookbook section](https://docs.novu.co/cookbook/introduction) to our docs to provide recipes on common tasks.
All Changes
- fix: add delete provider credentials endpoint by @jainpawan21 in #3516
- feat: add remove all messages endpoint in widget by @jainpawan21 in #3523
- feat: add transactionId filter in get messages by @jainpawan21 in #3619
- feat: add ip pool override for sendgrid by @djabarovgeorge in #3646
- feat: add removeAllMessages function in react nc by @jainpawan21 in #3643
- feat: add unique handlebar helper by @jainpawan21 in #3717
- feat: add group by handlebar helper by @jainpawan21 in #3749
- Nv 2405 workflows crud controller by @BiswaViraj in #3745
- fix: add mark message read method in node sdk by @jainpawan21 in #3807
- feat(headless): add listen to notification_received in headless service by @iv-stpn in #3834
- BREAKING: Default notification feed page size is changed to 100, and will return a
hasMore
field if more than 100 notifications exist @davidsoderberg in #3631 - BREAKING: Due to performance optimizations Activity feed and subscriber API, will no return totalCount, but a
hasMore
boolean flag in case there are more results to fetch. - Nv 2578 add removeallnotifications method in headless package by @BiswaViraj in #3829
- chore(deps): update react monorepo by @renovate in #3605
- feat(infra): pause workers in bootstrap until queues are ready by @p-fernandez in #3396
- fix: Update Subscribers API allowing null by @jayavardhan3112 in #3169
- fix(deps): update dependency rxjs to v7.8.1 by @renovate in #3607
- chore(deps): update react monorepo by @renovate in #3609
- feat: add popular template by @djabarovgeorge in #3612
- feat: add feature flag check for deactive integrations by @davidsoderberg in #3618
- NV-2225 - 🐛 Bug Report: Visual bug - dual scroll in integration configuration modal by @gitstart in #3439
- feat(notification-center): smaller bundle size by @LetItRock in #3621
- feat(web): the table skeleton loading by @LetItRock in #3628
- docs: Add Termii provider documentation by @peoray in #3635
- NV-2457 - Create Tenant Repository by @djabarovgeorge in #3620
- Nv 2458 - Add Tenant Create Usecase by @djabarovgeorge in #3623
- NV 2459 - Get Tenant By ID Endpoint by @djabarovgeorge in #3629
- feat(dal): update integration entity schema for multi provider by @p-fernandez in #3625
- feat: add feature flag for multi-provider configuration by @davidsoderberg in #3617
- Add IP Pool Name In Integration by @djabarovgeorge in #3647
- fix: update how to add new provider docs by @jainpawan21 in #3653
- 🐛 CreateNotificationJobCommand fix - update templateProviderIds Map to Record. by @djabarovgeorge in #3614
- feat: refactor template preference logic by @djabarovgeorge in #3596
- Add citation file for any academic research that uses Novu by @Cliftonz in #3652
- fix(ci): debugging cypress by @p-fernandez in #3669
- NV 2418 - Integration Selection Caching by @djabarovgeorge in #3666
- Nv 2460 - Update Tenant Endpoint by @djabarovgeorge in #3638
- Add better Uptime Annoucement for System issues by @Cliftonz in #3664
- Reuse existing env variables that denotates cloud hosted instead of a new one by @Cliftonz in #3676
- Adding github actions to assist PR management and SLAs by @Cliftonz in #3651
- feat(web): integrations list page by @LetItRock in #3644
- feat(api): update get integrations endpoints by @p-fernandez in #3650
- feat: select integration usecase by @BiswaViraj in #3660
- chore(web): use is_multi_provider_configuration_enabled feature flag by @LetItRock in #3654
- feat(docs): Add Infobip SMS provider documentation by @peoray in #3636
- NV 2461 - Delete Tenant Endpoint by @djabarovgeorge in #3639
- NV 2466 - Get Tenant List by @djabarovgeorge in https://github.com/novuhq/novu/pull/...
v0.16.4
What's Changed
- fix: non existing endpoint and adding mark as read function by @ainouzgali in #3808
- Update delay.md by @iampearceman in #3728
- Add Kotlin Quickstart Guide by @mayorjay in #3720
- docs: add ruby quickstart documentation by @Eazybright in #3742
- Update Quickstart Docs by @mayorjay in #3746
- refactor: change word array to object by @Eazybright in #3751
- Update index.mdx by @scopsy in #3767
- Remove attachments on last job execution only by @scopsy in #3768
- dotnet guide by @benlin1994 in #3779
- docs: add digest email guide by @sumitsaurabh927 in #3776
- replace client with novu in dotnet quickstart by @benlin1994 in #3805
- Docs react component section update by @sumitsaurabh927 in #3810
New Contributors
- @mayorjay made their first contribution in #3720
- @Eazybright made their first contribution in #3742
- @benlin1994 made their first contribution in #3779
Full Changelog: v0.16.3...v0.16.4
v0.16.3 - Patch Release
What's Changed
- Update api-reference.md by @iampearceman in #3613
- feat: add is defined step filter docs by @jainpawan21 in #3634
- feat: add transaction id filter in get messages by @jainpawan21 in #3645
- Add IP Pool Name Override during trigger by @djabarovgeorge in #3648
- feat: add remove all messages endpoint by @jainpawan21 in #3671
- Docs: Add Nextjs, Node, and Vanilla JS quickstarts by @sumitsaurabh927 in #3691
- docs: guides on specific use cases by @sumitsaurabh927 in #3696
- Node.js & Angular Quickstart by @iampearceman in #3707
- Update get-started-with-node.js.md by @iampearceman in #3708
- Quickstart guide for Angular and Node.js by @iampearceman in #3600
Full Changelog: v0.16.1...v0.16.3
v0.16.1
What's Changed
- Nv 2215 delete messagetemplates of deleted templates by @BiswaViraj in #3524
- [NV-1812] Email Webhook Provider by @jlucidar in #3244
- add mongodb by @anragen in #3555
- fix: update prod
env
value inrun-locally.md
by @Dominic-Preap in #3569 - chore(deps): update dependency @octokit/core to v4 by @renovate in #3552
- feat: add log when segment is throwing error by @djabarovgeorge in #3584
- chore(deps): update commitlint monorepo to v17.6.5 by @renovate in #3585
- fix: throw error in push only when success count is zero by @jainpawan21 in #3519
- feat(docs): Add plivo provider documentation by @peoray in #3293
- fix(infra): remove node package strange dependencies and move to shared by @p-fernandez in #3588
- chore(deps): update dependency @types/jest to v29.5.2 by @renovate in #3586
- feat: add helm chart for novu by @jlucidar in #3535
- fix(web): show add step side menu after delete of step by @ainouzgali in #3593
- Generalize jitter function from cache and add a Delay function by @Cliftonz in #3595
- fix: widget embed path for js quick start by @davidsoderberg in #3598
- fix: widget embed path for js quick start by @davidsoderberg in #3599
- chore(deps): update dependency html-webpack-plugin to v5.5.3 by @renovate in #3591
- fix: tests & react query cache keys by @djabarovgeorge in #3540
- format code with prettier by @deepsource-autofix in #3592
- NV-2154 - 🐛 Bug Report: useFeedUnseenCount shows total feed count by @gitstart in #3358
- NV-2097 - 🚀 Feature: Allow sender name to accept dynamic values by @gitstart in #3453
- chore(deps): update nrwl monorepo by @renovate in #3601
New Contributors
- @jlucidar made their first contribution in #3244
- @anragen made their first contribution in #3555
- @Dominic-Preap made their first contribution in #3569
Full Changelog: v0.16.0...v0.16.1
v0.16.0 - Template Store and integration store improvements
What’s new in Novu 0.16.0?
TL;DR: All you need to know about the latest Novu 0.16.0 release. Template Store, Demo SMS Provider, Notification Templates Renaming and more!
0.16.0 Release Updates
We are thrilled to share the latest updates on our most recent release. Let's dive in headfirst and discover what's in store for you!
Template Store
The Novu dashboard now has a new embedded template store with ready-to-use notification workflows for everyone.
You can simply choose a sample notification workflow from the template store, modify it and be ready to trigger a notification in record time!
Demo SMS Provider
We now have a built-in SMS provider for our cloud users to test SMS notifications quickly without setting up and providing credentials for external SMS providers. It's similar to what's available for Email.
In-App Notification Center In Integration Store
The Integration Store houses the providers for all the channels: Email, SMS, Chat and Push. The In-App channel is now part of the integration store.
The configuration has been moved to the integration store now from the settings page as it was previously.
BREAKING CHANGE (Novu Self-hosted Only)
Prior to upgrading to 0.16.0, a migration script needs to be run. This migration script will create a notification center integration and activate it to allow the delivery of in app messages. If you are not using the notification center, there is no need to run the migration scripts.
To run the migrations, follow the next steps:
Clone the novu repository, and install the dependencies (npm run setup:project
)
Update the MONGO_URL to your production environment in apps/api/src/.env
file, and run the npm run migration:in-app
command from the apps/api
folder.
After running the migration script, the version can be updated.
Renaming Notification Templates To Workflows
Notification templates as we have all known it are now called Workflows. It was renamed for more consistent terminology across the entire system.
New API endpoints will be introduced in v0.17.0 and current endpoints of notification templates will be marked as deprecated.
The isDefined Filter
This new isDefined filter checks the presence of a variable. Essentially, it checks if a variable is available or not!
It works for all channels. You can check if a payload, subscriber or webhook variable is defined.
All Changes
- feat: add migration to create in app integration by @davidsoderberg in #3424
- feat: remove hmac setting in settings by @davidsoderberg in #3436
- feat(api): create feature flags module by @p-fernandez in #3426
- feat(api): add launch darkly sdk key env variable by @p-fernandez in #3428
- fix: corrected apple dev link in apns docs by @michaldziuba03 in #3433
- Nv 2333 update api to use new hmac flag on by @davidsoderberg in #3438
- feat: add check for active in app integration by @davidsoderberg in #3440
- fix: add infobip light logo variant by @michaldziuba03 in #3445
- fix(web): timed digest form fixes by @LetItRock in #3447
- feat(web): templates store modal shell by @LetItRock in #3435
- Nv 2017 onboarding start from scratch by @BiswaViraj in #3420
- docs(one-signal): Add setup documentation for onesignal push provider by @shanehandley-lived in #3451
- feat(web): templates store modal workflow preview by @LetItRock in #3450
- feat(web): templates store - templates page when there is no data show create template tiles by @LetItRock in #3457
- fix: emails null condition by @jainpawan21 in #3461
- fix: update subscriber docs by @jainpawan21 in #3404
- NV-2332 - Template Store - Add blueprint module by @djabarovgeorge in #3432
- NV-2336 - Template Store -Add grouped by category blueprints by @djabarovgeorge in #3444
- [NV-2360] fix(web): fixed the issue when visiting the same workflow template editor twice by @LetItRock in #3458
- fix: update preference docs by @jainpawan21 in #3412
- fix: add react vue angular sandpack by @jainpawan21 in #3362
- Revert "fix: add react vue angular sandpack" by @jainpawan21 in #3469
- feat(docs): Add africas-talking provider documentation by @peoray in #3355
- NV-2337 - Template Store - Add grouped blueprint cache by @djabarovgeorge in #3454
- NV-2338 - Template Store - Add blueprint invalidation by @djabarovgeorge in #3455
- NV-2335 - Template Store - Template store refactor web on blueprint creation to use by @djabarovgeorge in #3467
- feat: client points to novu cms centralized server by @djabarovgeorge in #3468
- MongoDB maxPoolSize to env variable. Refs: #3425 by @wouter-toppy in #3437
- feat(web): templates list page - create template dropdown button by @LetItRock in #3462
- feat(api): implement launch darkly node sdk by @p-fernandez in #3441
- feat: add in app card with modal in integration store by @davidsoderberg in #3472
- Nv 2204 update ux copy and links to the documentation for providers by @BiswaViraj in #3482
- fix: mantine dropdown crash by @BiswaViraj in #3492
- Nv 2366 add guides for in app by @davidsoderberg in #3478
- fix: promote step variables default values to prod by @ainouzgali in #3471
- NV-2365- Template-Store -aggregate-popular-blueprints by @djabarovgeorge in #3474
- Fix naming inconsistency - use workflows instead of templates/notifications by @ainouzgali in #3481
- fix: create and delete feed changes by @ainouzgali in #3476
- feat(web): template store integrate with api's by @LetItRock in #3475
- feat(web): template...
v0.15.0 - Scheduled Digest and Slack OAuth for webhook urls
What’s new in Novu 0.15.0?
TL;DR: All you need to know about the latest Novu 0.15.0 release. Scheduled Digest, In-App Onboarding playground, Slack Webhook URL managed flow and more!
0.15.0 Release Updates
We're excited to unveil fresh updates about our most recent release. So let's dive right in!
Scheduled Digest
Now you can schedule digest at specific intervals according to your preference. This feature eradicates the need to create cron jobs to suit your use case.
From the Novu dashboard, you can specify the times when a digest will be sent - Every two days, Daily, Weekly, etc. The Digest engine aggregates events before a set time and fires them when that time is reached.
Typical Use Case
A digest is scheduled for Tuesday and Thursday at 7:07 AM weekly. A notification event is triggered a couple of times to a subscriber every day.
The digest engine aggregates all events that occur before Tuesday. On Tuesday at 7:07am, it fires an event comprising all the aggregated events. Similarly, all events occurring between Tuesday and Thursday are aggregated, and an event is fired on Thursday at 7:07am. This cycle continues.
Note: For now, the time is UTC-based. We plan to make it user-timezone aware soon!
In-App Onboarding Playground
We have integrated a new playground in our onboarding flow to test and explore In-App notifications. So take it for a spin!
Slack Webhook URL Managed Flow
Until now, developers had to manually spin up and deploy an https server with an endpoint to listen for redirect requests. They had to follow numerous steps to get Slack webhook Url generation right and working seamlessly for subscribers.
Now, Novu manages the OAuth flow for you. No more spinning of servers! All you need to do is:
- Add
https://api.novu.co/v1/subscribers/
to the Redirect URL in OAuth & Permissions on your Slack Developer Dashboard. - Add the
Add to Slack
button or the shareable URL to your application to request access permission (scope: incoming-webhook). More information here
Africa's Talking SMS Provider Integration
Now, you can use the Africa's talking SMS provider on Novu.
OneSignal Push Provider Integration
Now, you can use the OneSignal Push provider on Novu.
Push Webhook
Now you can add a webhook URL to trigger push notifications on Novu.
There is work ongoing for Email Webhook Provider. You can follow the commits here
All Changes
- fix: suscriber response dto by @jainpawan21 in #3276
- fix: office 365 email provider is failing by @ainouzgali in #3295
- feat: add api response custom decorator by @jainpawan21 in #3289
- fix: add missing invalidation by @djabarovgeorge in #3294
- fix: remove allOf in custom ApiResponse decorator by @jainpawan21 in #3296
- Update discord.md by @bigpreshy in #3299
- chore(docs): Update the email and sms provider docs by @peoray in #3292
- fix: fixed font size of created at by @ayush4345 in #3278
- chore(deps): remove @types/handlebars by @shanehandley-lived in #3301
- fix(chat): Try all chat channels by @ryshoooo in #3136
- Migration script for expireAt by @ainouzgali in #3284
- feat: add instrument, combine subscriber+job processing by @ainouzgali in #3308
- feat: add redirect url to slack by @djabarovgeorge in #3304
- fix: remove global g tag from content replace for preheader by @scopsy in #3252
- fix: merge template status to parent change by @djabarovgeorge in #3307
- Update digest.md by @david-morris in #3291
- Add message count limit by @djabarovgeorge in #3272
- fix(worker): enabling autopipelining in the cache service of worker by @p-fernandez in #3318
- v0.15.x by @scopsy in #3319
- fix: iframe nc width issue by @BiswaViraj in #3320
- Feat[NV-1868]: Initial Queue Metric Monitoring by @Cliftonz in #3281
- removed typo by @fadkeabhi in #3315
- Revert "removed typo" by @p-fernandez in #3322
- Remove readonly on allowed domains by @djabarovgeorge in #3317
- Bulk write for execution details by @ainouzgali in #3321
- Create Novu redirect url for Slack by @djabarovgeorge in #3305
- Removed typo by @fadkeabhi in #3324
- fix(cypress): leftover only in tests by @p-fernandez in #3328
- Add notification group endpoints by @peoray in #3274
- fix: add sender name option in mailjet by @jainpawan21 in #3303
- chore(deps): update dependency typedoc to ^0.24.0 by @renovate in #3271
- feat: alternative to job insertOne by @ainouzgali in #3329
- feat: Add OneSignal as push provider by @TNAJanssen in #3155
- feat: Add Push Webhook provider by @TNAJanssen in #3266
- Nv 2214 add marknotificationsasseen prop in by @BiswaViraj in #3335
- feat: add is not empty tests by @djabarovgeorge in #3333
- feat(provider): Add africastalking provider by @peoray in #3249
- fix: add node crash by @BiswaViraj in #3334
- feat: implement git submodules by @LetItRock in #3297
- feat: remove notification update for channels by @ainouzgali in #3347
- Remove unnecessary find notification by @ainouzgali in #3348
- feat: remove query to message templates by @ainouzgali in #3351
- feat: validate notification group by @djabarovgeorge in #3323
- No query for subscriber preference, cache subscriber by @ainouzgali in [https://github.com/nov...
v0.14.0 - Performance optimization and redesigned workflow editor
What’s new in Novu 0.14.0?
TL;DR: All you need to know about the latest Novu 0.14.0 release. Performance optimization, Workflow UI Editor, Data expiration, Headless Notification Center and more!
0.14.0 Release Updates
We're stoked to share new updates on our latest release. Let's dig in!
Performance Optimization
We have worked extremely hard to improve the core performance of Novu. I'll highlight crucial things to note and be aware of:
- Improved Caching.
- Optimized Indexes. Indexes are defined on each schema file at the bottom.
New Worker Service
Breaking Change: A new service is required to run with Novu called @novu/worker
, extracted from the @novu/api
monolith to ensure that queues and jobs are processed faster. Novu Cloud users do not need to be concerned about this change.
Novu self-hosted users can now scale the worker service independently as much as the hardware their hosted domain runs on.
For Novu self-hosted users running on Docker, it is now necessary to pull in the new worker service image in order for Novu to work properly. This is already taken care of here & here. When you run docker-compose up, the worker image will be automatically pulled in. No extra steps are needed.
Data Expiration
The Jobs and Messages collection now has a TTL and will be removed from the database when it expires. For Novu cloud users, notifications and activity feed data will be saved for 1 month, while in-app messages will be saved for 6 months. After that time, the records will be archived.
For Novu self-hosted users, the same time frame applies before records will be deleted. However, they can disable the TTL setting by adding the environment variable DISABLE_TTL=true
.
Affected schemes:
- Notification (for 1 month)
- Job (for 1 month)
- Message (for in-app messages - 6 months, for all other messages - 1 month)
- Execution Details (for 1 month)
New Workflow UI Editor
We're constantly iterating on the UI editor to reduce the number of clicks needed to perform specific actions, improve the UX, and provide a great experience in setting up notification workflows.
In this release, we simplified the workflow editor UI like so:
Headless Notification Center
You might have heard the phrase: “Bring Your Own...” or something along those lines.
We encourage you to bring your UI with the newly released framework-agnostic headless version of Novu's notification center.
This lightweight library allows you to incorporate our notification system into any framework or vanilla JavaScript app without UI constraints. Install and call the API methods needed to access the notification system.
Install:
npm install @novu/headless
Use:
import { HeadlessService } from '@novu/headless';
You can now fetch all In-App notifications shown like so:
const headlessService = new HeadlessService({
applicationIdentifier: 'APP_ID_FROM_ADMIN_PANEL',
subscriberId: 'USER_ID',
backendUrl: 'YOUR_BACKEND_URL',
socketUrl: 'YOUR_SOCKET_URL',
});
headlessService.initializeSession({
listener: (session) => {
console.log(session);
},
onSuccess: (session) => {
console.log(session);
},
onError: (error) => {
console.error(error);
},
});
headlessService.fetchNotifications({
listener: ({ data, error, isError, isFetching, isLoading, status }) => {
console.log({ data, error, isError, isFetching, isLoading, status });
},
onSuccess: (response: IPaginatedResponse<IMessage>) => {
console.log({response.data, response.page, response.totalCount, response.pageSize});
},
page: 1, // page number to be fetched
});
Maqsam SMS Provider Integration
Now, you can use the Maqsam SMS provider on Novu.
Termii SMS Provider Integration
Now, you can use the Termii SMS provider on Novu.
SMSCentral SMS Provider Integration
Now, you can use the SMSCentral SMS provider on Novu.
Sparkpost SMS Provider Integration
Now, you can use the Sparkpost SMS provider on Novu.
All Changes
- feat: add faq page for notification center by @jainpawan21 in #2848
- fix: layout docs by @jainpawan21 in #2947
- change method from remove to delete by @AvinashUtekar in #3054
- feat: reduce min pool size by @ainouzgali in #3068
- fix: remove activity and add notification tag by @jainpawan21 in #3065
- fix: update nc demo commands by @jainpawan21 in #3080
- fix: save userhash for intercom in getmyprofile usecase by @jainpawan21 in #3081
- fix: add missing authmodule import in layout module by @jainpawan21 in #3077
- feat: add webpushconfig and update sidebar positions by @jainpawan21 in #3067
- fix: Node client bulk trigger by @szbartnik in #3066
- chore(docs): disabling Google Analytics by @andrewgolovanov in #3087
- docs: change introduction messaging by @sumitsaurabh927 in #3082
- fix(deps): update dependency mongoose to v6.10.4 by @renovate in #3089
- fix(deps): update nest monorepo to v9.3.12 by @renovate in #3091
- fix(deps): update dependency styled-components to v5.3.9 by @renovate in #3090
- chore(deps): update dependency @commitlint/cli to v17.5.0 by @renovate in #3092
- chore(deps): replace dependency rollup-plugin-node-resolve with @rollup/plugin-node-resolve ^6.0.0 by @renovate in #3037
- chore(deps): update dependency @nestjs/cli to v9.3.0 by @renovate in #3093
- feat(api): create webhook filter backoff strategy use case by @p-fernandez in #3086
- chore(deps): update dependency jasmine-core to ~4.6.0 by @renovate in #3094
- chore(deps): update dependency rxjs to v7.8.0 by @renovate in #3095
- Job grouping by @davidsoderberg in #3011
- fix: delay metadata should show if active index is zero by @ainouzgali in #3104
- fix: upgrade bullmq versions by @scopsy in #3105
- chore: add nb and sv translations for notification actions by @katyaterletskaya in #3110
- feat(api): delete topic endpoint by @p-fernandez in #3099
- feat: refactor cache functions by @djabarovgeorge in #3079
- feat: cache notification template by trigger identifier by @djabarovgeorge in #3074
- feat: Maqsam SMS provider added by @adriantoro26 in #3055
- chore(cspell): add provider name to cspell by @p-fernandez in #3115
- NV-1915 - 🐛...