{
  "version": 3,
  "sources": ["ssg:https://framerusercontent.com/modules/zanwHA338SeRz3Y0dF79/bA1itqVMcGTG8vNm331D/qp7_CWH9V-4.js"],
  "sourcesContent": ["import{jsx as e,jsxs as t}from\"react/jsx-runtime\";import{ComponentPresetsConsumer as n,Link as o}from\"framer\";import{motion as i}from\"framer-motion\";import*as a from\"react\";import{Youtube as r}from\"https://framerusercontent.com/modules/NEd4VmDdsxM3StIUbddO/bZxrMUxBPAhoXlARkK9C/YouTube.js\";import s from\"https://framerusercontent.com/modules/pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js\";export const richText=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"Web push notifications are a powerful tool for keeping users engaged with web apps even when they're not actively using them. For a long time, developers using Apple devices have been \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/blog/ios-web-push-notifications/%7B%7Bsite.url%7D%7D/blog/is-ios-safari-push-notifications-coming-in-ios-15/\",nodeId:\"qp7_CWH9V\",openInNewTab:!0,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"waiting for iOS to support this feature\"})}),\". Finally, Apple has added support for web push notifications in iOS 16.4, which is great news for developers and users alike. This is a significant step forward for progressive web apps (PWAs) on iOS, as push notifications were previously a limiting factor for their adoption on Apple devices. With this new support, PWAs can now offer a more seamless and engaging user experience, helping to drive increased adoption and usage. However, websites cannot request for push notification unless you add them to your homescreen. \",/*#__PURE__*/e(\"strong\",{children:\"Here is how you can do that in iOS 16.4\"}),\" \"]}),/*#__PURE__*/e(\"p\",{children:\"Step 1: Open safari web browser, and navigate to your favorite website that supports web push notifications. \"}),/*#__PURE__*/e(\"p\",{children:'Step 2: Click the share button and choose \"Add to homescreen\" '}),/*#__PURE__*/e(\"p\",{children:\"Step3: Goto your homescreen, and click the new icon that has been added. \"}),/*#__PURE__*/e(\"p\",{children:\"Step4: Click on the button (or a CTA) where you usually click to subscribe to notifications. \"}),/*#__PURE__*/e(\"p\",{children:\"Step5: A push notification permission prompt appears. Just click allow and you're done!\"})]});export const richText1=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"When changing the password of any account or upon successfully signing up for any app, people immediately receive a confirmation mail. This is what we call transactional email. Transactional email services are crucial to any online business. They help in building a positive customer experience as well as brand loyalty. Welcome emails, password confirmation, password resets, order confirmation, etc., fall under transactional email services. Transactional email can be sent one person at a time. But that's not an issue. The real issue lies in finding the best transactional email service providers. Hence, we came up with this post to offer a better understanding of the same.\"}),/*#__PURE__*/e(\"h2\",{children:\"Best Transactional Email Providers in 2022\"}),/*#__PURE__*/e(\"p\",{children:\"Listed below are the top Email APIs that can deliver transactional email services much faster:\"}),/*#__PURE__*/e(\"h3\",{children:\"SendGrid\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:\"https://sendgrid.com/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"SendGrid\"})}),\" started in 2009 as a simple email API but has now become a full-fledged platform offering a wide range of services, including transactional email services. There is also a range of email marketing tools that one can make use of. Being a cloud-based service, it is fast and reliable and comes with customisable integration. SendGrid comes with a mobile app, so one can easily share it with their team. It makes an excellent choice for users looking for an all-in-one service, including engagement tools, marketing automation and transactional email.\"]}),/*#__PURE__*/e(\"h4\",{children:\"Pricing:\"}),/*#__PURE__*/t(\"ul\",{style:{\"--framer-font-size\":\"20px\",\"--framer-text-alignment\":\"start\",\"--framer-text-color\":\"rgb(209, 213, 219)\",\"--framer-text-transform\":\"none\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"10,000 emails for $14.95 per month\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"300,000 emails for $249 per month\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"1 million emails for $449 per month\"})})]}),/*#__PURE__*/e(\"h3\",{children:\"Hubspot\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:\"https://hubspot.com/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Hubspot\"})}),\" email APIs are specially designed for marketers and offer plenty of features like forms, email marketing, landing pages, automation, etc. The platform gives the flexibility to opt for selected tools or use the platform as a whole. With its integration with the Hubspot CRM, you can customise your email campaigns to a great extent. With HubSpot\u2019s Transactional Email, you can send relationship-based emails to users. Send automated commerce receipts, account updates, and system messages with full engagement tracking across all of your emails with hubspot transactional email.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Amazon SES\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:\"https://aws.amazon.com/ses/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Amazon Simple Email Service\"})}),\" is a part of the Amazon Web Services Platform and is extremely cheap in terms of price. Amazon SES can help you save a lot of money. The email provider, however, relies heavily on manual work like processing spam complaints or providing email analytics. The platform can be used to \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"send transactional notifications\"})}),\", marketing communications, and for receiving emails.\"]}),/*#__PURE__*/e(\"h4\",{children:\"Pricing:\"}),/*#__PURE__*/t(\"ul\",{style:{\"--framer-font-size\":\"20px\",\"--framer-text-alignment\":\"start\",\"--framer-text-color\":\"rgb(209, 213, 219)\",\"--framer-text-transform\":\"none\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"60,000 emails for free After 60k,\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"10,000 emails for $1 per month\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"300,000 emails for $30 per month\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"1 million emails for $100 per month\"})})]}),/*#__PURE__*/e(\"h3\",{children:\"Postmark\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:\"https://postmarkapp.com/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Postmark\"})}),\" is a highly reliable and extremely fast platform for sending transactional emails. It was introduced in 2009 and has come a long way since then. Postmark comes with pre-built email templates for welcome emails, password resets, trial expirations, user invitations, comment notifications and more, thus giving the users complete freedom to customise each template as per their needs. Furthermore, the platform does not mix promotional and transactional messages, thus protecting crucial emails. Postmark is the only email provider that shares delivery time publicly\"]}),/*#__PURE__*/e(\"h4\",{children:\"Pricing:\"}),/*#__PURE__*/t(\"ul\",{style:{\"--framer-font-size\":\"20px\",\"--framer-text-alignment\":\"start\",\"--framer-text-color\":\"rgb(209, 213, 219)\",\"--framer-text-transform\":\"none\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"10,000 emails for $10 per month\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"300,000 emails for $200 per month\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"1 million emails for $535 per month\"})})]}),/*#__PURE__*/e(\"h3\",{children:\"Mandrill\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:\"https://mandrillapp.com/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Mandrill\"})}),\" started as a transaction email provider by Mailchimp but now comes as an add-on for already existing \",/*#__PURE__*/e(o,{href:\"https://mailchimp.com/automations/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Mailchimp\"})}),\" users. For users having now Mailchimp account, it can appear a bit expensive. It comes with a searchable activity log and allows the users to customise the tracking options. The platform is heavily used for sending data-driven emails and personalised one-to-one messages. The pre-built dashboard makes it easier for the users to use this platform.\"]}),/*#__PURE__*/e(\"h4\",{children:\"Pricing:\"}),/*#__PURE__*/t(\"ul\",{style:{\"--framer-font-size\":\"20px\",\"--framer-text-alignment\":\"start\",\"--framer-text-color\":\"rgb(209, 213, 219)\",\"--framer-text-transform\":\"none\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"10,000 emails for $20 per month + the price of your regular Mailchimp subscription\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"300,000 emails for $240 per month + the price of your regular Mailchimp subscription\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"1 million emails for $720 per month + the price of your regular Mailchimp subscription\"})})]}),/*#__PURE__*/e(\"h3\",{children:\"Mailgun\"}),/*#__PURE__*/t(\"p\",{children:[\"Over the years, \",/*#__PURE__*/e(o,{href:\"https://mailgun.com/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Mailgun\"})}),\" has been acquired by a lot of companies, including Pathwire at the beginning of 2021 and Sinch after that. It is now a part of a larger ecosystem of messaging services. Mailgun is specially meant for developers to help them send, receive and track emails. The flexible API makes it quite easier to integrate Mailgun into one's application. The platform is known to scale as per users' needs. Also, there is support for marketing campaign emails.\"]}),/*#__PURE__*/e(\"h4\",{children:\"Pricing:\"}),/*#__PURE__*/t(\"ul\",{style:{\"--framer-font-size\":\"20px\",\"--framer-text-alignment\":\"start\",\"--framer-text-color\":\"rgb(209, 213, 219)\",\"--framer-text-transform\":\"none\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"10,000 emails for $8 per month\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"300,000 emails for $235 per month\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"1 million emails for $650 per month\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"Conclusion\"}),/*#__PURE__*/t(\"p\",{children:[\"Email APIs have a big role to play in today's competitive market. Hence, no matter the nature of the business, one must invest in any of the transactional email service providers based on their requirements. The above-mentioned list features the best providers, both in terms of pricing and features, hence are good to go. If you're looking for a service to \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/blog/top-six-transactional-email-services-in-2022/%7B%7Bsite.url%7D%7D/tools/disposable-email-detector\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"disposable email addressess\"})}),\", please check our tools section.\"]})]});export const richText2=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Now you can use your AWS SES service as a provider in Engagespot to send email notifications.\"}),/*#__PURE__*/e(\"h2\",{children:\"What is AWS SES?\"}),/*#__PURE__*/e(\"p\",{children:\"Amazon SES is a cloud email service provider that can integrate into any application for bulk email sending. Amazon SES also supports a variety of deployments including dedicated, shared, or owned IP addresses. Reports on sender statistics and a deliverability dashboard help businesses make every email count.\"}),/*#__PURE__*/e(\"h2\",{children:\"AWS SES Pricing\"}),/*#__PURE__*/t(\"p\",{children:[\"Engagespot do not charge any additional cost to connect your AWS SES account. You just pay as per your SES usage. With the AWS free tier, you can send around 60k emails per month. To know more about SES pricing, refer \",/*#__PURE__*/e(o,{href:\"https://aws.amazon.com/ses/pricing/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"AWS SES Pricing\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"How to connect AWS SES with Engagespot\"}),/*#__PURE__*/t(\"p\",{children:[\"The steps to configure AWS SES provider in your Engagespot account is described in our \",/*#__PURE__*/e(o,{href:\"https://documentation.engagespot.co/docs/channels/configuring-providers/email/ses\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"documentation\"})}),\". If you get an unauthorized error from AWS SES, refer \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/blog/errors/amazon-ses-unauthorized-error-sendEmail-sendRawEmail/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"this guide\"})}),\".\"]})]});export const richText3=/*#__PURE__*/e(a.Fragment,{children:/*#__PURE__*/t(\"p\",{children:[\"With our built in notification preference center, your users can easily set notification preferences, right from the notification center. Engagespot is trying to build a \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/product\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"complete notification system\"})}),\" for your product. And allowing users to manage their notification preference is an important part of a notification system. \",/*#__PURE__*/e(\"strong\",{children:\"How to enable preference center in your notification center\"}),\" If you're using our react component \",/*#__PURE__*/e(\"code\",{children:\"@engagespot/react-component\"}),\", just upgrade the package to the latest version and there you go. Open your notification center and you can see the notification preference center. If you're using the cdn hosted javascript library, you don't have to do anything because we've updated our cdn with the latest version of Engagespot library. \",/*#__PURE__*/e(\"strong\",{children:\"How to configure preference center for your users\"}),\" For the notification preference center to be useful, you should categorize notifications. You can use the \",/*#__PURE__*/e(\"code\",{children:\"category\"}),\" parameter in the send notifications API. (Unfortunately, creating and managing categories is available only through REST API operations currently, and not avaialble on the Engagespot dashboard.) When you create a category in your App, users will get the choice to select which notification channels to be enabled for a particular category. And whenever you send a notification with \",/*#__PURE__*/e(\"code\",{children:\"category\"}),\" parameter, it will check your user's preference for that particular category before delivering notifications to them. Detailed documentation on how to create and update categories in your App, please read \",/*#__PURE__*/e(o,{href:\"https://documentation.engagespot.co/docs/rest-api\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"REST API Doc\"})})]})});export const richText4=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"We've launched our \",/*#__PURE__*/e(o,{href:\"https://bubble.io/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Bubble.io\"})}),\" plugin to help you add notifications to your Bubble app without writing a single line of code. \"]}),/*#__PURE__*/t(\"p\",{children:[\"Engagespot Bubble notifications plugin comes with a lot of features to add a \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/product\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"complete notification system\"})}),\" to your product. \"]}),/*#__PURE__*/t(\"p\",{children:[\"The most important feature is the Notification Bell component that helps you to add a beautiful, customizable notification inbox feed to your Bubble App. Also, you can deliver notifications to app users via multiple channels like In-App, Push & Email, \",/*#__PURE__*/e(o,{href:{pathVariables:{j3iVCCRMx:\"how-to-send-push-notifications-with-bubble\"},unresolvedPathSlugs:{j3iVCCRMx:{collectionId:\"qp7_CWH9V\",collectionItemId:\"X7Ulf1Hkl\"}},webPageId:\"aHMdGbAdO\"},nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Web push notifications\"})}),\" etc, using a single workflow action. \"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Features\"}),\" \"]}),/*#__PURE__*/e(\"p\",{children:\"\uD83D\uDC49 Real-time notification feed for your app. \"}),/*#__PURE__*/e(\"p\",{children:\"\uD83D\uDC49 Best for apps with user-to-user interactions like Social Networks, Project Management Tools, CRM, etc.\"}),/*#__PURE__*/e(\"p\",{children:\"\uD83D\uDC49 Supports multiple notification channels - In-App, Web Push, Email \"}),/*#__PURE__*/e(\"p\",{children:\"\uD83D\uDC49 Connect your existing service providers like Mailgun, Sendgrid, SMTP \"}),/*#__PURE__*/e(\"p\",{children:\"\uD83D\uDC49 Allow users to set their notification preferences (coming soon).\"}),/*#__PURE__*/t(\"p\",{children:[\"You can view the plugin on \",/*#__PURE__*/e(o,{href:\"https://bubble.io/plugin/engagespot-notifications-1646149514133x734161642066018300\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Bubble Marketplace\"})}),\" Detailed documentation on how to configure notifications in your Bubble App, please read \",/*#__PURE__*/e(o,{href:\"https://documentation.engagespot.co/docs/bubble-io-plugin/using-engagespot-in-bubble-app\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Setting up notifications in Bubble App\"})})]}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})})]});export const richText5=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"Update April 2023] - \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/blog/is-ios-safari-push-notifications-coming-in-ios-15/%7B%7Bsite.url%7D%7D/blog/ios-web-push-notifications\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Web push notification is now available in iOS 16.4.\"})}),\" \"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"[Update - November 2022]\"}),\" - Read - \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/blog/is-ios-safari-push-notifications-coming-in-ios-15/%7B%7Bsite.url%7D%7D/blog/web-push-ios-safari-launch-2023\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"iOS Web push notifications confirmed by Apple\"})}),\". \"]}),/*#__PURE__*/e(\"p\",{children:\"Web Push Notifications in iOS Safari is one of the most awaited features by web developers. It's now been more than seven years since developers started waiting for Apple to implement the Push API. Fortunately, there are signs of Apple working on adding Push API support to iOS Safari in the next release (iOS 15.4). \"}),/*#__PURE__*/t(\"p\",{children:[\"As mentioned by Maximiliano Firtman in his \",/*#__PURE__*/e(o,{href:\"https://firt.dev/ios-15.4b/#web-push-notifications-on-ios%EF%BC%8Dwith-a-catch\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"blog\"})}),\", Apple has added support for Push API in the latest iOS release. But as per the report, the feature is not yet working. Probably Apple is working on adding web push notification support in Safari. It could still be in the early beta stages. It is still unclear if this feature would be released in iOS 15.4 or delayed further. \"]}),/*#__PURE__*/t(\"p\",{children:[\"Adding native web push notification support to iOS Safari will enable full support for Progressive Web Applications (PWA) experience in iPhone and iPad devices. Bookmark this page to stay updated about the latest updates about \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/blog/how-to-add-web-push-notifications-in-react-app/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Web Push Notification\"})}),\" feature in iOS Safari.\"]})]});export const richText6=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/e(\"h2\",{children:\"Web Push Notifications\"}),/*#__PURE__*/e(\"p\",{children:\"Web push notification is an important feature for any web application. Along with Email, you should send important account related events to your users via Web Push channel. In this article, we'll learn how to add Web Push Notifications to a React app using Engagespot.\"}),/*#__PURE__*/e(\"h2\",{children:\"Create Your React App\"}),/*#__PURE__*/e(\"p\",{children:\"If you already have a ReactJS app, feel free to skip this section. Otherwise, you can create a new React app as follows\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"npx create-react-app engagespot-react\\ncd engagespot-react\",language:\"JSX\"})})}),/*#__PURE__*/e(\"h2\",{children:\"Get a FREE Engagespot API Key\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(o,{href:\"https://portal.engagespot.co/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Login\"})}),\" to your Engagespot account (or \",/*#__PURE__*/e(o,{href:\"https://portal.engagespot.co/auth/register\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"create one\"})}),\" if you donot have one). And you can see your \",/*#__PURE__*/e(\"strong\",{children:\"Engagespot API Key\"}),\". (Do not confuse with \",/*#__PURE__*/e(\"strong\",{children:\"ENGAGESPOT_API_SECRET\"}),\"). Copy your API Key.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Add Service Worker to Your React App.\"}),/*#__PURE__*/t(\"p\",{children:[\"To enable web push, you should setup \",/*#__PURE__*/e(o,{href:\"https://developers.google.com/web/fundamentals/primers/service-workers\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"service worker\"})}),\" in your React App. Don't worry. It's a simple process. Let's do it. Create a \",/*#__PURE__*/e(\"code\",{children:\"service-worker.js\"}),\" file in your React app's public folder.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Add the following text to the \",/*#__PURE__*/e(\"code\",{children:\"service-worker.js\"}),\" file and save it.\"]}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"importScripts('https://cdn.engagespot.co/serviceWorkerv2.js');\",language:\"JSX\"})})}),/*#__PURE__*/e(\"h2\",{children:\"Enable Web Push in Engagespot App\"}),/*#__PURE__*/e(\"p\",{children:\"By default, web push is disabled in your Engagespot app. After you've completed the above step, you should login to your Engagespot account, and enable web push under channels menu.\"}),/*#__PURE__*/e(\"h2\",{children:\"Add Engagespot Component to Your React App\"}),/*#__PURE__*/e(\"p\",{children:\"You've setup service workers and enabled web push in your Engagespot App. Now, let's give your user's the option to enable notifications in your React App. For that, we need to install Engagespot react component. Add the package to your React App via npm or yarn\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"npm i @engagespot/react-component\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"Now, import the component inside the source code, where you want the notification component to appear.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'import Engagespot from \"@engagespot/react-component\";',language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"Render the Notification component inside any existing React component. For example, a bell icon place holder, or a Navigation component etc.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'<Engagespot  \\napiKey = \"ENGAGESPOT_API_KEY\"\\nuserId = \"youruser@example.com\"\\n/>',language:\"JSX\"})})}),/*#__PURE__*/t(\"p\",{children:[\"Replace \",/*#__PURE__*/e(\"code\",{children:\"youruser@example.com\"}),\" with the variable where you store the unique user id of your app user. This can be their email id, or a UUID or any other unique identifier.\"]}),/*#__PURE__*/e(\"h2\",{children:\"That's it.\"}),/*#__PURE__*/e(\"p\",{children:\"The next time when you reload your app, you can see a bell icon on your app. And clicking on the bell icon will show you a prompt to enable web push notifications.\"})]});export const richText7=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"In this tutorial, I\u2019ll show you how to add a realtime notification feed in your react web app. It is useful for apps where users collaborate. For example \u2014 Social networks, forums, project management tools or any app where user\u2019s interact through activities like comments, share, messages etc. Throughout this example, I\u2019ll consider the usecase of a dating app where people can send match requests, messages, like / comment on photos etc. And we should make the notification feed look cool by customizing the look and feel to match our app\u2019s theme. And we\u2019ll be using\\xa0\",/*#__PURE__*/e(o,{href:\"https://engagespot.co/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Engagespot\"})}),\"\\xa0to make this happen.Something like this!\"]}),/*#__PURE__*/e(\"h2\",{children:\"Objective\"}),/*#__PURE__*/e(\"p\",{children:\"We have three objectives -\"}),/*#__PURE__*/t(\"ol\",{style:{\"--framer-font-size\":\"20px\",\"--framer-text-alignment\":\"start\",\"--framer-text-color\":\"rgb(209, 213, 219)\",\"--framer-text-transform\":\"none\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"To add a notification feed (like the one above) in our React app that updates in Realtime, shows unread notification count etc.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"To send notifications to specific users programatically from our dating apps backend code. (For eg:\\xa0\",/*#__PURE__*/e(\"em\",{children:\"when someone comments on a user\u2019s photo\"}),\")\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"To add support for browser notifications, so our users can be notified even while they\u2019re away.\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"Prerequisites\"}),/*#__PURE__*/e(\"ol\",{style:{\"--framer-font-size\":\"20px\",\"--framer-text-alignment\":\"start\",\"--framer-text-color\":\"rgb(209, 213, 219)\",\"--framer-text-transform\":\"none\"},children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Engagespot account (It\u2019s free to signup)\"})})}),/*#__PURE__*/e(\"h2\",{children:\"Step 1. Add Engagespot React Component to your existing app\"}),/*#__PURE__*/e(\"p\",{children:\"Install Engagespot React Component package which contains the pre-built UI Kit and all necessary bells and whistles needed to build a notification system.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"npm i @engagespot/react-component\",language:\"JSX\"})})}),/*#__PURE__*/e(\"h2\",{children:\"Step 2. Import Engagespot React Component and Render\"}),/*#__PURE__*/e(\"p\",{children:\"We\u2019ll add the bell icon (and the notification feed) to the top right side of our app\u2019s navigation bar. Just like how Medium placed their bell icon.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'import Engagespot from \"@engagespot/react-component\";',language:\"JSX\"})})}),/*#__PURE__*/t(\"p\",{children:[\"I have a\\xa0\",/*#__PURE__*/e(\"strong\",{children:\"Bell\"}),\" component in my React app which I\u2019ve positioned properly in the app where I want the Engagespot notification feed to appear.\"]}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"<HorizontalNavigation>  \\n   <Bell>  \\n      <Engagespot  \\n         apiKey={ENGAGESPOT\\\\_API\\\\_KEY}  \\n         userId={loggedInUser.email}  \\n      />  \\n   </Bell>  \\n   ...  \\n</HorizontalNavigation>\",language:\"JSX\"})})}),/*#__PURE__*/t(\"p\",{children:[\"In the\\xa0\",/*#__PURE__*/e(\"strong\",{children:\"userId\"}),\" parameter, we should pass the email id (or any other unique identifier) of the user who is currently logged in to our app. Done! If you open your app now, You can see a bell icon, and clicking on it will open a full fledged notification center.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Step 3. Customizing the Notification UI Kit\"}),/*#__PURE__*/t(\"p\",{children:[\"Now we should customize the look and feel of the notification center to match our dating app\u2019s theme. For that we should use the\\xa0\",/*#__PURE__*/e(\"strong\",{children:\"theme\"}),\" property of Engagespot component. Let\u2019s change few colors.\"]}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"...\\nconst theme = {  \\n   notificationButton: {  \\n      iconFill: '#5350f6',  \\n   },  \\n   colors: {  \\n      brandingPrimary: '#5350f6',  \\n      colorSecondary: '#ecebfa',  \\n   },  \\n   feedItem: {  \\n      hoverBackground: '#ecebfa',  \\n   },  \\n   dropdown: {  \\n      hoverBackground: '#ecebfa',  \\n      menuItemHoverBackground: '#ecebfa',  \\n   },  \\n};\\n<HorizontalNavigation>  \\n   <Bell>  \\n      <Engagespot  \\n         apiKey={ENGAGESPOT\\\\_API\\\\_KEY}  \\n         userId={loggedInUser.email}  \\n         theme = {theme}\\n      />\\n   </Bell>  \\n   ...  \\n</HorizontalNavigation>\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"\uD83C\uDF89 Awesome!\"}),/*#__PURE__*/e(\"h2\",{children:\"Step 4. Sending notifications programatically from our node backend.\"}),/*#__PURE__*/e(\"p\",{children:\"So, In my dating app, I want to notify my users whenever someone sends them a match request. Let\u2019s open the code where we handle match requests.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"/** Creates a new match request */\\nconst createMatchRequest = async (fromUser: User, toUser: User) => {  \\n   return await saveMatchRequestToDb(fromUser, toUser);  \\n}\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"Here, we can add a simple api request to notify the user when they get a new match request.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'Notify user about a new match request **/ \\nconst notifyUserAboutNewMatchRequest = async (fromUser: User, toUser: User) => {   \\n   \\n   return axios.post(\\'https://api.engagespot.co/v3/notifications\\',  \\n      {  \\n         \"notification\": {  \\n            \"title\": \"${fromUser.name} sent you a match request!\"  \\n         },  \\n         \"recipients\": \"[\"+toUser.email+\"]\"\\n      },  \\n      {  \\n         headers:{  \\n            \\'X-ENGAGESPOT-API-KEY\\':\\'ENGAGESPOT\\\\_API\\\\_KEY\\',  \\n            \\'X-ENGAGESPOT-API-SECRET\\':\\'ENGAGESPOT\\\\_API\\\\_SECRET\\',  \\n         }  \\n      })\\n   }\\n Creates a new match request */\\nconst createMatchRequest = async (fromUser: User, toUser: User) => {\\n   await notifyUserAboutNewMatchRequest(fromUser, toUser);\\n   return await saveMatchRequestToDb(fromUser, toUser);\\n}',language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"That\u2019s done. Now whenever we try to send a match request to a user, they will get notified in their notification bell icon (or as a browser push). No matter how many devices they use, Engagespot will do all the task to make sure your user gets notified!\"}),/*#__PURE__*/e(\"h2\",{children:\"Conclusion\"}),/*#__PURE__*/t(\"p\",{children:[\"Now you\u2019ve implemented a complete notification center in few minutes to your dating app built in React and \",/*#__PURE__*/e(o,{href:\"https://www.toptal.com/nodejs#hiring-guide\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Node\"})}),\". Many more features are available in the Engagespot SDK. Make sure to checkout the\\xa0\",/*#__PURE__*/e(o,{href:\"https://documentation.engagespot.co/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"documentation\"})}),\"\\xa0to build even more more advanced features! Thanks for reading, and happy building better notifications, faster!\"]})]});export const richText8=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"Sending templated emails are important because it helps us re-use the content, layout and make necessary modifications as needed. It is possible to use a library such as \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/blog/how-to-send-email-notifications-with-sendgrid-dynamic-templates/%7B%7Bsite.url%7D%7D/blog/nodemailer-attachments-email-nodejs\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"nodemailer\"})}),\" to send such emails. But, in this article, we'll learn how to send email notifications using \",/*#__PURE__*/e(o,{href:\"https://sendgrid.com/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Sendgrid\"})}),\" dynamic email templates, so you don't have to harcode email content in your backend. We'll use Engagespot with Sendgrid provider to send emails with dynamic templates.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Before we start\"}),/*#__PURE__*/e(\"p\",{children:\"Before we implement dynamic email template, make sure you have the following things\"}),/*#__PURE__*/t(\"ol\",{style:{\"--framer-font-size\":\"20px\",\"--framer-text-alignment\":\"start\",\"--framer-text-color\":\"rgb(209, 213, 219)\",\"--framer-text-transform\":\"none\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Engagespot API_KEY and API_SECRET\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Sendgrid account & API_KEY\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"Design a Dynamic Email Template\"}),/*#__PURE__*/t(\"p\",{children:[\"Let's login to Sendgrid and navigate to \",/*#__PURE__*/e(\"strong\",{children:\"Email API\"}),\" -> \",/*#__PURE__*/e(\"strong\",{children:\"Dynamic Templates\"}),\"Click \",/*#__PURE__*/e(\"strong\",{children:\"Create a Dynamic Template\"}),\", and give your template a name. For example - \",/*#__PURE__*/e(\"em\",{children:\"Welcome email template\"}),'Click on the newly created \"',/*#__PURE__*/e(\"strong\",{children:\"Welcome Email\"}),'\" template, and click on \"',/*#__PURE__*/e(\"strong\",{children:\"Add Version\"}),\"\\\"Let's choose the \",/*#__PURE__*/e(\"strong\",{children:\"Blank Design\"}),\"Choose the \",/*#__PURE__*/e(\"strong\",{children:\"Design Editor\"}),\" to edit our email templateLet's drag and drop few modules to build a simple template like thisWe've added a :::name::: placeholder, which we'll replace from our code. Now let's see how to pass data to this email template using Engagespot API.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Send Email Notification From a Node.js Backend\"}),/*#__PURE__*/t(\"p\",{children:[\"We've designed an email template. Now let's setup Engagespot in our app and send a notification from our Node.js backend. First, we need to register our user's with Engagespot. In this example, we'll deliver the notification via In-App, Webpush and Email. For that, let's make use of Engagespot REST API. Make sure you've \",/*#__PURE__*/e(o,{href:\"https://documentation.engagespot.co/docs/channels/configuring-providers/email/sendgrid-provider\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"enabled Sendgrid Provider\"})}),\" on your Engagespot dashboard. You can send notification with the following code\"]}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'{\\n  \"notification\": {\\n    \"title\": \"Rose accepted your friend request\"\\n  },\\n  \"category\":\"new_friend_request\",\\n  \"data\":{\\n     \"name\":\"Jack\",\\n  },\\n  \"recipients\": [\\n    \"jack@example.com\"\\n  ],\\n  \"override\":{\\n    \"channels\":[\"email\",\"inApp\"],\\n    \"sendgrid_email:{\\n       \"template_id\":\"tuj6Rfc3bCx37dFdslapqc78cbytG\"\\n    }\\n  }\\n}',language:\"JSX\"})})}),/*#__PURE__*/t(\"p\",{children:[\"If you notice, you can see that we're passing the \",/*#__PURE__*/e(\"strong\",{children:\"name\"}),\" in the data object, which will be sent to Sendgrid where it will be replaced in your template! Its simple as that. Now your notification will be delivered across two channels - Email and InApp.\"]})]});export const richText9=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"Engagespot now supports Email Notifications. That means, the same notification you've been sending to your users through the In-App notification widget now will be delivered to your user's email too! We noticed that a lot of our users had to write their own code to handle notification delivery via other channels in addition to Engagespot In-App & Web Push. And building a \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/#features\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Notification Preference Manager\"})}),\" for their users was even more difficult! We've finally launched the revamped version of Engagespot that supports notification delivery via multiple channels, along with a Notification Preference manager for your users.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Multi Channel Delivery\"}),/*#__PURE__*/t(\"p\",{children:['A transactional notification needs to be delivered to your users via multiple channels. For example if you want to send a \"Free Trial Expiry Reminder\" notification such as \"',/*#__PURE__*/e(\"em\",{children:\"Hey, your free trial will expire in 4 days. Upgrade to continue using the service without interruption\"}),'\" to your users, you might consider sending it via Email, and also as an In-App notification, or even ',/*#__PURE__*/e(o,{href:\"https://engagespot.co/blog/introducing-email-notifications-and-other-features/%7B%7Bsite.url%7D%7D/blog/sms-api-providers-india\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"SMS\"})}),\". Now it's possible to send a notification to multiple channels, with one single API.Multi Channel Notification Workflow\"]}),/*#__PURE__*/e(\"h2\",{children:\"Notification Preference Manager for Your Users\"}),/*#__PURE__*/t(\"p\",{children:['Every app needs to send several notifications of transactional nature. Be it alerts about user interactions like - \"',/*#__PURE__*/e(\"em\",{children:\"Hey someone commented on your photo\"}),'\", or updates like \"',/*#__PURE__*/e(\"em\",{children:\"Your order #4573 has been shipped!\"}),'\", or security alerts like - \"',/*#__PURE__*/e(\"em\",{children:\"Unrecognized login from a new device at 12:00AM on 12th Jan, 2022\"}),\"\\\" You must give your user's the control to decide which notification they want to see, and through which channel. Some of them might need push notifications only for security related alerts and all other notification categories should be delivered via email. Users might block all notifications from you if we do not give them a fine graned notification preference manager. Engagespot allows you to quickly build a Notification Preference Manager to your users in minutes!How Twitter allows their user's to set their notification preferences.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Support for Third Party Email Providers\"}),/*#__PURE__*/t(\"p\",{children:[\"Engagespot provides zero configuration channel providers for all channels which you can simply use out of the box. That means, when you start building your app, just plug in Engagespot, and you've got In-App, Push and Email Notifications built in! For advanced delivery, we support third party providers like \",/*#__PURE__*/e(o,{href:\"https://sendgrid.com/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Sendgrid\"})}),\". You can connect your existing Sendgrid API Key and leverage the power of their platform to power email notifications in your app.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Built by Developers for Developers \u2764\uFE0F\"}),/*#__PURE__*/e(\"p\",{children:\"Engagespot is built for one purpose! To help developers focus their time and effort on what matters the most while leaving the complexities in building a great product notification system to us.\"}),/*#__PURE__*/e(\"h3\",{children:\"Easy to use APIs with extensive documentation\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"POST\"}),\" - /notifications\"]}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'\\n   \"notification\": {\\n      \"title\": \"Rose accepted your friend request \uD83C\uDF89\"\\n   },\\n   \"recipients\": [\\n      \"jack@example.com\"\\n   ],\\n   \"override\": {\\n      \"channels\": [\"email\",\"webPush\"]\\n   }\\n}',language:\"JSX\"})})}),/*#__PURE__*/e(\"h3\",{children:\"Override Delivery Configurations via API\"}),/*#__PURE__*/e(\"p\",{children:\"You can override the default delivery settings via API, and even make use of all features supported by your email provider. For example, you can use Sendgrid Templates to deliver email notifications to your users!\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'{\\n   \"override\":{\\n      \"channels\":[\"email\",\"inApp\"],\\n      \"sendgrid_email\":{\\n         \"_config\":{\\n            \"API_KEY\":\"SG.jk6VcGa9nGsyt2nMop*#!GbxkKIhBxgf4HGMLXjHshs\"\\n         },\\n         \"templateId\":\"tu72hsxm9746hckDvC2PmmBCas\"\\n      }\\n   }\\n}',language:\"JSX\"})})}),/*#__PURE__*/e(\"h2\",{children:\"More Features on the way to build Better Notifications\"}),/*#__PURE__*/t(\"p\",{children:[\"We're working on some cool features to make product notifications better and easier for developers. We'll be soon adding support for new email providers like Amazon SES, Mailgun, Postmark etc, and support for Mobile Push via FCM, and extending the \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Notification Center UI Component\"})}),\" to React Native and Flutter. Few of the features mentioned in this article are in closed beta. If you'd like to enable them in your account, just email us at \",/*#__PURE__*/e(o,{href:\"mailto:support@engagespot.co\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"support@engagespot.co\"})}),\". Also, do let us know if you have any suggestions to make product notifications even better. Don't have an account? \",/*#__PURE__*/e(o,{href:\"https://portal.engagespot.co/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Sign up\"})})]})]});export const richText10=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"We've launched Notification UI Kit for React that you can use to build a notification feed in your app powered by Reactjs.\"}),/*#__PURE__*/e(\"h2\",{children:\"Usage\"}),/*#__PURE__*/t(\"p\",{children:[\"Install \",/*#__PURE__*/e(o,{href:\"https://www.npmjs.com/package/@engagespot/react-component\",nodeId:\"qp7_CWH9V\",openInNewTab:!0,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"react notification npm package\"})}),\" \"]}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"npm i @engagespot/react-component\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})}),/*#__PURE__*/e(\"p\",{children:\"Then use the pre-built Engagespot component wherever you want the notification bell icon and feed to appear on your React app. Usually in the nav bar component, but it's your choice!\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'import Engagespot from \"@engagespot/react-component\";  \\n  \\n<Engagespot  \\napiKey={ENGAGESPOT_API_KEY}  \\nuserId={youruser@example.com}  \\n/>',language:\"JSX\"})})}),/*#__PURE__*/t(\"p\",{children:[\"It's simple as that! Also the SDK offers lot of powerful features like theme customizations, added security mechanisms, browser push notifications etc, which is explained in the \",/*#__PURE__*/e(o,{href:\"https://documentation.engagespot.co/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"docs\"})}),\".\"]})]});export const richText11=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"Hi Guys, I'm Anand, the main developer & founder of Engagespot. One of the reasons why I built Engagespot is to help other developers implement \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"web push notifications in web apps\"})}),\" easier and without much complexities involved in backend development. In this article, I'll show how to send web push notifications to specific users. That is, how you can setup a user-specific \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"web push notification\"})}),\" for your web application using Engagespot. This is a detailed explanation of the \",/*#__PURE__*/e(o,{href:\"https://www.quora.com/How-can-I-send-web-push-notifications-to-a-specific-user\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Quora answer written here\"})}),\".\"]}),/*#__PURE__*/e(\"h3\",{children:/*#__PURE__*/e(\"strong\",{children:\"What do you need?\"})}),/*#__PURE__*/e(\"ul\",{style:{\"--framer-font-size\":\"20px\",\"--framer-text-alignment\":\"start\",\"--framer-text-color\":\"rgb(209, 213, 219)\",\"--framer-text-transform\":\"none\"},children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Engagespot API Key (\",/*#__PURE__*/e(o,{href:\"https://portal.engagespot.co/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Sign Up for a Free Push Notification API Key\"})}),\") I'll assume you have an Engagespot account and an API Key for your account\"]})})}),/*#__PURE__*/e(\"h3\",{children:/*#__PURE__*/e(\"strong\",{children:\"Add Engagespot Javascript SDK Code to Your Web App\"})}),/*#__PURE__*/t(\"p\",{children:[\"You need to add this code to all pages (or the one common head include file), where you want the web push notification prompt and the notification bell icon to appear. Make sure to copy this script below the closing \",/*#__PURE__*/e(\"code\",{children:\"</body>\"}),\" tag.\"]}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"<script src=\\\"https://cdn.engagespot.co/engagespot-client.min.js\\\"></script>\\n<script>\\nEngagespot.render('#HTML_Element_ID', {\\n   apiKey: 'ENGAGESPOT_API_KEY',\\n   userId: 'unique-identifier-of-your-user'\\n});\\n</script>\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"Now that you have added the initialization script. All users who visits these pages will see the bell icon, and also the web push notification prompt if you have enabled off-site notifications during Engagespot setup.\"}),/*#__PURE__*/e(\"h3\",{children:\"How to specify a unique id for the users on your web app?\"}),/*#__PURE__*/e(\"p\",{children:\"To send web push notifications to specific users, we need to map this anonymous subscriber to a real user account in your system. So that you can use your user's id or email or some unique values to identify this user.\"}),/*#__PURE__*/t(\"p\",{children:[\"For that, Just below the \",/*#__PURE__*/e(\"strong\",{children:\"Engagespot.init()\"}),\" function, above the \",/*#__PURE__*/e(\"strong\",{children:\"</script>\"}),\" add the following line.\"]}),/*#__PURE__*/t(\"p\",{children:[\"(You need to add the below code only where the user lands after logging in). Because, that's where you will have his unique id, right? Engagespot.identifyUser('XYZ'); Whereas \",/*#__PURE__*/e(\"strong\",{children:\"XYZ\"}),\" is the unique id of your user in your system. I recommend using the numeric UID of your user. (String IDs are also fine). If you've done this, then you have successfully completed mapped your actual user with the web push subscription of this user's browser. Like this, if he logs in from different browsers, we will map all those browsers to your user's id. (We do the mapping internally so that you don't have to worry about that). So, whenever you send a push notification to user XYZ, he will get it in all his browsers from where he has logged in.\"]}),/*#__PURE__*/e(\"h3\",{children:\"How to detach a user from the browser when he logs out?\"}),/*#__PURE__*/e(\"p\",{children:\"We need to detach the identified user from the browser when he logs out of your web application. Otherwise, he will continue to receive all notifications in that browser. (What I mean, is the native, offline browser push notifications). That's simple. Just add the following Javascript code on the logout confirmation page. So when he lands on that page, we will simply un-map him from this browser. Engagespot.clearUser();\"}),/*#__PURE__*/e(\"h3\",{children:\"How to send web push notifications to specific users using Engagespot REST API\"}),/*#__PURE__*/e(\"p\",{children:\"Well, You have completed the complex user-browser mapping with just two lines of code. Engagespot takes care of all the complexities associated with this mapping process. Now let's proceed to use Engagespot REST APIs to send a push notification to a specific user from your application backend programmatically.\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"em\",{children:\"You can read our API Guide at \"}),/*#__PURE__*/e(o,{href:\"https://documentation.engagespot.co/docs/rest-api\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:/*#__PURE__*/e(\"em\",{children:\"https://documentation.engagespot.co/docs/rest-api\"})})}),/*#__PURE__*/e(\"em\",{children:\" documen. Also we have push notification SDKs available for PHP and Node.js. Read more about them \"}),/*#__PURE__*/e(o,{href:\"https://documentation.engagespot.co/\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:/*#__PURE__*/e(\"em\",{children:\"here\"})})}),/*#__PURE__*/e(\"em\",{children:\" Here, we need to use the campaign API. You have to send a POST Request with JSON BODY to the campaigns API URL that is \"}),/*#__PURE__*/e(\"code\",{children:/*#__PURE__*/e(o,{nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:/*#__PURE__*/e(\"em\",{children:\"https://api.engagespot.co/v3/notifications\"})})})}),/*#__PURE__*/t(\"em\",{children:[\" You need to pass the notification title, message, icon, link URL as mentioned in the API Guide. Along with that, you need to pass the \",/*#__PURE__*/e(\"strong\",{children:\"send_to\"}),\" parameter with value as \",/*#__PURE__*/e(\"strong\",{children:\"identifiers\"}),\" and pass another JSON array named \",/*#__PURE__*/e(\"strong\",{children:\"identifiers\"}),\" with the ID of the users whom you want to deliver this notification to. In this case, \",/*#__PURE__*/e(\"strong\",{children:\"XYZ\"}),\" Here is one sample PHP Curl Script to send a web push notification to one specific user using Engagespot API.\"]})]}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'$curl = curl_init();  \\ncurl_setopt_array($curl, array(  \\nCURLOPT_URL => \"https://api.engagespot.co/v3/notifications\",  \\nCURLOPT_RETURNTRANSFER => true,  \\nCURLOPT_CUSTOMREQUEST => \"POST\",  \\nCURLOPT_POSTFIELDS =>\\'{\\n    \"notification\": {\\n        \"title\": \"Welcome to Engagespot\",\\n        \"message\": \"Send push notifications to speicific users with our API\",\\n        \"url\": \"https://documentation.engagespot.co\"\\n        \\n    },\\n    \"recipients\":[\"userid-001\", \"userid-002\"]\\n}\\',\\n  CURLOPT_HTTPHEADER => array(\\n    \\'X-ENGAGESPOT-API-KEY: YOUR_API_KEY\\',\\n    \\'X-ENGAGESPOT-API-SECRET: YOUR_API_SECRET\\',\\n    \\'Content-Type: application/json\\'\\n  ), \\n));  \\n  \\ncurl_close($curl);  \\n$response = curl_exec($curl);  \\n$err = curl_error($curl);  \\n  \\nif ($err) {  \\necho \"cURL Error #:\" . $err;  \\n} else {  \\necho $response;  \\n}',language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"em\",{children:\"Make sure to change the API_KEY with your Engagespot App's API_KEY which you can find on your dashboard -> App Settings page. The same API call can be called using any programming languages such as Python, NodeJS, Java, etc.\"})}),/*#__PURE__*/e(\"h3\",{children:\"It's done! But How it works?\"}),/*#__PURE__*/t(\"p\",{children:[\"When you call the API, the notification will be delivered only to the user with id \",/*#__PURE__*/e(\"strong\",{children:\"XYZ.\"}),\" If he is currently online on your web app, he will receive it inside your bell icon with a notification sound (if you've enabled sound during the push notification setup).\"]}),/*#__PURE__*/t(\"p\",{children:[\"On the other hand, if your user's browser is closed, he will receive it as a normal, native browser push notification on which he can click and open the link that you have mentioned on the notification JSON body. Great! You have successfully implemented user-specific web push notifications using Engagespot REST API. Feel free to comment if you have any doubts. I'll be glad to help you. If you've already tried our free plan, have a look at our premium \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/pricing\",nodeId:\"qp7_CWH9V\",openInNewTab:!0,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"push notification pricing\"})}),\" packages. We have a lot of features that you'll love.\"]})]});export const richText12=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"With many authentication techniques, two-factor authentication is one of the most user-friendly and secure methods as it is becoming the industry standard. In this article, we will see how you can implement two-factor authentication (2FA) in your own app or REST API built in NodeJS.\"}),/*#__PURE__*/e(\"h2\",{children:\"What is Two-Factor Authentication?\"}),/*#__PURE__*/e(\"p\",{children:\"You might have seen this in many of the modern applications but what exactly it is? This authentication method requires more than one form of user authentication identifier and simple old traditional password does not work. A user is required to set up the biometrics, or proceed with a code emailed or texted two him.\"}),/*#__PURE__*/e(\"h2\",{children:\"Getting started\"}),/*#__PURE__*/t(\"p\",{children:[\"Before you continue, you will need nodejs and npm installed on your local machine with a code editor of your choice. Node.js is one of the popular frameworks with lot of frameworks and libraries like Express, \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/blog/2fa-authentication-in-node-js-rest-api-speakeasy/%7B%7Bsite.url%7D%7D/blog/nodemailer-attachments-email-nodejs\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"nodemailer\"})}),\" etc to build a web application.You can download \",/*#__PURE__*/e(o,{href:\"https://nodejs.org/en/download/\",nodeId:\"qp7_CWH9V\",openInNewTab:!0,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"nodejs\"})}),\" from this link. The next step is to create a project directory and enter the following command inside it.\"]}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"npm init -y\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"This will generate package.json file for you. Now run the following command to install all the dependencies that we will be using in our project.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"npm install express node-json-db uuid speakeasy\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"We will be using express js which is lightweight framework to run the server. Along with this, node-json-db is our database for the application and finally, for the two-factor authentication, we are using speakeasy which is a one-time password generator. Create a new file named server.js and add the following code to it.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"const express = require('express');\\nconst JsonDB = require('node-json-db').JsonDB;\\nconst Config = require('node-json-db/dist/lib/JsonDBConfig').Config;\\nconst uuid = require('uuid');\\nconst speakeasy = require('speakeasy');\\nconst app = express();\\nconst configOfDb = new Config('myDb', true, false, '/');\\nconst myDb = new JsonDB(configOfDb);\\napp.use(express.urlencoded({ extended: true }));\\napp.use(express.json());\\napp.get('/api', (req, res) => {\\n res.json({ message: 'Two factor auth!' });\\n});\\nconst port = 9000;\\napp.listen(port, () => {\\n console.log(`App is running on PORT: ${port}.`);\\n});\",language:\"JSX\"})})}),/*#__PURE__*/t(\"p\",{children:[\"Run \",/*#__PURE__*/e(\"code\",{children:\"node server.js\"}),\" command to start your development server. If you see the message App is running on PORT: 9000, that means your app is live and you can access it using \",/*#__PURE__*/e(\"code\",{children:\"http://localhost:9000\"})]}),/*#__PURE__*/e(\"h2\",{children:\"Generating the Secret Key\"}),/*#__PURE__*/e(\"p\",{children:\"Now, we create the secret key that generates the two-factor authentication code to be used with the authenticator extension. The secret will be temporary unless it had been verified by us that it was generated by google authenticator using the provided secret key. Let us create a route that will create a user and secret key by speakeasy.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"app.post('/api/register', (req, res) => {\\n    const id = uuid.v4();\\n    try {\\n      const path = `/user/${id}`;\\n      \\n      const temp_secret = speakeasy.generateSecret();\\n      \\n      myDb.push(path, { id, temp_secret });\\n      \\n      res.json({ id, secret: temp_secret.base32 });\\n    } catch (e) {\\n      console.log(e);\\n      res.status(500).json({ message: 'Error generating secret key' });\\n    }\\n   });\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"When we send a POST request to this endpoint, we will receive the secret key.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'{\\n  \"id\":\"74748hd-shsc92yd-48r8n-28dcck\",\\n  \"secret\":\"NALDICNBCGWJ3S9KVG026S40OR8QRB7VP5UR34SVMLYWWN\"\\n}',language:\"JSX\"})})}),/*#__PURE__*/t(\"p\",{children:[\"We are using the Google Authenticator \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/blog/2fa-authentication-in-node-js-rest-api-speakeasy/%7B%7Bsite.url%7D%7D/blog/building-chrome-extension-send-hackernews-notifications\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"chrome extension\"})}),\" and can register our secret as follows.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Verifying the secret\"}),/*#__PURE__*/e(\"p\",{children:\"Till now, we have assigned the same secret to the user as well as the google authenticator. The authenticator will generate a code based on the secret and we will verify this in our backend against the registered user id. Let us create another route for this process.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"app.post('/api/verify', (req, res) => {\\n    const { userId, token } = req.body;\\n    try {\\n      const path = `/user/${userId}`;\\n      console.log({ user });\\n      const user = db.getData(path);\\n      const { base32: secret } = user.temp_secret;\\n      const verified = speakeasy.totp.verify({\\n        secret,\\n        encoding: base32,\\n        token,\\n      });\\n      if (verified) {\\n        myDb.push(path, { id: userId, secret: user.temp_secret });\\n        res.json({ verified: true });\\n      } else {\\n        res.json({ verified: false });\\n      }\\n    } catch (error) {\\n      console.error(error);\\n      res.status(500).json({ message: 'Error retrieving user' });\\n    }\\n   });\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"With the token obtained from Google Authenticator, this request will verify the request and returns the following.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'{\\n  \"verified\":true\\n}',language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"Since our token is verified, it will be stored permanently and will be used to verify future codes. For that, we will create a validation endpoint.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"app.post('/api/validate', (req, res) => {\\n const { userId, token } = req.body;\\n try {\\n   const path = `/user/${userId}`;\\n   const user = myDb.getData(path);\\n   const { base32: secret } = user.secret;\\n   const tokenValidates = speakeasy.totp.verify({\\n     secret,\\n     encoding: 'base32',\\n     token,\\n     window: 1,\\n   });\\n   if (tokenValidates) {\\n     res.json({ validated: true });\\n   } else {\\n     res.json({ validated: false });\\n   }\\n } catch (error) {\\n   console.error(error);\\n   res.status(500).json({ message: 'Error retrieving user' });\\n }\\n});\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"With this we can validate as my codes from authenticator app as we like!\"}),/*#__PURE__*/e(\"h3\",{children:\"Final Code\"}),/*#__PURE__*/e(\"p\",{children:\"So, with few lines of code and without any third-party APIs, we've implemented Two Factor Authentication in our Node.js application. The full server.js file will look as follows.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"const express = require('express');\\nconst JsonDB = require('node-json-db').JsonDB;\\nconst Config = require('node-json-db/dist/lib/JsonDBConfig').Config;\\nconst uuid = require('uuid');\\nconst speakeasy = require('speakeasy');\\nconst app = express();\\nconst configOfDb = new Config('myDb', true, false, '/');\\nconst myDb = new JsonDB(configOfDb);\\napp.use(express.urlencoded({ extended: true }));\\napp.use(express.json());\\napp.get('/api', (req, res) => {\\n res.json({ message: 'Two factor auth!' });\\n});\\nconst port = 9000;\\napp.listen(port, () => {\\n console.log(`App is running on PORT: ${port}.`);\\n});\\napp.post('/api/register', (req, res) => {\\n const id = uuid.v4();\\n try {\\n   const path = `/user/${id}`;\\n   const temp_secret = speakeasy.generateSecret();\\n   // Create user in the database\\n   myDb.push(path, { id, temp_secret });\\n   res.json({ id, secret: temp_secret.base32 });\\n } catch (e) {\\n   console.log(e);\\n   res.status(500).json({ message: 'Error generating secret key' });\\n }\\n});\\napp.post('/api/verify', (req, res) => {\\n const { userId, token } = req.body;\\n try {\\n   const path = `/user/${userId}`;\\n   console.log({ user });\\n      const user = myDb.getData(path);\\n   const { base32: secret } = user.temp_secret;\\n   const verified = speakeasy.totp.verify({\\n     secret,\\n     encoding: base32,\\n     token,\\n   });\\n   if (verified) {\\n     myDb.push(path, { id: userId, secret: user.temp_secret });\\n     res.json({ verified: true });\\n   } else {\\n     res.json({ verified: false });\\n   }\\n } catch (error) {\\n   console.error(error);\\n   res.status(500).json({ message: 'Error retrieving user' });\\n }\\n});\\napp.post('/api/validate', (req, res) => {\\n const { userId, token } = req.body;\\n try {\\n   const path = `/user/${userId}`;\\n   const user = myDb.getData(path);\\n   const { base32: secret } = user.secret;\\n   console.log({ user });\\n   const tokenValidates = speakeasy.totp.verify({\\n     secret,\\n     encoding: 'base32',\\n     token,\\n     window: 1,\\n   });\\n   if (tokenValidates) {\\n     res.json({ validated: true });\\n   } else {\\n     res.json({ validated: false });\\n   }\\n } catch (error) {\\n   console.error(error);\\n   res.status(500).json({ message: 'Error retrieving user' });\\n }\\n});\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"Congrats! You have successfully implemented two-factor authentication (2FA) with nodejs and speakeasy!\"})]});export const richText13=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"This article will move through a simple tutorial on how you can integrate email, in-app, and push notification features in your PHP Laravel application. To send we'll email notifications, we will use Amazon Simple Email Service (SES). To make this easier, and avoid integrating different APIs for each notification channel, we will use Engagespot \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/\",nodeId:\"qp7_CWH9V\",openInNewTab:!0,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"multi-channel notification API\"})}),\".\"]}),/*#__PURE__*/e(\"h2\",{children:\"Setting up Amazon SES\"}),/*#__PURE__*/t(\"p\",{children:[\"Amazon SES is a cloud-based \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/blog/laravel-amazon-ses-in-app-web-push-single-api/%7B%7Bsite.url%7D%7D/blog/top-six-transactional-email-services-in-2022\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"transactional email service provider\"})}),\" which allows users to send bulk quantity emails in a single go. Amazon SES, on its own, also accepts integration with applications or web-apps that allow for a smoother and in-app experience. The following details explain how you can connect your AWS SES service to your Engagespot to be further used in a laravel code.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Enabling SES through Engagespot\"}),/*#__PURE__*/e(\"p\",{children:\"All you have to do is to simply log-in to your Engagespot account \u2192 Head over to Channels \u2192 Email \u2192 And now simply enable the listed AES SES Provider option.\"}),/*#__PURE__*/e(\"h2\",{children:\"Setting up Api Key and Secret using AWS IAM service\"}),/*#__PURE__*/e(\"p\",{children:\"This will be the initialization of the connection between Engagespot and AWS SES. Head to your AWS SES dashboard and navigate to the IAM Service. Once done, navigate to Access management \u2192 Add Users and add a user. Now set the credential type to Access key - Programmatic Access. Navigate to the third section of Set permissions \u2192 Select the third option of Attach existing policies directly and click Create policy. Once the policy tab opens, select the JSON section and work the following code into the tab.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'{\\n \"Version\": \"2012-10-17\",\\n \"Statement\": [\\n   {\\n     \"Sid\": \"VisualEditor0\",\\n     \"Effect\": \"Allow\",\\n     \"Action\": [\"ses:SendRawEmail\", \"ses:SendEmail\", \"ses:GetSendStatistics\"],\\n     \"Resource\": \"*\"\\n   }\\n ]\\n}',language:\"JSX\"})})}),/*#__PURE__*/t(\"p\",{children:[\"This will configure a policy for your SES service which depicts all the constraints and functions you will be using. Once done, locate the \",/*#__PURE__*/e(\"strong\",{children:\"Tags\"}),\" button, hit it then locate the Review button and select it, now give a name to your policy and press on Create policy button. Now, navigate back to the Set permissions section, select the policy you just created and click on the Tags \u2192 Review button and finally click on Create user button. You will now be presented with an \",/*#__PURE__*/e(\"code\",{children:\"AWS Access Key ID\"}),\" and \",/*#__PURE__*/e(\"code\",{children:\"Secret Key\"}),\", save both the values and proceed with the tutorial. Once your key ID and key is noted down, head over to your \",/*#__PURE__*/e(\"strong\",{children:\"Engagespot Dashboard \u2192 Channels \u2192 Email \u2192 AWS SES\"}),\". A pop-up will appear, enter the Key ID and the Secret Key in the relevant fields, enter your state/region in the Region field and enter the Verified Identity Email from your Engagespot account in the Email field.\"]}),/*#__PURE__*/e(\"h3\",{children:\"What are channels in Engagespot?\"}),/*#__PURE__*/e(\"p\",{children:\"Channels are the vessels through which the notification will be relayed to the relevant entity/visitor on your application, it can either be an Email, Web-Push, In-app or SMS channel. Enagespot takes up a multi-channel approach as multi-level vessels of communication are said to increase productivity and achieve consumer loyalty. This article also sheds light on how you can utilise these channels through Enagespot directly into your application or web-app.\"}),/*#__PURE__*/e(\"h2\",{children:\"Integrating AWS SES with Laravel\"}),/*#__PURE__*/e(\"p\",{children:\"In order to integrate engagespot\u2019s API with your application, you need to first set-up the working environment necessary for the changes in your application. Let's see how to do this\"}),/*#__PURE__*/e(\"h3\",{children:\"Installing the package\"}),/*#__PURE__*/t(\"p\",{children:[\"Installing the Engagespot package will allow the application to read and write through the API. You can use the \",/*#__PURE__*/e(o,{href:\"https://packagist.org/packages/jobin/engagespot\",nodeId:\"qp7_CWH9V\",openInNewTab:!0,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"jobin/engagespot\"})}),\" package to send emails via aws ses. Use the following command in your app\u2019s directory using the composer handler. \",/*#__PURE__*/e(\"code\",{children:\"composer require jobin/engagespot\"}),\" This will install all the required prerequisites of the API.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Configuring service providers\"}),/*#__PURE__*/e(\"p\",{children:\"Since we are using Engagespot\u2019s service, we need to configure it appropriately in-order for the API to work through Engagespot in our application. Use the following command in the config/app.php file\u2019s provider array.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"'providers' => [\\n    //...\\n    \\\\Jasjbn\\\\Engagespot\\\\EngagespotServiceProvider::class,\\n]\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"This will initialise Engagespot as the primary service provider for the utility. In later versions of Laravel (5.5+), this is performed automatically.\"}),/*#__PURE__*/e(\"h3\",{children:\"Publishing the config file to enagespot\"}),/*#__PURE__*/e(\"p\",{children:\"The provider is initialised but still won\u2019t connect to Engagespot unless we publish your built config file, use the following command in the php CLI\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'php artisan vendor:publish --provider=\"Jasjbn\\\\Engagespot\\\\EngagespotServiceProvider\"',language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"Once published, the setup is almost done, you can now try sending requests and testing the system in itself.\"}),/*#__PURE__*/e(\"h3\",{children:\"Starting up and testing\"}),/*#__PURE__*/t(\"p\",{children:[\"Once your setup has successfully passed through, you can now open up your \",/*#__PURE__*/e(\"code\",{children:\"config/engagespot.php\"}),\" file which has been newly created after publication. Add the API Key ID and Secret Key using the following syntax in the config/engagespot.php file.\"]}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"X_ENGAGESPOT_API_SECRET = YourSecretKey\\nX_ENGAGESPOT_API_KEY' = YourAccessKeyID\",language:\"JSX\"})})}),/*#__PURE__*/t(\"p\",{children:[\"Now, to send the notifications via Amazon SES Email, In-App and Push from your laravel code, just use the \",/*#__PURE__*/e(\"code\",{children:\"send()\"}),\" function in \",/*#__PURE__*/e(\"code\",{children:\"Engagespot\"}),\" class. You can try sending a notification and test the system out using the following block of code.\"]}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"use Jasjbn\\\\Engagespot\\\\Engagespot;\\n$engagespot = new Engagespot();\\n$engagespot->title = 'Test Notification';\\n$engagespot->message = \\\"hey this is a test notification \\\"\\n$engagespot->recipients = array(\\\"user@test.com\\\",\\\"userone@test.com\\\")\\n$engagespot->url = 'https://www.google.com'; \\n$engagespot->icon = 'https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png';\\n$engagespot->channels = array('email','webPush', \u2018inApp\u2019);\\n$engagespot->send();\",language:\"JSX\"})})})]});export const richText14=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"Today, we're launching two new exciting features - \",/*#__PURE__*/e(\"strong\",{children:\"Notification Templates\"}),\" and \",/*#__PURE__*/e(\"strong\",{children:\"Notification Batching\"}),\". Two essential features that will make your product's notification system smarter and improves the overall notification experience of your app! Let's quickly understand what these two new features are.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Notification Templates\"}),/*#__PURE__*/e(\"p\",{children:\"With notification templates, you don't have to hardcode your Email, SMS, Push (or any other) message content in your code. Instead, you can create re-usable notification templates through the simple UI editor. With notification templates feature, you get a complete No-Code interface to manage your product notification system.\"}),/*#__PURE__*/e(\"h3\",{children:\"What are the advantages of using notification templates?\"}),/*#__PURE__*/t(\"ul\",{style:{\"--framer-font-size\":\"20px\",\"--framer-text-alignment\":\"start\",\"--framer-text-color\":\"rgb(209, 213, 219)\",\"--framer-text-transform\":\"none\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"No need to hardcode notification copy in source code.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Make changes to notification copy without touching code.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Add or remove notification channels without any coding effort.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Preview and test notifications in realtime without any engineering effort.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Irrespective of the service provider (AWS SES, Mailgun, Twilio, FCM etc), you can manage all notification templates from a single dashboard.\"})})]}),/*#__PURE__*/e(\"h3\",{children:\"How notification templates works in Engagespot?\"}),/*#__PURE__*/e(\"p\",{children:\"Watch this quick video.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{\"--aspect-ratio\":\"560 / 315\",aspectRatio:\"var(--aspect-ratio)\",height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:NEd4VmDdsxM3StIUbddO/bZxrMUxBPAhoXlARkK9C/YouTube.js:Youtube\",children:t=>/*#__PURE__*/e(r,{...t,play:\"Off\",shouldMute:!0,thumbnail:\"Medium Quality\",url:\"https://www.youtube.com/watch?v=J4ubA_1U5iM\"})})}),/*#__PURE__*/e(\"p\",{children:\"## Notification Batching I think this feature doesn't require any explanation. Let me try to tell you a simple example.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Consider that your app sends the following notification to a user within a duration of 5 seconds\"})}),/*#__PURE__*/e(\"p\",{children:\"Bill Gates commented on your photo (5s ago) * Jeff Bezos commented on your photo (4s ago) * Elon Musk commented on your photo (3s ago) * Larry Page commented on your photo (2s ago) Looks like your user's photo went viral, Good! But... phew! your app is irritating the user too much!\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"What if you could do this instead?\"})}),/*#__PURE__*/e(\"p\",{children:\" Larry Page and 3 others commented on your photo (2s ago) Clean and simple, right? Well, this is what the notification batching feature is all about. Without any engineering effort, you can enable notification batching in your app. Batching could be enabled for any channel such as In-App notifications, emails, SMS, slack, push notifications etc. Watch this video to learn more\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{\"--aspect-ratio\":\"560 / 315\",aspectRatio:\"var(--aspect-ratio)\",height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:NEd4VmDdsxM3StIUbddO/bZxrMUxBPAhoXlARkK9C/YouTube.js:Youtube\",children:t=>/*#__PURE__*/e(r,{...t,play:\"Off\",shouldMute:!0,thumbnail:\"Medium Quality\",url:\"https://youtu.be/_pV9pzT26io\"})})})]});export const richText15=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"Sending emails from node.js app or an api can be easily done using a popular library called nodemailer. In this tutorial, we will learn how you can send emails from nodejs app using nodemailer and a \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/blog/email-nodejs-app-nodemailer/%7B%7Bsite.url%7D%7D/blog/top-six-transactional-email-services-in-2022\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"popular transactional email provider\"})}),\" such as Mailgun or sendgrid.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Options for sending email in Node.js using nodemailer.\"}),/*#__PURE__*/t(\"p\",{children:[\"As I mentioned above, nodemailer provides two options to deliver emails from node.js. One is using plain SMTP method, and the other one is using any email api service such as \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/blog/email-nodejs-app-nodemailer/%7B%7Bsite.url%7D%7D/blog/laravel-amazon-ses-in-app-web-push-single-api\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Amazon SES\"})}),\", mailgun, sengrid etc.\"]}),/*#__PURE__*/e(\"h3\",{children:\"What is SMTP\"}),/*#__PURE__*/e(\"p\",{children:\"SMTP is a universal protocol for delivering emails. Even if you use a third party email service, they will give you the SMTP credentials such as SMTP Host, Port, Email, Password etc that can be used with an SMTP client. While SMTP is easier to setup, it has some drawbacks over using an API to deliver emails. Email API providers add additional layers of security and performance optimization to enhance email delivery. It is also less prone to DDOS attacks and hacking. In this article, we will learn both methods to send emails in node.js using SMTP and API.\"}),/*#__PURE__*/e(\"h3\",{children:\"What is nodemailer transport\"}),/*#__PURE__*/e(\"p\",{children:'Nodemailer has this useful feature called transports, which is the \"provider\" that makes us able to send mail from node.js app. SMTP is a transport, Mailgun, or Sendgrid or similar services are another transport options.'}),/*#__PURE__*/e(\"h2\",{children:\"Installing Nodemailer\"}),/*#__PURE__*/e(\"p\",{children:\"Install Nodemailer using the following command:\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"npm install nodemailer\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"OR\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"yarn add nodemailer\",language:\"JSX\"})})}),/*#__PURE__*/e(\"p\",{children:\"Once completed, include it into your web application\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'const nodemailer = require(\"nodemailer\");',language:\"JSX\"})})}),/*#__PURE__*/e(\"h2\",{children:\"Sending email in Node.js using SMTP transport\"}),/*#__PURE__*/e(\"p\",{children:\"One of the most common methods to send emails from a node.js app is to use the SMTP transport available in nodemailer. Now let's create the SMTP transport option in nodemailer. Use the SMTP credentials from your email provider. Almost all providers will generate an SMTP credential for you which could be accessed from their dashboard.\"}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'let transporter = nodemailer.createTransport({\\n  host: \"smtp.example.com\",\\n  port: 587,\\n  auth: {\\n    user: \"username\",\\n    pass: \"password\",\\n  },\\n});',language:\"JSX\"})})})]});export const richText16=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"WhatsApp is one of the most popular messaging apps in the world, with over 2 billion users. It offers a simple and convenient way for people to communicate with each other in real-time, whether it's for personal or business purposes. WhatsApp also provides an API that allows developers to build custom applications that can send and receive messages through the WhatsApp platform. This API, called the WhatsApp Business API, gives businesses the ability to automate and streamline their communication with customers, as well as offer new ways to interact and engage with them. Today, we're annonuncing WhatsApp as a messaging channel in Engagespot. As a product manager, or a marketer, or developer, this gives you the capability to communicate with your app users via one more channel.\"}),/*#__PURE__*/e(\"h2\",{children:\"Gupshup WhatsApp API\"}),/*#__PURE__*/t(\"p\",{children:[\"In Engagespot, you get the flexibility to choose an API provider of your choice. We're getting started with the WhatsApp API with \",/*#__PURE__*/e(o,{href:\"https://www.gupshup.io/channels/self-serve/whatsapp\",nodeId:\"qp7_CWH9V\",openInNewTab:!0,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"Gupshup WhatsApp Business API\"})}),\". The GupShup WhatsApp API allows developers to build custom applications that can send and receive messages through the WhatsApp platform, using the GupShup messaging infrastructure.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Gupshup WhatsApp API + Engagespot makes it even powerful!\"}),/*#__PURE__*/t(\"p\",{children:[\"As you know, Engagespot provides you the APIs and SDKs to build a \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/\",nodeId:\"qp7_CWH9V\",openInNewTab:!0,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"complete notification system\"})}),\" in your product. With using a single \",/*#__PURE__*/e(\"strong\",{children:\"Send Notification\"}),\" API, you can deliver messages to multiple channels such as email, in-app, sms, slack, push, whatsapp etc. When you use your Gupshup WhatsApp API with Engagespot, you get -\"]}),/*#__PURE__*/t(\"ul\",{style:{\"--framer-font-size\":\"20px\",\"--framer-text-alignment\":\"start\",\"--framer-text-color\":\"rgb(209, 213, 219)\",\"--framer-text-transform\":\"none\"},children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Use your existing Engagespot API integration, no need to integrate Gupshup API to your app.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Give your user's the flexibility to choose their preferred notification channels such as email, or in-app, or whatsapp or sms.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"View realtime delivery tracking of whatsapp messages in your Engagespot dashboard. (Along with other channels)\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Switch whatsapp API provider without any changes to your code.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Manage WhatsApp notification templates from your Engagespot dashboard.\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"How to enable WhatsApp channel in your Engagespot app\"}),/*#__PURE__*/t(\"p\",{children:[\"With Engagespot, integrating Gupshup API to your app is simple and you can do it in less than a few minutes! Read \",/*#__PURE__*/e(o,{href:\"https://documentation.engagespot.co/docs/channels/configuring-providers/whatsapp/gupshup\",nodeId:\"qp7_CWH9V\",openInNewTab:!0,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"documentation\"})}),\" to learn more.\"]})]});export const richText17=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Is it possible to send Web push in iOS Safari. This is one of the most frequently asked questions by developers. I began to hear this question since I started my first product that dealt with web push notifications in 2017. Even now, it is one of the most searched term by both marketers and developers. Along with email, in-app, sms , mobile app push notifications, web push is an important channel to communicate with users. So the real question is - Is it possible to send web push notifications in Safari iOS? Let\u2019s figure out.\"}),/*#__PURE__*/e(\"h2\",{children:\"Web Push Notifications in iOS Safari. Is it possible yet?\"}),/*#__PURE__*/t(\"p\",{children:[\"The answer is, unfortunately, No! But don\u2019t lose your hope yet. This No is different from the previous \u201CNo\u201Ds you\u2019ve been hearing for the last few years. Why? Read below. What is the current state of iOS web push notifications? Well, finally Apple has officially announced that \",/*#__PURE__*/e(o,{href:\"https://engagespot.co/blog/web-push-ios-safari-launch-2023\",nodeId:\"qp7_CWH9V\",openInNewTab:!1,smoothScroll:!1,children:/*#__PURE__*/e(\"a\",{children:\"support for web push notifications in Safari\"})}),\" will be available in iOS 16. Yes, iOS 16 is already live but it is not currently enabled. This functionality will be enabled later in 2023 with an update to iOS 16. So, we\u2019re only a few months away from sending web push notifications to our iOS users! If you check the \u201CExperimental Features\u201D section on iOS Safari settings, you can already see Push API listed there. But as of now, it is not functional.\"]}),/*#__PURE__*/e(i.div,{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/TbhpORLndv1iOkZzyo83/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:\"// Use serviceWorker.ready to ensure that you can subscribe for push\\nnavigator.serviceWorker.ready.then(\\n  (serviceWorkerRegistration) => {\\n    const options = {\\n      userVisibleOnly: true,\\n      applicationServerKey,\\n    };\\n    serviceWorkerRegistration.pushManager.subscribe(options).then(\\n      (pushSubscription) => {\\n        console.log(pushSubscription.endpoint);\\n      }, (error) => {\\n       \\n        console.error(error);\\n      }\\n    );\\n  });\",language:\"JSX\"})})})]});\nexport const __FramerMetadata__ = {\"exports\":{\"richText16\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText4\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText15\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText14\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText13\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText9\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText2\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText5\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText17\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText12\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText6\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText10\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText8\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText11\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText3\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText1\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText7\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],
  "mappings": "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",
  "names": ["richText", "u", "x", "p", "Link", "richText1", "richText2", "richText3", "richText4", "richText5", "richText6", "motion", "ComponentPresetsConsumer", "t", "CodeBlock_default", "richText7", "richText8", "richText9", "richText10", "richText11", "richText12", "richText13", "richText14", "Youtube", "richText15", "richText16", "richText17", "__FramerMetadata__"]
}
