v0.12.0 - Polishing Season 💅
What’s new in Novu 0.12.0?
TL;DR: All you need to know about the latest Novu 0.12.0 release. New Onboarding experience, Actor Filtering, Custom subscriber properties, Email overrides, bug fixes, UI polishing and more!
0.12.0 Polishing Release Updates
This release contains exciting updates for existing and new users of Novu. Fun fact, more than 170 polishing issues were resolved in this release. Let's dig in!
New Onboarding Experience for Notification Center
We shipped a new onboarding experience for adding the notification center to existing apps. Check it out below:
Sign up and set up your app with the notification center swiftly!
Actor Filtering for Topics
This feature is great for users of topic-based notification. By default, it excludes an actor responsible for the action of a triggered notification on a topic event.
Typical Use Case:
The comment section of a post. Jane, John, and Doe made comments on a post. When Prosper makes a comment on the post, these users (Jane, John and Doe) should get a notification about the recent comment, but Prosper should not receive a notification on his recently created comment.
const topicKey = 'posts:comment:12345';
await novu.trigger('template-name', {
to: [{ type: 'Topic', topicKey: topicKey }],
payload: {},
actor: { subscriberId: '<SUBSCRIBER_ID_OF_ACTOR>' },
});
Node SDK Usage: Actor filtering
PR: #2691
Support for cc, bcc, and multiple to for E-mail
Now, you can use the overrides object to allow for multiple to
, bcc
, and cc
when triggering the email channel.
await novu.trigger('template-name', {
to: 'subscriberId',
payload: {...data},
overrides: {
email: {
to: ['[email protected]'],
bcc: ['[email protected]'],
cc: ['[email protected]']
}
}
});
Node SDK Usage: E-mail support for cc,bcc and multiple to
The to
property will be merged with the subscriber recipient email to avoid duplicates.
Also text
can be passed as an override that will send the text
version of the email along side the HTML for old clients.
PR: #2763
Use Custom Sender Name on Template
Before now, the sender name was defined only on the provider integration. So, all the emails triggered had the same sender name.
Before: Integration store - Provider Integration
Now, you can define a custom sender from name on the template level. If empty, Novu will fallback to the sender name defined on the provider integration.
Now: Sender Name from Template
PR: #2769
Typical Use Case
Each template can serve a different purpose, depending on the type of email content. Specifying different sender names for different templates makes the email content different.
PR: #2769
Bulk Trigger Endpoint
Previously, the only way to trigger events as many times as possible was to loop the trigger call.
await novu.trigger('<template-name>', {
to: [
{
subscriberId: '<UNIQUE_IDENTIFIER>',
email: '[email protected]',
firstName: 'John',
lastName: 'Doe',
},
],
payload: {
name: 'Hello World',
organization: {
logo: '<https://happycorp.com/logo.png>',
},
},
});
Node SDK Usage: Trigger event
Now, Novu has a new bulk trigger endpoint, /events/trigger/bulk
.
This endpoint allows simply passing in an array of events to the like so:
await novu.bulkTrigger([
{ eventId: "my-event", to: "subscriber-id", payload: myPayload },
{ eventId: "my-event-2", to: "subscriber-id-2", payload: myPayload2 }
]);
Node SDK Usage: Bulk Trigger events
PR: #2704
Custom Subscriber Properties
Now, custom subscriber properties can be added using the data
key via the API or SDK like so:
Typical Use Case
You can leverage using the data key if you need to add some metadata (e.g date of birth, gender) to the subscriber. The data added is also available in templates.
API reference: The property can be set directly via the create & update subscriber API.
...
await novu.subscribers.identify(user.id, {
email: user.email,
firstName: user.firstName,
lastName: user.lastName,
phone: user.phone,
avatar: user.profile_avatar
data: {
dob: user.dob
gender: user.gender
}
});
Node SDK usage - Create Subscriber
PR: #2707
Resend Email Provider Integration
Now, you can use the Resend email provider on Novu.
PR: #2802
Changes & Bug Fixes:
- Trouble with apostrophe’s sending SMS across SMS providers. It was converting them to unicode characters. Now it works correctly. #2797
- Change prompt showing up when there's no change made to a saved notification template. Now, it only shows the prompt when a change has been made. #2674
- More fields added for APNS Integration. #2798
- Android and APNS properties added to fcm message overrides by in #2645
All changes
- Update README.md by @Agathe-Brusset in #2626
- Bug report wrong provider id stored in jobs collection #2577 by @tsssdev in #2606
- chore(deps): update dependency rollup to ^0.68.0 by @renovate in #2622
- fix: Ask for SNS Region by @JoeyEamigh in #2568
- fix: test send email with novu email integration by @davidsoderberg in #2638
- Refactor hooks naming by @davidsoderberg in #2605
- docs: add layouts documentation by @ainouzgali in #2637
- Reply callbacks by @djabarovgeorge in #2639
- add plivo webhook parser by @mocherfaoui in #2446
- chore(deps): update dependency rollup-plugin-polyfill-node to ^0.12.0 by @renovate in #2623
- chore(deps): update dependency eslint-plugin-react to v7.32.2 by @renovate in #2641
- fix(docs): update notification center docs by @jainpawan21 in #2304
- Dockerfile tests on PR's by @scopsy in #2602
- feat: add webhook parser for NetCore (email) by @abhilipsasahoo03 in #2372
- v0.11.0 by @scopsy in #2649
- fix: missing env by @scopsy in #2651
- feat(docs): add web app env variables and warning docs by @p-fernandez in #2646
- fix(logrocket): add babel plugin for flow analysis by @Cliftonz in #2632
- feat(docs): add examples of the layouts api in the package by @p-fernandez in #2648
- chore(deps): update dependency start-server-and-test to v1.15.3 by @renovate in #2653
- chore(deps): update dependency standard-version to v9.5.0 by @renovate in #2652
- fix(infra): remove standard-version package as being unused by @p-fernandez in #2659
- chore(deps): update dependency tsconfig-paths to v3.14.1 by @renovate in #2655
- chore(deps): update dependency typedoc to ^0.23.0 by @renovate in #2658
- chore(deps): update dependency jira-prepare-commit-msg to v1.7.2 by @renovate in #2663
- chore(cspell): update cspell by @Cliftonz in #2613
- chore(deps): update dependency webpack-dev-server to v4.11.1 by @renovate in #2664
- chore(deps): update localstack/localstack docker tag to v0.14.5 by @renovate in #2667
- docs(notification-center): api reference page in #2631
- fix: so no global style are applied by @davidsoderberg in #2670
- Feat in app code editor by @davidsoderberg in #2660
- chore(deps): update nrwl monorepo to v13.10.6 by @renovate in #2668
- chore(deps): update dependency typescript to v4.9.5 by @renovate in #2661
- chore(deps): update dependency @types/express to v4.17.17 by @renovate in #2677
- Fix: Subject named variable not assigning by @chavda-bhavik in #2676
- chore(deps): update dependency ts-loader to ~9.4.0 by @renovate in #2678
- chore(deps): update pnpm to v7.26.3 by @renovate in #2672
- chore(deps): update pnpm/action-setup action to v2.2.4 by @renovate in #2679
- chore: polishing season by @nevo-david in #2683
- fix: size of email content "too large" by @ainouzgali in #2680
- chore(deps): update supercharge/mongodb-github-action action to v1.8.0 by @renovate in #2681
- chore(deps): update supercharge/redis-github-action action to v1.4.0 by @renovate in #2682
- Updating Cypress from version 12.1.0 to 12.3.0 by @RobertoCassino in #2669
- feat(logrocket): add request sanitizing and add username& email to sessions by @Cliftonz in #2662
- fix: missing indexes for count query by @scopsy in #2694
- fix: add actor object to the promote message usecase by @ainouzgali in #2693
- fix(web): activity feed tooltip issue by @LetItRock in #2687
- fix: update of integration to active did not exclude push and chat by @ainouzgali in #2695
- fix(web): fixed the template editor react-hook-form dirty state by @LetItRock in #2674
- NV-1582 bug report node package does not allow by @scopsy in #2701
- Add cont path static by @vfxGer in #2696
- chore(deps): update update jest packages by @renovate in #2686
- feat: Implement rename organization by @Abobos in #2634
- fix(deps): update dependency @aws-sdk/client-ses to v3.266.1 by @renovate in #2706
- NV-1453: feature request of bulk trigger by @scopsy in #2704
- feat: add link to github issue to sidebar by @BiswaViraj in #2712
- feat(web): activity feed fill the filters on chart bar click by @LetItRock in #2705
- feat: support of custom properties for subscribers #2393 by @tsssdev in #2707
- feat: added share feedback to open github issue through command palette by @BiswaViraj in #2715
- Fix for the invite link for members not including the context path by @vfxGer in #2710
- feat: populate susbcriber in notification feed by @mocherfaoui in #2633
- feat: exclude actor from topic event by @ainouzgali in #2691
- fix: so previous change id is used on delete change for notification template by @davidsoderberg in #2713
- fix: shows wrong notification styles by @ainouzgali in #2717
- Static url fix by @vfxGer in #2709
- fix(api): api docs not generated and added more e2e tests by @p-fernandez in #2665
- GitHub actions EU by @scopsy in #2721
- chore(deps): update update rollup packages by @renovate in #2688
- chore(deps): update pnpm to v7.27.0 by @renovate in #2708
- fix(deps): update dependency @nestjs/graphql to v10.2.0 by @renovate in #2725
- fix(deps): update dependency @infobip-api/sdk to ^0.2.0 by @renovate in #2724
- fix(deps): update dependency @sentry/hub to v7.37.1 by @renovate in #2732
- fix(deps): update dependency @aws-sdk/client-ses to v3.267.0 by @renovate in #2723
- fix(deps): update dependency mailparser to ^0.6.0 by @renovate in #2734
- fix(deps): update dependency mixpanel to ^0.17.0 by @renovate in #2735
- fix(deps): update dependency mongoose to v6.9.1 by @renovate in #2736
- fix(deps): update dependency newrelic to v9.10.0 by @renovate in #2737
- fix(deps): update dependency react-css-theme-switcher to ^0.3.0 by @renovate in #2738
- NV-1528 Remove Email.js provider by @scopsy in #2740
- chore: updated readme.md by @nevo-david in #2745
- feat: add what filters was used for step to analytic event by @davidsoderberg in #2749
- docs(topic): Replace enum with string for simplified understanding in #2750
- fix(docs): unnoticed casing problem in the examples by @p-fernandez in #2753
- fix: so empty string can not be used as default value by @davidsoderberg in #2757
- fix: after late comment by @davidsoderberg in #2764
- fix: improve 'no' translations by @katyaterletskaya in #2765
- Polishing: Some design issues #2744 by @nikitagrossman in #2759
- fix: proper error handling for missing subscriber on preference update by @scopsy in #2754
- feat: add overrides for email providers by @davidsoderberg in #2763
- fix(api): implement distributed lock to fix digest concurrency issues by @p-fernandez in #2719
- NV-538 - Change Z-index for user profile dropdown to overlay the loader in notification template screen by @gitstart-novu in #2791
- NV-1588 - Execution Details modal Should include Template name by @gitstart-novu in #2792
- feat: converting apostrophes in variables correctly by @davidsoderberg in #2797
- feat: add more integration fields for apns by @davidsoderberg in #2798
- feat: make sender name an input field for email card by @davidsoderberg in #2769
- fix: existing user cannot be invited to the org by @LetItRock in #2585
- fix(infra): upgrade and clean dependencies for provider creation script by @p-fernandez in #2800
- [New Email Provider]: Add Resend Email API to Email Providers in Integration Store by @unicodeveloper in #2802
- chore: added notifications directory by @nevo-david in #2812
- fix(deps): update dependency axios to v1.3.3 by @renovate in #2733
- feat: add labels and tooltip to inbox view by @davidsoderberg in #2815
- chore(deps): update commitlint monorepo to v17.4.3 by @renovate in #2814
- feat: hide content of textarea with multiline keys by @davidsoderberg in #2816
- chore(deps): update dependency @types/inquirer to v8.2.6 by @renovate in #2820
- chore(deps): update dependency @types/react-dom to v17.0.19 by @renovate in #2821
- [Docs Update]: Add Resend documentation & Update Existing Email Provider docs by @unicodeveloper in #2823
- feat(wip): add in app activated support on the web by @djabarovgeorge in #2703
- fix: Digest key does not allow specifying a nested payload key #2697 by @tsssdev in #2726
- Nv 942 bug report no way to reset destroy the by @BiswaViraj in #2811
- fix(api): skip test to unblock ci by @p-fernandez in #2827
- NV-540 - After clearing notification name field - error is not shown again by @gitstart-novu in #2801
- fix: allow step filtering by nested payload/subscriber data by @chauandrew in #2794
- chore(deps): update dependency start-server-and-test to v1.15.4 by @renovate in #2822
- chore(web): skip e2e tests that are doing Github login by @LetItRock in #2824
- feat: add analytics event to track usage of provider webhooks by @davidsoderberg in #2832
- chore(deps): update commitlint monorepo to v17.4.4 by @renovate in #2831
- fix(deps): update dependency react-refresh to ^0.14.0 by @renovate in #2741
- Nv 1130 generic error message should point at by @ainouzgali in #2836
- chore(deps): update pnpm to v7.27.1 by @renovate in #2833
- fix(deps): update dependency mongoose to v6.9.2 by @renovate in #2837
- feat: converts urls to enum by @BhuvaneshPatil in #2383
- fix(deps): update dependency sharp to ^0.31.0 by @renovate in #2839
- fix(deps): update dependency @sentry/hub to v7.37.2 by @renovate in #2841
- fix(deps): update dependency newrelic to v9.10.1 by @renovate in #2844
- chore(deps): update supercharge/redis-github-action action to v1.5.0 by @renovate in #2845
- style: copy text static by @nikitagrossman in #2847
- fix: Test workflow triger button by @nikitagrossman in #2842
- fix: add info for saas only in inbound parse webhook by @jainpawan21 in #2846
- fix(deps): update dependency @aws-sdk/client-ses to v3.272.0 by @renovate in #2852
- chore(web): clear e2e branding test by @LetItRock in #2854
- feat: add analytics by @djabarovgeorge in #2840
- refactor: auth and spotlight context to be own hooks by @davidsoderberg in #2851
- Nv 1576 make default layout changes dependent by @BiswaViraj in #2711
- fix: reset page number on tab switch by @BiswaViraj in #2862
- feat(providers): add tls options to nodemailer by @p-fernandez in #2044
- feat: add colorscheme prop for embed by @BiswaViraj in #2863
- fix(cypress): properly reflect the behaviour in the tests for nodemailer by @p-fernandez in #2865
- feat(api): refactor of trigger event by @p-fernandez in #2825
- NC - dropdown menu with remove message and read unread action by @ainouzgali in #2766
- fix: light mode text color in error popover by @ainouzgali in #2867
- feat: remove demo by @djabarovgeorge in #2868
- fix(api): notifications controller - notification id validation by @LetItRock in #2871
- fix: update and rename no.ts to nb.ts by @katyaterletskaya in #2870
New Contributors
- @Agathe-Brusset made their first contribution in #2626
- @tsssdev made their first contribution in #2606
- @KristofDeTroch made their first contribution in #2645
- @RobertoCassino made their first contribution in #2669
- @vfxGer made their first contribution in #2696
- @unicodeveloper made their first contribution in #2750
- @nikitagrossman made their first contribution in #2759
- @gitstart-novu made their first contribution in #2791
- @chauandrew made their first contribution in #2794
Full Changelog: v0.11.0...v0.12.0