<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nick Gottlieb</title>
    <description>The latest articles on DEV Community by Nick Gottlieb (@worldsoup).</description>
    <link>https://dev.to/worldsoup</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F665781%2Fa89854a3-b740-42f7-ba8e-85a5e8e92fab.jpeg</url>
      <title>DEV Community: Nick Gottlieb</title>
      <link>https://dev.to/worldsoup</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/worldsoup"/>
    <language>en</language>
    <item>
      <title>The Importance of a Future-Proofed Multichannel Notification System</title>
      <dc:creator>Nick Gottlieb</dc:creator>
      <pubDate>Thu, 01 Sep 2022 17:08:13 +0000</pubDate>
      <link>https://dev.to/courier/the-importance-of-a-future-proofed-multichannel-notification-system-3252</link>
      <guid>https://dev.to/courier/the-importance-of-a-future-proofed-multichannel-notification-system-3252</guid>
      <description>&lt;p&gt;Product notifications are a mission-critical component of your product that can’t be left to chance. However, notification channels are ever-evolving, and you need to keep up in order to reach users when, where, and how they prefer to be reached.&lt;/p&gt;

&lt;p&gt;A future-proof multichannel notifications strategy helps you stay in touch with your users without coming off as intrusive, non-responsive, or antiquated.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a Multichannel Notifications System?
&lt;/h2&gt;

&lt;p&gt;A multichannel notifications system is designed to seamlessly route and deliver messages about product-related events to users across multiple channels and providers.&lt;/p&gt;

&lt;p&gt;For companies that require a detailed and wide-ranging strategy to reach customers and potential users, a multichannel notifications system can help your company reach out to users in the way they prefer to be contacted. One of our clients, Bluecrew, a W-2 staffing platform that connects hourly workers with employers, recorded a &lt;a href="https://www.courier.com/blog/courier-bluecrew-multi-channel-notifications/"&gt;55% improvement&lt;/a&gt; in job application rates after scaling their notifications infrastructure with Courier.&lt;/p&gt;

&lt;p&gt;With multiple communication options, businesses need to think about how they’ll communicate different events to their users, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transactions: notifications that provide a summary of transactional updates&lt;/li&gt;
&lt;li&gt;Alerts: notifications that require high assurances of deliverability and visibility &lt;/li&gt;
&lt;li&gt;User activities: notifications that update users about key activities within their accounts or profiles&lt;/li&gt;
&lt;li&gt;Required actions: notifications that proactively let users know when action is needed&lt;/li&gt;
&lt;li&gt;Digests: notifications that deliver a dynamic summary of events
To do notifications well, a company/product requires a multichannel notifications strategy that can adjust with the times.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Traditional Approaches to Multichannel Notifications Systems Fall Short
&lt;/h2&gt;

&lt;p&gt;There are two traditional approaches to managing the notifications strategy for your apps: limited channel notifications and custom channel support.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Static and uncustomizable approach
&lt;/h3&gt;

&lt;p&gt;This is a notifications strategy that supports a handful of channels that are the only means of communicating with users, irrespective of the user’s needs or preferences. A strategy that supports a limited number of channels is common in legacy solutions with ancient codebases that are best left undisturbed. &lt;/p&gt;

&lt;p&gt;However, many newer products and services might unwittingly end up with a limited number of channels after a few years. Sometimes, product managers don’t consider how they’ll support notifications until the last minute. Then you are forced to choose whatever notification channel seems to work best at that time. The challenge with this approach is that you may never quite get around to introducing new channels, and it becomes impractical to make changes as your codebase grows. &lt;/p&gt;

&lt;p&gt;In contrast, a multichannel product notifications strategy that begins during product development allows you to bake agility into your plans to add new channels over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Customizable, yet unscalable Approach
&lt;/h3&gt;

&lt;p&gt;This is a notifications strategy in which the company actively works to support new channels as needs arise. This custom-channel notifications strategy is especially common with startups because they tend to move fast. Many startups, for instance, adopt the &lt;a href="https://youexec.com/book-summaries/blitzscaling-by-reid-hoffman-and-chris-yeh"&gt;blitzscaling product development&lt;/a&gt; approach that prioritizes speed over efficiency. In this case, you’d probably lean toward writing code to support new channels as the need arises instead of thinking strategically about how to manage notifications in the future. &lt;/p&gt;

&lt;p&gt;In the early days, the development team might power through the night or weekend to update your code so it can support a new notification channel, and it’s common to do this every time there’s an additional notification channel that needs support. &lt;/p&gt;

&lt;p&gt;While this ad-hoc approach might work in the short term, it eventually becomes unsustainable as your business grows. As your product development process matures, decision-making requires input across cross-functional teams. It’s not as easy to adapt on a whim.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Future-Proof Notifications System Adapts to Changing Communication Preferences
&lt;/h2&gt;

&lt;p&gt;A notifications strategy that takes into consideration that we live in a multichannel world is future-proof. It is designed to adapt to the dynamic needs of modern communication without being slow, expensive, or outdated for your stakeholders.&lt;/p&gt;

&lt;p&gt;A future-proof multichannel notifications strategy should let you notify users across channels, integrate with your existing tech, and reroute messages to different channels, all while being easy to use and scaling with your company. &lt;/p&gt;

&lt;h3&gt;
  
  
  Enable Notifications Across Multiple Channels Today
&lt;/h3&gt;

&lt;p&gt;A multichannel notifications strategy lets you switch across channels to meet the needs of your users. &lt;/p&gt;

&lt;p&gt;For instance, SMS is a popular notification channel in the United States, but there’s a strong &lt;a href="https://www.statista.com/statistics/291540/mobile-internet-user-whatsapp/"&gt;preference for WhatsApp&lt;/a&gt; in emerging markets. For example, 96.4% of Brazil’s digital population, 95.4% of South Africa’s digital population, and 95.2% of the digital population in Argentina actively use WhatsApp monthly. &lt;/p&gt;

&lt;p&gt;Similarly, &lt;a href="https://www.statista.com/statistics/250548/most-popular-asian-mobile-messenger-apps/"&gt;WeChat&lt;/a&gt; is the leading communication channel in Asia with 1.26 billion monthly active users, and emails seem to be the &lt;a href="https://www.statista.com/statistics/417288/preferred-delivery-service-convenience-options-in-europe/"&gt;preferred communication&lt;/a&gt; channel in Europe with 72% of respondents preferring emails over WhatsApp, SMS, or other communication channels. Your product notifications system must be robust enough to deliver notifications across all these channels.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deliver Notifications Across Multiple Providers on the Same Channels
&lt;/h3&gt;

&lt;p&gt;You also need to be able to pivot the delivery of notifications through different providers within a channel as providers compete on features, pricing, and other metrics. &lt;/p&gt;

&lt;p&gt;The benefits of being able to integrate with multiple providers accross a notifications channel include having a fallback option to ensure delivery of one provider has a downtime. Another benefit is that you might be able to shop around fo the best price per message based on the price offering of different providers in different countries. &lt;/p&gt;

&lt;p&gt;Therefore, you may want to be able to integrate with the following providers (and potentially more) across all the communication channels.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.courier.com/guides/email-notifications/"&gt;For emails&lt;/a&gt;: SendGrid, Mailgun, Amazon SES, SparkPost&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.courier.com/guides/sms-notifications/"&gt;For SMS&lt;/a&gt;: Twilio, MessageBird, Plivo, Telnyx &lt;/li&gt;
&lt;li&gt;For chat: WhatsApp, &lt;a href="https://www.courier.com/docs/guides/providers/direct-message/microsoft-teams/"&gt;Microsoft Teams&lt;/a&gt;, &lt;a href="https://www.courier.com/docs/guides/providers/direct-message/slack/"&gt;Slack&lt;/a&gt;, FB Messenger&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.courier.com/guides/android-vs-ios-push-notifications/"&gt;For push&lt;/a&gt;: Firebase, OneSignal, Airship, Expo&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Route Notifications Across Channels and Providers
&lt;/h3&gt;

&lt;p&gt;The preferences and needs of users are dynamic; therefore, users who only want email notifications today might later decide they want push notifications. &lt;/p&gt;

&lt;p&gt;The challenge with changing user preferences is that notification formats differ across channels. For instance, a notification requiring a user action sent by email needs a button, whereas the same notification sent as an SMS needs a hyperlink. &lt;/p&gt;

&lt;h3&gt;
  
  
  Make It Easier to Expand to Future Channels
&lt;/h3&gt;

&lt;p&gt;Your product notifications strategy should enable forward compatibility to integrate with new channels and providers as they emerge.&lt;br&gt;
Right now, Zoom and Microsoft Teams are the &lt;a href="https://www.statista.com/statistics/1246368/communication-services-usage/"&gt;leading business communication tools&lt;/a&gt;, but that could change in five years; after all, Skype &lt;a href="https://www.bloomberg.com/opinion/articles/2021-06-04/how-microsoft-let-skype-lose-out-to-zoom?sref=eDGWeidQ"&gt;used to be the standard&lt;/a&gt; some 10 years ago. When developing your product notifications strategy, you should insist on simple, elegant, and potentially modular code that can be easily updated to support new channels. &lt;/p&gt;

&lt;h3&gt;
  
  
  Scale Effortlessly for More Users and Messages
&lt;/h3&gt;

&lt;p&gt;As your business grows, your notifications strategy should accommodate your company’s size, from startup to enterprise and beyond. For instance, Gojek, a transport and logistics company in Southeast Asia, says it delivers more than &lt;a href="https://www.gojek.io/blog/how-we-manage-a-million-push-notifications-an-hour"&gt;1 million push notifications per hour&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;While your products may not need to send 1 million notifications per hour, you need to think about how the architecture of your product notifications system is designed to initiate, send, and deliver (and, where necessary, store) thousands of notifications as easily as it handles hundreds of notifications per day.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enhance the Agility of Your Product Notifications Strategy with Courier
&lt;/h3&gt;

&lt;p&gt;Building a custom multichannel strategy that adapts to a multichannel and fast-changing communication infrastructure is slow, expensive, and frustrating. Courier is on a mission to improve software-to-human communications with APIs. Courier helps you handle the notifications experience in your products, so you can focus on building your business. &lt;br&gt;
Courier empowers you to future-proof your multichannel product notifications strategy with shortened development time, dynamic templates, and analytics.&lt;/p&gt;

&lt;h3&gt;
  
  
  APIs Shorten the Development Time and Costs
&lt;/h3&gt;

&lt;p&gt;Courier shortens the time it takes to build a multichannel notifications strategy by providing you with APIs and SDKs, so you don’t have to start writing code from scratch. Our APIs can be integrated into all communication channels, from push to emails, and you can get support for more than 60 providers in a single API. Courier’s APIs also handle user data, templates, preferences, and message orchestration for a seamless product notification experience.&lt;/p&gt;

&lt;p&gt;Additionally, we provide SDKs for all major languages to enable you to implement geographical-based localization in the delivery of your notifications. &lt;/p&gt;

&lt;h3&gt;
  
  
  Templates Make It Easier to Add More Channels
&lt;/h3&gt;

&lt;p&gt;If you develop your templates manually, it might be difficult to manage the different variations of the templates as you add new channels and providers. Courier’s templating system has an omnichannel architecture. Courier Studio supports drag-and-drop designs, and you can use JSON-based templates to produce templates efficiently. Courier automatically generates notification templates that fit the format of each delivery channel before routing the messages through the right provider(s).&lt;/p&gt;

&lt;h3&gt;
  
  
  Analytics Improves the Notification Experience for Your Users
&lt;/h3&gt;

&lt;p&gt;Courier is also outfitted with analytics that helps you understand the notification experience of your users. Visibility into the quality of their experience also provides you with insights on how to optimize the notification experience across all the channels and providers you support. &lt;/p&gt;

&lt;h3&gt;
  
  
  Scale Your Notifications System Across Channels Effortlessly
&lt;/h3&gt;

&lt;p&gt;Courier’s modular model enables you to add new channels, replace providers, and route messages across channels in a unified system. Courier also functions as a low-code solution. So anybody on your team with minimal technical skills can add channels in minutes without a developer or knowing how to write code.&lt;/p&gt;

&lt;p&gt;Are you a PM who needs to establish or improve their app’s notification system? Check out our &lt;a href="https://www.courier.com/view-developer-guide/"&gt;ebook&lt;/a&gt; about what it takes to build a great notification system or just learn more about Courier by &lt;a href="https://www.courier.com/request-demo/"&gt;scheduling a demo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>notification</category>
      <category>ux</category>
      <category>productdesign</category>
      <category>channel</category>
    </item>
    <item>
      <title>Announcing Courier Automations: Application Logic for Notifications</title>
      <dc:creator>Nick Gottlieb</dc:creator>
      <pubDate>Fri, 03 Jun 2022 21:35:42 +0000</pubDate>
      <link>https://dev.to/courier/announcing-courier-automations-application-logic-for-notifications-3akd</link>
      <guid>https://dev.to/courier/announcing-courier-automations-application-logic-for-notifications-3akd</guid>
      <description>&lt;p&gt;We’re excited to announce a powerful new feature for the Courier platform: Courier Automations. Courier Automations is a toolset that includes both an API and a visual builder that allows anyone to easily configure logic for notification workflows. Need to send a reminder to class attendees 10 minutes before the class starts? Need to page an on-call engineer on multiple channels until they respond? These use cases and more can be achieved quickly and easily with Automations. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why we built Automations
&lt;/h2&gt;

&lt;p&gt;As developers, notifications are the primary way that the applications we build communicate with our end-users and the use cases vary widely. Some use cases are very straightforward and simply require that a single message goes to a single user once. Many notifications however require more sophisticated orchestration in order to deliver the desired user experience. Most developers today end up building a separate service to manage this logic. This results in additional infrastructure and development overhead and often in a less than ideal end-user experience. &lt;/p&gt;

&lt;p&gt;We built Automations so that developers can deliver the ideal notification experience without needing to build and maintain yet another service.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are product and engineering teams doing with Courier Automations today?
&lt;/h2&gt;

&lt;p&gt;While today marks the official release of Automations, many of our customers are already using Automation to power key parts of their product experience.&lt;/p&gt;

&lt;p&gt;The engineering team at &lt;a href="https://launchdarkly.com/"&gt;LaunchDarkly&lt;/a&gt;, a feature management platform, uses Automations to define the logic for notifications associated with approvals for their customers' feature releases. Any time approval is requested or granted, an Automation is triggered to ensure all the relevant stakeholders are alerted. You can read more about their use case here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://officevibe.com/"&gt;Officevibe&lt;/a&gt;, which is an employee experience platform, regularly sends out Slack notifications on behalf of their customers asking employees to complete a brief survey. Their engineering team utilizes the Automations API to create lists of users for whom the Slack survey could not be delivered and send them an email survey instead. &lt;/p&gt;

&lt;p&gt;For &lt;a href="https://yogainternational.com/"&gt;Yoga International&lt;/a&gt;, an online Yoga platform, it's essential that they deliver a seamless experience to their customers from the time they register for a live class through to the start of class. Their engineering team utilizes the Automations API to send timely reminders to class attendees for each live class that happens on their platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Meetings Reminder”
&lt;/h2&gt;

&lt;p&gt;Let's build a meetings reminder that sends an email reminder 10 minutes before the meeting and a link to the meeting notes two hours after the meeting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design the Messages:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log into &lt;a href="https://app.courier.com/"&gt;Courier&lt;/a&gt; and navigate to the &lt;a href="https://app.courier.com/designer/notifications"&gt;Notifications Designer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Design an email reminder that will  be sent 10 minutes before the meeting with the Gmail provider (or any email provider of your choice)
&lt;img src="//images.ctfassets.net/z7iqk1q8njt4/2di1jnFJgbxPu9FRtn1xDg/edd5e62f03fda896df4139b1a1868f2d/announcing-courier-automations-1.png" alt="announcing-courier-automations-1"&gt;
&lt;/li&gt;
&lt;li&gt;Access the template ID in the settings of that notification and save it for future reference&lt;/li&gt;
&lt;li&gt;Design an SMS reminder that will be sent two hours after the meeting with the Twilio provider (or any email provider of your choice)
&lt;img src="//images.ctfassets.net/z7iqk1q8njt4/5T0R822GmEl85UJjpxTT8z/32a31f01a4533dceac58da99e62e7f87/announcing-courier-automations-2.png" alt="announcing-courier-automations-2"&gt;
&lt;/li&gt;
&lt;li&gt;Access the template ID in the settings of that notification and save it for future reference&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How To Create an Automation Using the API (Node.js Example)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Within your Node.js app, install &lt;a href="https://www.npmjs.com/package/node-fetch"&gt;node-fetch&lt;/a&gt;
&lt;code&gt;npm install node-fetch&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to the &lt;a href="https://www.courier.com/docs/reference/automation/invoke/"&gt;Automations API Reference&lt;/a&gt; and copy the starter code&lt;/li&gt;
&lt;li&gt;Add an &lt;code&gt;automations&lt;/code&gt; object with an array of objects called &lt;code&gt;steps&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"automation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"steps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"send"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"template"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"template_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.courier.com/docs/reference/automation/invoke/"&gt;Automations API Reference&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.courier.com/docs/guides/tutorials/how-to-automate-message-sequences/"&gt;Automations Docs&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For this example, we will need three steps: send, delay, and another send. The first send step will send the 10 minute reminder. The delay step will wait for two hours after the meeting. The third step will send an SMS with a link to the meeting notes.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"automation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"steps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"send"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"template"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"template_id_1"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"delay"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"130 minutes"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"send"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"template"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"template_id_2"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Update &lt;code&gt;template_id_1&lt;/code&gt; with the notification template from Step 3 of “Design the Message” and update &lt;code&gt;template_id_2&lt;/code&gt; with the notification template from Step 5 of “Design the Message”&lt;/li&gt;
&lt;li&gt;Update the &lt;code&gt;brand&lt;/code&gt; and &lt;code&gt;recipient&lt;/code&gt; attributes with your preferred &lt;a href="https://app.courier.com/designer/brands"&gt;brand&lt;/a&gt; and &lt;a href="https://app.courier.com/users"&gt;recipient&lt;/a&gt; IDs&lt;/li&gt;
&lt;li&gt;If your steps reference any Notification Templates, update the ID &lt;code&gt;template&lt;/code&gt; attribute&lt;/li&gt;
&lt;li&gt;Run your code to trigger the Automation
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Dependencies to install:&lt;/span&gt;
&lt;span class="c1"&gt;// $ npm install node-fetch --save&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node-fetch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bearer replace-token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;automation&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;steps&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;action&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;send&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;template&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;template_id_1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;action&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;delay&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;duration&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;130 minutes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;action&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;send&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;template&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;template_id_2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;brand&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;W50NC77P524K14M5300PGPEK4JMJ&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;template&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;EXAMPLE_NOTIFICATION&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;recipient&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;8ec8c99a-c5f7-455b-9f60-8222b8a27056&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jane Doe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;profile&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;phone_number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2025550125&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello@example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.courier.com/automations/invoke&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Check the &lt;a href="https://app.courier.com/logs/automations"&gt;Datalog&lt;/a&gt; for delivery status and error messages&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How To Create An Automation Using the Studio
&lt;/h3&gt;

&lt;p&gt;This example demonstrates integrating an API V2 notification send call (Step 5 of "Design the Message").&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to the &lt;a href="http://app.courier.com/automations"&gt;Automations&lt;/a&gt; page&lt;/li&gt;
&lt;li&gt;Create an Automation Template from scratch
&lt;img src="//images.ctfassets.net/z7iqk1q8njt4/RjqcqLCVNS9lfXujVjfYi/53e5ac9daa1c3bd6127cd12d31240d98/announcing-courier-automations-3.png" alt="announcing-courier-automations-3"&gt;
&lt;/li&gt;
&lt;li&gt;Add a send step and select the “10 minute reminder” for the Notification
&lt;img src="//images.ctfassets.net/z7iqk1q8njt4/376Kg67N5NuoSnRFYkVMD2/d215697c258a3f184426eae7a0acc2ec/announcing-courier-automations-4.png" alt="announcing-courier-automations-4"&gt;
&lt;/li&gt;
&lt;li&gt;Add a delay step and update the length to 130 minutes&lt;/li&gt;
&lt;li&gt;Switch over to code mode (top right, under the the “Publish Changes” button) and add an API V2 notification send call for the SMS with a link to the meeting notes
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"send"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example@email.com"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Meeting Notes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Link to meeting notes: ..."&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="//images.ctfassets.net/z7iqk1q8njt4/5tHxpIlEfnpIxdYADaM9mk/cda00d734408dde76ef31a4ada77765e/announcing-courier-automations-5.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/z7iqk1q8njt4/5tHxpIlEfnpIxdYADaM9mk/cda00d734408dde76ef31a4ada77765e/announcing-courier-automations-5.png" alt="announcing-courier-automations-5"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;This step can be done within the designer by following Step 3&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select a trigger for the Automation (if no trigger is selected, the Automation can be triggered manually with a curl command)&lt;/li&gt;
&lt;li&gt;Publish changes to save your Automation&lt;/li&gt;
&lt;li&gt;Create a Test Event to test your Automation
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example@email.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;“name”:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;“Your&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Name”&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="//images.ctfassets.net/z7iqk1q8njt4/1wvA9W2yUDxkEZj6os4yNA/ace96c64264543efaa8a78099cc9b241/announcing-courier-automations-6.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/z7iqk1q8njt4/1wvA9W2yUDxkEZj6os4yNA/ace96c64264543efaa8a78099cc9b241/announcing-courier-automations-6.png" alt="announcing-courier-automations-6"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Invoke your Automation in the Designer or copy the starter code and run it in a terminal&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://app.courier.com/signup"&gt;Sign up for a free Courier account&lt;/a&gt; to get started with Automations. Courier’s Free Tier includes Automations and up to 10,000 notifications per month.&lt;/p&gt;

</description>
      <category>notification</category>
      <category>saas</category>
      <category>automations</category>
      <category>announcement</category>
    </item>
    <item>
      <title>Building Product Notifications That Users Love</title>
      <dc:creator>Nick Gottlieb</dc:creator>
      <pubDate>Mon, 11 Apr 2022 21:30:14 +0000</pubDate>
      <link>https://dev.to/courier/building-product-notifications-that-users-love-16ld</link>
      <guid>https://dev.to/courier/building-product-notifications-that-users-love-16ld</guid>
      <description>&lt;p&gt;Product notifications should never spoil a user’s experience—they should contribute to it. Otherwise, users are prone to turn off the notifications. According to Statista, &lt;a href="https://www.statista.com/statistics/1242709/us-too-many-push-notifications-users-reaction/"&gt;39%&lt;/a&gt; of smartphone users who receive too many notifications turn them off in response.&lt;/p&gt;

&lt;p&gt;So how do you create product notifications that delight a user no matter how harried? Consider your users and their many different experiences as you design and build your product, not after.&lt;/p&gt;

&lt;p&gt;In other words, your product should define the notification experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Notify Intelligently
&lt;/h2&gt;

&lt;p&gt;Simply put, notifying your users intelligently means serving them the right content, in the right channel, at the right time.&lt;/p&gt;

&lt;p&gt;Let’s say you work for a large airline and are currently building a mobile app to serve your travelers. Some information, like gate or flight time changes, must be served in real time to a user. Considering this scenario in the design and build phase allows developers to understand the right content, in the right channel, at the right time.&lt;/p&gt;

&lt;p&gt;Let’s say the real-time information our user needs is a gate change. Our user is hurrying through security and stressed to the max. A real-time push notification and or text message is probably the best way to send their gate details without adding more stress to an already stressed traveler.&lt;/p&gt;

&lt;p&gt;In our scenario, a push notification or an SMS at the right moment is the difference between a missed flight and a user who’s bound to churn and a happy traveler who will probably be a long-term user.&lt;/p&gt;

&lt;p&gt;However, there’s a fine line between delighting and spoiling a user experience. Push notifications and SMS are best for urgent updates like delays, cancellations, or gate/terminal changes. Travelers trying to get through security with their sanity intact do not need real-time push notifications or SMSs about promotions or travel deals—that would be an example of the wrong content, in the wrong channel, and at the wrong time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Offer Notification Granularity
&lt;/h2&gt;

&lt;p&gt;Let’s be real—today’s users &lt;a href="https://www.courier.com/blog/your-in-depth-guide-to-email-notification-services/"&gt;expect to maintain control&lt;/a&gt;, so offering notification preferences isn’t really an option anymore; it’s a must-do. Offering users control over how an app notifies them pays off exponentially in a user's lifecycle with the app.&lt;/p&gt;

&lt;p&gt;Granular permissions allow users to opt-in and opt-out of notifications that aren't time-sensitive or essential to the users' end experience. For example, when a user installs our fictional mobile travel app, they will be delighted to see that they have the option to curate their preferences around flight reminders. You might not let them opt out of gate or terminal changes, but you do let users choose whether they want seat upgrade or flight deal notifications.&lt;/p&gt;

&lt;p&gt;Once our user is safely through security and relaxing at their terminal—browsing options for seat upgrades or a deal on their next trip is delightful. Whereas notifying our users as they struggle to get to their terminal with dings and buzzes reminding them to UPGRADE!—spoils an already stressful airport experience.&lt;/p&gt;

&lt;p&gt;When developers don’t consider notification as an extension of the product and don’t offer preference controls to their users, they risk spoiling their users' experiences and losing them. In fact, research shows that &lt;a href="https://www.outerboxdesign.com/web-design-articles/mobile-ecommerce-statistics"&gt;40%&lt;/a&gt; of users will abandon an app for a competitor after a bad experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Know When to Batch
&lt;/h2&gt;

&lt;p&gt;To put it simply, don’t spam your users! Whether they're running late on a Monday morning or sweating their way through airport security, people rarely appreciate a stream of notifications.&lt;/p&gt;

&lt;p&gt;Have you ever collaborated with someone via &lt;a href="https://www.google.com/docs/about/"&gt;Google Docs&lt;/a&gt;? The tool is pretty smart about notifications. Instead of sending a separate email for every comment someone leaves, Google Docs bundles these notifications into a single email.&lt;/p&gt;

&lt;p&gt;Be like Google Docs. Instead of overwhelming your web users with notifications, group them into batches that you send just a few times per day.&lt;/p&gt;

&lt;p&gt;Think of our first user taking a moment in the car to silence their notifications indefinitely and probably forever, and instead, give users a reason to stay. &lt;a href="https://developer.android.com/training/notify-user/group"&gt;Android 7.0&lt;/a&gt; shows developers when and how to create and send group notifications so that you're not inadvertently spamming your users away.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be Helpful
&lt;/h2&gt;

&lt;p&gt;Serving your users’ information at the right time is only half the battle. Knowing what details your user needs is another.&lt;/p&gt;

&lt;p&gt;Let’s return to our fictional user relaxing in the terminal, waiting patiently for their flight (and looking forward to their upgraded and better seat). Suddenly, they receive a text message alerting them that the flight is canceled. A total bummer.&lt;/p&gt;

&lt;p&gt;But what if the text message also said: “click here for rebooking options”? Less of a bummer and actually kind of delightful.&lt;/p&gt;

&lt;p&gt;When notifying users, provide all of the information they need to help them achieve their end goal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Notification Analytics
&lt;/h2&gt;

&lt;p&gt;To constantly provide and optimize a better user experience, engineers and developers need to build their products with visibility. Visibility means being able to see and understand how users receive and/or react to your notifications.&lt;/p&gt;

&lt;p&gt;If a product engineering team can’t see how notifications are performing, they can't optimize their user experience. Once the product is built, engineers and developers should have a means of analyzing notification metrics, from deliverability open rates to engagement rates. Without this information, how will our fictional travel app know when it is the wrong time to send a push notification?&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving Forward with Notifications That Delight and Enhance UX
&lt;/h2&gt;

&lt;p&gt;Understanding that your product will ultimately define its users’ notification experiences means your engineering team can implement these ideals as they build. This is the best way to ensure your notifications enhance and don’t spoil your users’ experiences. In a nutshell:&lt;/p&gt;

&lt;h3&gt;
  
  
  TL;DR
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;One universal rule that will never fail your app or your users: consider your users and their many experiences while you design and build your product—not after.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are five ways to leverage notifications and make them core to your UX. Notify intelligently, offer notification granularity, know when to batch, be helpful, and use analytic visibility.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.courier.com/customers/hospitable/"&gt;Read&lt;/a&gt; more about real-life start-ups leveraging notifications successfully and how they are doing it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Or, &lt;a href="https://github.com/trycourier"&gt;try&lt;/a&gt; delivering in the right place and at the right time for yourself!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ux</category>
      <category>notifications</category>
      <category>productdesign</category>
    </item>
    <item>
      <title>Organizing In-app Communication With Inbox Feed</title>
      <dc:creator>Nick Gottlieb</dc:creator>
      <pubDate>Sat, 26 Mar 2022 22:51:44 +0000</pubDate>
      <link>https://dev.to/courier/organizing-in-app-communication-with-inbox-feed-pbb</link>
      <guid>https://dev.to/courier/organizing-in-app-communication-with-inbox-feed-pbb</guid>
      <description>&lt;p&gt;Notifications—such as emails, SMS, or push notifications from an app—are a big part of daily life. Whether for work, fun, banking, or just to chat, mobile notifications tell us what we need to attend to and when. While some users like getting notifications so that they don’t miss out, others turn off most notification channels for the sake of peace. But if it’s your application, what can you do to make sure that you’re communicating effectively with your users?&lt;/p&gt;

&lt;p&gt;Last year, Courier introduced the Inbox Feed, an in-app repository of the notification history so that users don’t miss out on any important information. In a notifications inbox, users can view all their notifications in one place. Having such a centralized repository for notifications makes it easier for users to tackle all relevant action items at once, reduces notification fatigue, and increases focus. Courier’s Inbox Feed implementation provides ready-made components that you can use and a scalable back-end API to power those components.&lt;/p&gt;

&lt;p&gt;Read on to learn how exactly embedding an Inbox Feed into your application can benefit your users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why you need an Inbox feed
&lt;/h2&gt;

&lt;p&gt;In this section, we’re going to talk about how an Inbox Feed can be a viable solution for users who have difficulties staying connected. &lt;/p&gt;

&lt;h3&gt;
  
  
  Dealing with notification overload
&lt;/h3&gt;

&lt;p&gt;Most applications have more than one way of communicating with their users. Notification channels such as push, SMS, and e-mail are all point-in-time notifications. When they are sent out, a user might not be directly using the app or even available to attend to the notification. When the user does choose to review the missed notifications, they might have to check more than one channel, such as an email about a planned outage or push notifications about changes in status in the application. In that case, the user will have to pick the pieces up separately, by checking different channels, to stay informed. In the example of an email about a planned outage, they might forget about it completely and get frustrated when they can’t access your application. Separately, their email client might be filtering out certain messages so they might never have seen the email about an outage. Some users disable all notifications to avoid being overwhelmed by them, even if they specified contact preferences in your application. These users risk missing out on important information, and your product risks losing engagement with them.&lt;/p&gt;

&lt;p&gt;This is why a central feed for notifications, inside your app, will be a huge improvement to  users' experience with your application. With a notification inbox, users can control what they attend to and when. A historical notification feed takes the pressure off users to feel like they need to respond immediately. It can improve user engagement by giving them a sense of control over how they interact with your application. &lt;/p&gt;

&lt;p&gt;Popular examples of historical notification feeds include Facebook’s News Feed and the notification history in Reddit or GitHub. In the widely-known Facebook News Feed, when a user enters the application, they can click on the notification bell icon to see a historical list of all events since they last logged in. These can include messages and comments to relevant pages and what their friends were up to. Reddit’s notification repository is similar: when a user enters the application, the notification bell icon is lit with a red circle and links to new messages, comments, and other relevant popular subreddits for the user to check out. In applications like these, when there is a lot of activity, a notification feed allows a user to see everything that has happened since they last used the application.&lt;/p&gt;

&lt;p&gt;In GitHub’s case, the notification repository also includes notifications that depend on other user activity, such as assignments and review requests. Below is an example of the notification inbox on GitHub, which is accessed by clicking on the bell icon in the top right corner.&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/z7iqk1q8njt4/2GjKRa3XYpCGUicNymXBKm/54e890bead09cdec1c00839d48167651/inbox-feed-1.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/z7iqk1q8njt4/2GjKRa3XYpCGUicNymXBKm/54e890bead09cdec1c00839d48167651/inbox-feed-1.png" alt="inbox-feed-1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Effective distribution of information for collaboration
&lt;/h3&gt;

&lt;p&gt;Effective distribution of information is important, especially in the case of B2B SaaS applications, where teams from different companies or different departments are often collaborating to work together on more than one project. Users need to understand the scope of each project’s status and who is doing what and when. In a business application like Asana or Trello, users can get notified of any activity on their projects by email and push notifications. However, it is still essential that they can see all such updates when they log into the application, such as mentions, conversations, deadline changes, and project changes. Without the Inbox page in Asana or Trello, it would be difficult for someone working on more than one project to keep track of these updates. Scattered notifications via email or push are not as efficient in distributing that information—especially for collaboration—as a notification inbox embedded in the app. Weekly digest emails are another option, but they are inadequate for teams working within strict deadlines. &lt;/p&gt;

&lt;p&gt;Google Docs, for example, allows all users sharing a document to view all comments and suggestions via the Comments drop down menu, in addition to sending comments to the document’s collaborators via email. In the Google Docs interface, users can view current and past comments, and sort comments by status.&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/z7iqk1q8njt4/65xyYqhkXTo2vxDn3hUZ9H/325f374b560887d2f7becff0473357cf/inbox-feed-2.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/z7iqk1q8njt4/65xyYqhkXTo2vxDn3hUZ9H/325f374b560887d2f7becff0473357cf/inbox-feed-2.png" alt="inbox-feed-2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Smoothing workflow automation with notification inbox
&lt;/h3&gt;

&lt;p&gt;For many B2B SaaS applications, automating a workflow is the core value the software delivers. Examples include team members receiving access requests, review requests, or other notifications requiring the action of another user. These teams need to function efficiently, within deadlines, and it is up to the design of the application to ensure that all relevant information is available as clear as possible and easy to visualize. A notification feed empowers a user to get an understanding of what’s happening overall in the scope of their projects and administrative requests and attend to them as necessary. &lt;/p&gt;

&lt;p&gt;In early 2022, &lt;a href="https://launchdarkly.com/"&gt;LaunchDarkly&lt;/a&gt;, a software feature development platform and one of Courier’s clients, &lt;a href="https://launchdarkly.com/blog/new-inbox-for-flag-approvals/"&gt;decided to include&lt;/a&gt; the Inbox feature in its product. LaunchDarkly’s reasoning was similar to what we have outlined here: some notifications, especially those that require an action from another user, are too important to be overlooked. To avoid the uncertainty of a user missing an email or Slack notification and potentially delaying the development or approval process, the Inbox Feed makes all notifications ever-present and accounted for, every time a user logs in. &lt;/p&gt;

&lt;p&gt;Below is an example of LaunchDarkly’s Inbox feed, accessed by the bell icon in the top right corner.&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/z7iqk1q8njt4/7eZaAVJ0v2xiFh0EwVtYTs/1840c947b3c600107cb46c756eab971a/inbox-feed-3.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/z7iqk1q8njt4/7eZaAVJ0v2xiFh0EwVtYTs/1840c947b3c600107cb46c756eab971a/inbox-feed-3.png" alt="inbox-feed-3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing an Inbox Feed is faster with Courier
&lt;/h2&gt;

&lt;p&gt;If you’ve decided to implement an inbox feed feature in your app, there are two main components that you need to consider: the front-end element responsible for displaying the notifications in the user interface, and the back-end system that handles the sending of the notifications and their read/unread status. &lt;/p&gt;

&lt;p&gt;For the front-end, there are several open-source React libraries to choose from. At Courier, we recommend &lt;a href="https://github.com/fkhadra/react-toastify"&gt;react-toastify&lt;/a&gt;. Alternatively, you could use a framework like &lt;a href="https://react-hot-toast.com/"&gt;react-hot-toast&lt;/a&gt; or &lt;a href="https://github.com/iamhosseindhv/notistack"&gt;notistack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On the back-end, you can integrate your own notifications provider with the front-end components, or you can use &lt;a href="https://www.courier.com/docs/guides/providers/in-app/courier-push/"&gt;Courier Push&lt;/a&gt; to power your inbox feed—and get additional features. For example, Courier Push takes care of read status: if a user already opened an email that was sent through Courier, the Inbox will show the respective notification as read. Courier’s API gives you the power to make a single function call that can notify a specific user via any already configured channel. A user can also delete notifications to keep their feed organized and uncluttered.&lt;/p&gt;

&lt;p&gt;If you decide to build the back-end yourself, consider how you will integrate various channels and how you will scale the back-end for growth. This is ultimately a build-or-buy decision: are you ready to spend resources on building this feature, or do you prefer to use an already reliable and easily integrated service with Courier? If doing it yourself, you’ll need a developer dedicated to fixing issues, for example, if an error or delay occurs and the feeds do not update by the time a user logs in. As with all notifications, it’s vital that an inbox feed is reliable and stays relevant for its users or it risks its actual usefulness as a feature. Check out our other articles on building a &lt;a href="https://www.courier.com/blog/routing-and-preferences/"&gt;routing engine&lt;/a&gt; and &lt;a href="https://www.courier.com/blog/scalability-and-reliability/"&gt;scalable and reliable systems&lt;/a&gt; for what you need to know if you’re thinking of making the build yourself.&lt;/p&gt;

&lt;p&gt;With Courier Push, you would use the configuration studio to customize the Inbox feature for your application, pictured below. Or, if you prefer, you could customize the Inbox feed &lt;a href="https://www.courier.com/blog/react-toast-inbox-notifications/"&gt;with code&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/z7iqk1q8njt4/4cMhCSbpC7h85gxGekdAqc/96d6fe7006314c0489bee9c986f872a0/inbox-feed-4.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/z7iqk1q8njt4/4cMhCSbpC7h85gxGekdAqc/96d6fe7006314c0489bee9c986f872a0/inbox-feed-4.png" alt="inbox-feed-4"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To get a feel for setting up an Inbox feed for your application, try it out on this &lt;a href="https://reactinappnotification.com/"&gt;Courier-powered playground&lt;/a&gt;. You can see our example below. The first image shows the notification alert as we had entered it. The second image illustrates the actual Inbox view.&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/z7iqk1q8njt4/5GdSzajhiu5VHQBK8AR7Wn/e651bc3c6faf38fc57c75c1c6808ed9e/inbox-feed-5.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/z7iqk1q8njt4/5GdSzajhiu5VHQBK8AR7Wn/e651bc3c6faf38fc57c75c1c6808ed9e/inbox-feed-5.png" alt="inbox-feed-5"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/z7iqk1q8njt4/7xitd5ihUdYOzOyIqVZl8p/0f84febb8e70c66fe61e8f43b33023ad/inbox-feed-6.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/z7iqk1q8njt4/7xitd5ihUdYOzOyIqVZl8p/0f84febb8e70c66fe61e8f43b33023ad/inbox-feed-6.png" alt="inbox-feed-6"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ready to give the Inbox a try?
&lt;/h2&gt;

&lt;p&gt;Notifications are integral for connecting with your users and alerting them to an event, or another piece of relevant information. But without a repository of the notification history, your application might be losing out on valuable engagement with your users or hindering timely collaboration between them. Our Inbox feature strives to improve user engagement and social collaboration within applications. We see it as a valuable tool that empowers users to take control.&lt;/p&gt;

&lt;p&gt;Read more about how to integrate Inbox &lt;a href="https://www.courier.com/blog/react-toast-inbox-notifications/"&gt;here&lt;/a&gt;. If you’re looking to learn more about the feature, check out our &lt;a href="https://www.courier.com/docs/guides/providers/push/courier-push/"&gt;documentation&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>features</category>
      <category>webdev</category>
      <category>api</category>
      <category>saas</category>
    </item>
    <item>
      <title>3 Types Of User Communication APIs and when to use them.</title>
      <dc:creator>Nick Gottlieb</dc:creator>
      <pubDate>Thu, 06 Jan 2022 21:12:21 +0000</pubDate>
      <link>https://dev.to/courier/3-types-of-user-communication-apis-and-when-to-use-them-2eca</link>
      <guid>https://dev.to/courier/3-types-of-user-communication-apis-and-when-to-use-them-2eca</guid>
      <description>&lt;p&gt;As modern applications have become increasingly feature-rich and performant, user expectations are at an all-time high. Failure to communicate key information or displaying out-of-date information frustrates users and causes a loss of trust. Think about the last time you ordered something online: if you didn’t receive your order confirmation within seconds, you probably began to worry that something went wrong. Users require product transparency for consistent use.&lt;/p&gt;

&lt;p&gt;Luckily for developers, a proliferation of new APIs have been developed to help provide features such as real-time order update emails, push notifications based on in-app activity, or live chat with sales and support. Communications APIs are becoming increasingly specialized, with each type being more or less suited to certain tasks.&lt;/p&gt;

&lt;p&gt;If you’re an engineer who’s been tasked with planning out your application’s communication strategy, this post will help you map out the landscape. You’ll come away understanding the three core types of user communication APIs and in which circumstances you should use them to create the best possible end-user experience. We’ll also show you how using the right APIs in the right places will streamline your own day-to-day work.&lt;/p&gt;

&lt;p&gt;Let’s get into it! &lt;/p&gt;

&lt;h2&gt;
  
  
  Planning Your Communications API Strategy
&lt;/h2&gt;

&lt;p&gt;The best outcome any engineer can hope for is that your communications strategy is so smooth, it isn’t even noticed. For the end user, it just works exactly when it’s supposed to work, the way it’s supposed to work. For your own internal teams, everyone has the ability to craft the messaging they need and send it when they need, without unnecessary bottlenecks that can often impact your own engineering time.&lt;/p&gt;

&lt;p&gt;In a marketplace application, for instance, users need to get an automated push notification or email every time someone comments on an item they’re selling. The marketing department also wants to send email campaigns to everyone who has purchased an item in the past six months to let them know there’s a sale coming up. When a buyer’s checkout fails, they might need to message your sales or support team to get help and complete the transaction. &lt;/p&gt;

&lt;p&gt;All of these are very different examples that will need to use a different type of communications API to get the job done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploring The Three Types
&lt;/h2&gt;

&lt;p&gt;Communications APIs are segmented not only by the functionality they provide and how immediately they need to respond to user actions but also often by which teams at the company will need to use them to send messaging. &lt;/p&gt;

&lt;p&gt;App-to-user APIs are highly customizable, instant communications sent by engineering as integral parts of the application experience, such as push notifications about likes or comments. Brand-to-user APIs collect data and give the company, particularly marketing and product teams, the ability to send users targeted messages individually or en masse. User-to-user APIs facilitate live chat either among app users or with someone at your company, such as sales or support.&lt;/p&gt;

&lt;p&gt;Let’s discuss the strengths and weaknesses of the three types of APIs, and see some commonly-used third-party providers for each.&lt;/p&gt;

&lt;h2&gt;
  
  
  App-to-user APIs
&lt;/h2&gt;

&lt;p&gt;App-to-user APIs are transactional messages that are embedded into the application code. These APIs are often the most mission-critical of the three, as they form a core part of the application experience. For instance: your rideshare has arrived, your order was received, you have just been added to this chat room, here is your one-time password for login. These types of communications tend to be time-sensitive and are designed to send immediately when the trigger events occur.&lt;/p&gt;

&lt;p&gt;A robust App-to-user API will provide multi-channel communication (email, SMS, and push notification), complex routing, and easy opt-in and opt-out for users. Most can be heavily automated as well. For instance, when a new user is created via Auth0, a welcome push notification can be automatically sent.&lt;/p&gt;

&lt;p&gt;App-to-user APIs are typically instrumented and used by engineering teams. Companies who have the resources may choose to build their own App-to-user API infrastructure, which we have &lt;a href="https://www.courier.com/blog/the-developers-guide-user-requirements"&gt;a guide on how to do here&lt;/a&gt;. Courier also provides a ready-to-use App-to-user API infrastructure. &lt;/p&gt;

&lt;h2&gt;
  
  
  Brand-to-user APIs
&lt;/h2&gt;

&lt;p&gt;Brand-to-user communication happens any time your company has a message for a specific group of users. Maybe the product team noticed that a user got partway through the sign-up flow but didn’t hit the “complete” button. Maybe marketing wants to tell everyone in New York about an upcoming in-person event.&lt;/p&gt;

&lt;p&gt;Braze and Customer.io are two examples of out-of-the-box Brand-to-user APIs. Engineering implements API calls in the application code that log information about user behavior, which then gets sent to a separate dashboard other teams at the company can access. Anyone on those teams can then use that data to craft and send messages to specific subsets of users. For instance, users who didn’t complete the sign-up flow, or who live in New York. Brand-to-user APIs save engineering time because, once the initial API calls are instrumented, any team who needs to send campaigns or needs to access that data can do so easily and independently.&lt;/p&gt;

&lt;p&gt;While Brand-to-user APIs make it easy for anyone at the company to send messaging to users, they typically aren’t configurable enough to power core parts of the application experience. Messages can go out minutes to hours after user criteria for the message have been met. There can also be implementation delays any time you want to send messages based on a different set of criteria than you were using before—new API calls in the app mean the data needs time to populate before they can be used. &lt;/p&gt;

&lt;p&gt;While this trade-off is often worthwhile for marketing and product communications, App-to-user APIs (discussed above) are a much better fit when you need fine control over messaging content or timing within engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  User-to-user APIs
&lt;/h2&gt;

&lt;p&gt;User-to-user communication APIs facilitate active conversations among two or more individuals—either between a user and someone on your own internal staff or from one app user to another. &lt;/p&gt;

&lt;p&gt;Support tickets, for instance, are a type of User-to-user API, as are live chat boxes that let customers have direct conversations with your support or sales teams. Likewise, two users in a marketplace might need to message each other to offer bids or send along shipping information. While these are possible services to build out in-house, most companies opt to save time by going with a ready-to-use SaaS solution, such as Intercom, Zendesk, or Sendgrid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Most applications will use more than one type of user communications API for different parts of the user experience. Your application may very well use all three! &lt;/p&gt;

&lt;p&gt;App-to-user APIs provide part of the application’s core functionality. These APIs are highly customizable and provide instant user communication that is tightly coupled with your application code. Marketing and product teams will often want a Brand-to-user API implementation that makes it easier to see user data and send updates to users. User-to-user APIs give customers access to back-and-forth communication either among each other, or with company support or sales teams.&lt;/p&gt;

&lt;p&gt;When you’re thoughtful about your communications strategy, you can create a seamless experience for users while also enabling everyone on your team to save time and do their best work. &lt;/p&gt;

&lt;p&gt;Read on for more information on building user communication API infrastructure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.courier.com/blog/the-developers-guide-user-requirements"&gt;The Developer's Guide to Building Notification Systems: User Requirements&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.courier.com/blog/multi-channel-notifications-aws"&gt;How to Set Up Multi-Channel Notifications in Your AWS Stack&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Illustration by &lt;a href="https://rrebekkaa.com/"&gt;Rebekka Dunlap&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>productstrategy</category>
      <category>ux</category>
      <category>usercommunications</category>
    </item>
    <item>
      <title>APIs: The Prefabrication Of Software</title>
      <dc:creator>Nick Gottlieb</dc:creator>
      <pubDate>Tue, 12 Oct 2021 17:31:13 +0000</pubDate>
      <link>https://dev.to/courier/apis-are-the-prefabrication-of-software-3f6g</link>
      <guid>https://dev.to/courier/apis-are-the-prefabrication-of-software-3f6g</guid>
      <description>&lt;p&gt;Whether it’s for building a company, monitoring the news, or even making a grocery list, software penetrates every part of the modern western lifestyle. The demand for software far exceeds what developers (and the tech industry as a whole) are capable of supplying from scratch. In order to keep pace with demand, our industry has been increasingly shifting towards a ‘prefabrication’ model of software development via the utilization of third party APIs. While this trend has been in the making for 10 to 15 years already, the market is poised for continuous aggressive change in the coming years as well. &lt;/p&gt;

&lt;p&gt;We can say this with confidence because history tells us so. At the turn of the century, when large-scale construction was beginning to become common, constructing an office building or factory required bringing together a large group of expert craftsmen at a jobsite. Expert carpenters were needed to build the doors and framing, expert glass blowers for the windows, expert masons to cut and lay the stone, blacksmiths to create the steel structure, and so on. As the 20th century progressed, and demand for construction skyrocketed, various forms of prefabrication were developed in order to make construction faster, cheaper, and more accessible. For high-end, custom buildings, the prefabricated parts components could be limited to the windows, doors, and HVAC system while at the other end of the spectrum entire buildings can be erected in days out of completely prefabricated components. In fact, McDonalds has been known to complete a building in mere weeks this way.&lt;/p&gt;

&lt;p&gt;The evolution of software development has followed a similar trajectory, with APIs serving as the prefabricated software that companies are leaning on to build software faster and more cheaply than ever before. &lt;/p&gt;

&lt;h2&gt;
  
  
  How APIs Came To Be
&lt;/h2&gt;

&lt;p&gt;In many ways, Amazon pioneered this ‘prefabrication’ mode for software developers when they &lt;a href="https://techcrunch.com/2016/07/02/andy-jassys-brief-history-of-the-genesis-of-aws/?guccounter=1&amp;amp;guce_referrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8&amp;amp;guce_referrer_sig=AQAAAKjTagbGmqb5tALtmO9uJRDw6CvoMgqmADXnDo95xyGasEsw6TZalE5GDoqfu0uJnZRW10rlTKH6cOUiEO1iWdivlJG7I4k_NM4MXGy90xgia38Ug7dpfG2TALpGZbEVHe1SVVSy5P2xpLVhbPp3gjI7fHW8HWIssqvhzGffkGp2#:~:text=AWS%20was%20first%20to%20market,share%2C%20at%20least%20for%20now."&gt;released Amazon Web Services&lt;/a&gt; in 2006. By making Amazon’s excess compute resources available to other software companies to use in the form of APIs, the capital and expertise needed to build a software company was reduced dramatically. Do you want to spend your technical resources trying to scale and manage infrastructure better than Amazon? For the vast majority of companies the answer is no, they’d rather spend those resources focusing on the more specialized parts of their software, and that’s why AWS generated $46 billion in revenue last year. &lt;/p&gt;

&lt;p&gt;Since AWS, hundreds of other API-as-a-service companies have emerged to help other software companies build faster and cheaper. Twilio came up for digital communication. Stripe was used for payments. Shopify was available for e-commerce. Okta became important for user authentication. Just these four companies represent over $350 billion in enterprise value and have laid a lot of the groundwork for this industry, but it’s still very early in this movement. There are still many parts of the software stack that have yet to be ‘prefabricated’ and millions of hours of development are still spent on building the same functionality over and over again when it would be far more efficient and lead to more innovation if those hours were spent on building unique value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Vs. Buy Has Become An Important Decision For Developers
&lt;/h2&gt;

&lt;p&gt;The rise of APIs-as-a-service is increasing both the prevalence and importance of the ‘build vs buy’ decision within engineering teams. Should we roll our own user authentication service or buy Auth0? Should we roll our own payments platform or buy Stripe? As my colleague Tejas controversially argued in &lt;a href="https://www.courier.com/blog/the-three-things-to-never-build-in-your-app"&gt;his post&lt;/a&gt;, user authentication, payments, and notifications are three things that you should never build yourself. While many people did not agree with that particular thesis, the trend of engineering orgs evaluating API solutions in order to get their product to market faster is certainly growing.&lt;/p&gt;

&lt;p&gt;What this means for engineers is that having the ability to effectively evaluate APIs and run a cost benefit analysis as opposed to creating a custom solution is becoming increasingly important. As a company that builds and sells an API, we see it all the time here at Courier. A software company, typically a medium to large startup, begins to run into some pain points around sending and managing product notifications. A decision is made to find a new notification service that meets their needs and tap a senior engineer to decide how this problem should be solved. He or she typically evaluates using Courier rather than rolling out a custom solution and then makes a case for which solution they think is a better fit to their team. &lt;/p&gt;

&lt;p&gt;Having a good understanding of the currently available products and functionality offer, being able to effectively estimate the total cost of ownership for both an API solution as well as a homegrowth solution, and being able to effectively map out the integration strategy for API  products are all skill sets that are becoming ever more valuable in both developers and engineering leaders.  &lt;/p&gt;

&lt;h2&gt;
  
  
  The Developer As Artist
&lt;/h2&gt;

&lt;p&gt;As APIs handle more and more of the monotonous and undifferentiated parts of the software stack, developers' time is being freed to be spent creating new, unique, and highly valuable product experiences. In the past several years we’ve seen brand new software startups take on challenges as diverse and complex as automating and streamlining the mortgage application process, building marketplaces for pretty much any good or service imaginable, democratizing the ownership of publicly traded stock, and much more. &lt;/p&gt;

&lt;p&gt;As the proliferation of APIs continues, software development will be able to focus less on solving low level systems and infrastructure challenges and more on the creative side of product and customer experience. Of course, there will always be a place for the engineers who truly want to dig into systems challenges (someone does have to build these APIs, after all), but the engineer who is adept at leveraging APIs in order to deliver a more differentiated product more quickly will become increasingly valuable and sought after.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Is Only The Beginning
&lt;/h2&gt;

&lt;p&gt;The prefabrication of software via APIs is the next big wave of disruption in the software industry, and while it has already arrived, we’re only in the beginning phases. There are still hundreds, maybe thousands, of technical challenges that are repeatedly solved across nearly every software company or vertical that could be successfully prefabricated via an API. As slower moving industries such as insurance, healthcare, education, and  finance become increasingly digital, additional API services will emerge to serve those industries. As digital regulations around privacy and security continue to mature, we’ll see more APIs focused at helping with compliance. The startup engineers of the future will either be building APIs to help other companies move faster or leveraging those APIs to take their own product to market.&lt;/p&gt;

</description>
      <category>api</category>
      <category>saas</category>
      <category>software</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Add a Notification System to your MVP</title>
      <dc:creator>Nick Gottlieb</dc:creator>
      <pubDate>Fri, 09 Jul 2021 23:19:02 +0000</pubDate>
      <link>https://dev.to/courier/how-to-add-a-notification-system-to-your-mvp-4bnl</link>
      <guid>https://dev.to/courier/how-to-add-a-notification-system-to-your-mvp-4bnl</guid>
      <description>&lt;p&gt;As a product engineer, you likely understand the value of incorporating notifications functionality into your Minimum Viable Product (MVP).&lt;/p&gt;

&lt;p&gt;Here's what you can accomplish by building notifications:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drive engagement.&lt;/strong&gt; Notifications inform customers that there’s something going on in your application that’s worthy of their attention. Timely notifying your audience about valuable content or interactions with other users is great for building trust and engagement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable user journeys based on asynchronous actions.&lt;/strong&gt; If you don’t expect your users to always be connected to your app or service, notifications enable your users to stay plugged in without having to constantly check for updates in-app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Support time-sensitive operations.&lt;/strong&gt; Perhaps you’re planning on requiring two-factor authentication at login, or maybe you simply want to let account admins know each time somebody new first signs into their workspace. In both cases, adding real-time notifications can help call attention to time-sensitive details where needed.&lt;/p&gt;

&lt;p&gt;At the MVP stage, developers focus on finding product-market fit for their venture. On the one hand, this means experimenting with functionality that’s capable of creating value. On the other hand, teams at this phase start requiring less and less time on every new experiment, before finding something that works.&lt;/p&gt;

&lt;p&gt;In this article, we show you how to build a notification system for your MVP, in a way that both enables experimentation and helps you get results quickly.&lt;/p&gt;

&lt;p&gt;Let’s dive in!&lt;/p&gt;

&lt;h2&gt;
  
  
  The main components of a notification system
&lt;/h2&gt;

&lt;p&gt;We’ll start by reviewing a very simple notification system for an application:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwju1qwvdwmurjxeyobnn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwju1qwvdwmurjxeyobnn.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
mvp-stage notification system&lt;br&gt;
Architecture diagram for a simple notification system.&lt;/p&gt;

&lt;p&gt;This simple system, though functionally limited, still has certain key components that enable its extensibility to future use cases: a set of notification triggers, a central place for all notification-related decision logic, a simple templating system, and connections to various messaging providers.&lt;/p&gt;

&lt;p&gt;Let’s walk through the components and show what a simple implementation for each part would look like in JavaScript. We’ll begin on the diagram’s right, where the elements are more specific, and will work towards the left, where components become more abstract.&lt;/p&gt;
&lt;h3&gt;
  
  
  Email dispatch via an email API
&lt;/h3&gt;

&lt;p&gt;Sending an email through an email API is straightforward: we connect to an email provider using its JavaScript SDK, form the message with the parameters required, and then send the message.&lt;/p&gt;

&lt;p&gt;In this example, we’ll work with AWS SES as the email provider—but you would get a similar result if you're working with another provider. &lt;/p&gt;

&lt;p&gt;First, we’ll need to install the AWS SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="nx"&gt;aws&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;sdk&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can then use the SDK to send an email through SES:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// notify.js&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;us-east-2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;ses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SES&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;notify_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email_address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;Destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ToAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nx"&gt;email_address&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; 
        &lt;span class="na"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Charset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UTF-8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; 
            &lt;span class="na"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Charset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UTF-8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; 
        &lt;span class="na"&gt;Source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;patrician@disc.world&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="nx"&gt;ses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;     &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we send a text-only email and skip the HTML version. We hard-code the source address as we assume that all emails will come from the same sender on our side. All of these assumptions can be changed in the future as our product expands.&lt;/p&gt;

&lt;h3&gt;
  
  
  Message templates
&lt;/h3&gt;

&lt;p&gt;We can now send emails, but it’s going to be unviable to handcraft every email at the various codebase locations from which notifications can originate.&lt;/p&gt;

&lt;p&gt;Message templates are a pattern that lets you easily parameterize your notifications with user data. Here’s our simple templating “system”:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// notify.js&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;template_activity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`Hello &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;first_name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt;, there is an interesting post that you can check out here:

                            https://disc.world/activity`&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of going with string literals, we can use more functional solutions like mustache.js once we need to send more complex notifications.&lt;/p&gt;

&lt;p&gt;In the above example, however, we’ve generated just one template. Templates for HTML emails, push notifications, or chat notifications could follow in the same function.&lt;/p&gt;

&lt;h3&gt;
  
  
  Notification decision logic
&lt;/h3&gt;

&lt;p&gt;With email sending and templates out of the way, we now need to make decisions on whether we should notify users about a given event. The simplest approach to this task is a function that switches between notification types based on the parameters being passed in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// notify.js&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maybe_notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;activity&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;// todo: check notification preferences&lt;/span&gt;
            &lt;span class="c1"&gt;// todo: check unsubscribe list&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sending activity notification to user:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="nf"&gt;notify_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Something interesting on the Discworld!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nf"&gt;template_activity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email_address&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our function selects the right template and messaging medium based on notification type, and also creates a log message so that we can debug any issues.&lt;/p&gt;

&lt;p&gt;You might not always want to notify someone of new activity, so we’ve added a few TODOs to check for preferences and monitor our unsubscribe list.&lt;/p&gt;

&lt;h3&gt;
  
  
  Notification trigger
&lt;/h3&gt;

&lt;p&gt;Finally, we need to wire everything together and send an activity notification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// notify.js&lt;/span&gt;

&lt;span class="nf"&gt;maybe_notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;activity&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email_address&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rincewind@disc.world&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;first_name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Rincewind&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In our example, the function is accessible directly in our JavaScript file, but if you’re accessing notifications through various services, this might happen over an HTTP or RPC API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Running the example
&lt;/h3&gt;

&lt;p&gt;To run the example, we ensure that our AWS account is configured and then run node notify.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="nx"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;
&lt;span class="nx"&gt;Sending&lt;/span&gt; &lt;span class="nx"&gt;activity&lt;/span&gt; &lt;span class="nx"&gt;notification&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;ResponseMetadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;RequestId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;751ecac5-d140-4717-a06a-94b3b42d01ef&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;MessageId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;010f017a15621a86-ac305fa4-919a-4178-8362-7faf64e10cc8-000000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And we can see the resulting email in our email client:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv377vxgv2txyfsqfp16k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv377vxgv2txyfsqfp16k.png" alt="email example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The resulting email in our email client.&lt;/p&gt;

&lt;p&gt;While this is a very simple notification system that’s quick to set up, it still includes key components that you'll be able to build on top of when your MVP moves forward to the next stage.&lt;/p&gt;

&lt;h2&gt;
  
  
  What should you leave out of an MVP-stage notification system?
&lt;/h2&gt;

&lt;p&gt;With an MVP-stage system, the goal is to make your notifications sufficiently functional for all sides without over-allocating time to make that happen.&lt;/p&gt;

&lt;p&gt;This doesn’t mean that you should save on error handling and unit tests, however. Our recommended approach for an MVP-stage notification system is to keep the initial amount of functionality that the system offers limited while keeping its quality high, following best practices, and thoroughly testing all code paths.&lt;/p&gt;

&lt;p&gt;Let’s expand on that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features to exclude from an MVP
&lt;/h3&gt;

&lt;p&gt;To help you decide which features should go into an MVP-stage notification system, think about what you’re trying to achieve with your MVP.&lt;/p&gt;

&lt;p&gt;You’ve likely already defined one or more metrics for the MVP’s success (if you haven’t, &lt;a href="https://svpg.com/assessing-product-opportunities/" rel="noopener noreferrer"&gt;you should consider doing so!&lt;/a&gt;). For a new product, let’s assume that you’re measuring the number of daily active users.&lt;/p&gt;

&lt;p&gt;How do notifications tie into the daily usage metrics? &lt;strong&gt;If you build a good-enough notifications system, how will that help you achieve your goal?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In our example, a notification will likely be the mechanism by which your product’s users can learn about something that needs their attention. If they haven’t signed in on a particular day, a notification is the only way to alert them to the activity they missed. In such a scenario, we could very well attribute the sending of a notification to a direct increase in daily active users (DAUs).&lt;/p&gt;

&lt;p&gt;Now, how you build your notifications will affect your system’s impact on DAUs. &lt;strong&gt;Going from zero notification channels (no notifications at all) to one channel (e.g., email) can significantly boost your MVP metrics.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But would adding a second channel (e.g., mobile push) make enough of a difference? &lt;/p&gt;

&lt;p&gt;That depends. Your app’s functionality may rely on real-time interactions, in which case a push notification on the user’s phone will make a difference compared to an email notification that might get read later on.&lt;/p&gt;

&lt;p&gt;But if you’re building a B2B application where synchronous action has less importance, then having email notification only will probably suffice.&lt;/p&gt;

&lt;p&gt;Here are a few examples of features to potentially exclude from an MVP if they don’t directly drive the MVP’s metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Additional notification channels.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aditional types of notifications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Non-essential efficiency and performance improvements.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What you shouldn’t skip even in an MVP system
&lt;/h2&gt;

&lt;p&gt;Even if you’ve decided on the specific functionality that’s critical to your MVP’s success, there are still a few things that you should keep in mind for any MVP-stage system. Regardless of the MVP notification system you're building, here are some guidelines to keep in mind:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Item 1: Polished experience for a limited set of notifications.&lt;/strong&gt; Typos in your notification templates; incorrectly functioning call-to-action buttons; email designs that don’t work on mobile—these are all issues that will affect the sentiment of your early users. Although you'll be working with a limited number of notification channels, the ones that you do select for your MVP should contribute to a positive user experience. Spend a bit of time on testing and validating (manually and/or automatedly) the look and feel of your MVP notifications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Item 2: Right notification,&lt;/strong&gt; at the right time. The reason why you’re building notifications in the first place is to alert your users to an event that merits their attention. It’s important to get the mechanics of your notifications right, especially when you’re only using one or a few notification channels in your MVP. Document the overall logic for when a notification should and shouldn’t be sent, and make sure that you keep this logic consistent throughout your application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Item 3: Reliability and consistency.&lt;/strong&gt; Few things are more frustrating than notifications getting sent inconsistently. If your MVP system accidentally skips so much as 10% of the notifications that should have been sent, your users might miss out on app interactions and eventually decide that your notifications “don’t work” and simply disable or ignore them. Building trust with your early users is critical, so consider implementing monitoring for your notifications system. You need to be able to identify issues before they can cause any negative impact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common gotchas when building MVP notification systems
&lt;/h2&gt;

&lt;p&gt;By this point, you’ve hopefully settled on the functionality that you’ll include in your MVP notification system. Here are a few common pitfalls that startup engineers should avoid when building basic notification systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shortcuts taken now can be painful in the future
&lt;/h3&gt;

&lt;p&gt;While we encourage taking certain shortcuts in the MVP phase—like having an initially reduced number of supported notification channels, it’s important to consider how the choices you make today can impact what’s possible for your product down the line.&lt;/p&gt;

&lt;p&gt;For example, modeling all of your messages around a particular email API can make it more difficult to change email providers or add SMS support in the future.&lt;/p&gt;

&lt;p&gt;We recommend that you come up with your own schema for what a notification object should look like. Implementing this level of abstraction will make it easier to add other notification types in the future.&lt;/p&gt;

&lt;h3&gt;
  
  
  Remember that you’re serving multiple categories of users
&lt;/h3&gt;

&lt;p&gt;Notification systems aren’t only used by your customers. You, as a developer, are also a user of the system. And if the system constantly breaks, your team will suffer setbacks.&lt;/p&gt;

&lt;p&gt;Your content editors and marketing team will most likely want to change individual notifications and tweak the text. These colleagues might not have the technical know-how to edit the code base and submit pull requests.&lt;/p&gt;

&lt;p&gt;When building an MVP system, reflect on how the notifications experience will look for all customer groups, both internal and external. The experience for each group doesn’t need to be perfect (and probably can’t be perfect in an MVP), but if you’re prioritizing one group’s experience over another, make this choice explicit and discuss it with your team.&lt;/p&gt;

&lt;h3&gt;
  
  
  You won’t go far without deliverability
&lt;/h3&gt;

&lt;p&gt;Notifications that aren’t delivered do not fulfill their purpose and do not move your metrics in the right direction. Any operational issues with your notifications system can affect deliverability, but there are other factors to consider.&lt;/p&gt;

&lt;p&gt;For email notifications, having the right DKIM and SPF records set up for message authentication can improve the likelihood of emails getting to your users’ inboxes.&lt;/p&gt;

&lt;p&gt;For mobile push notifications, delivery may be prevented due to connectivity issues or the user’s device being off. Retrying a push message a few times if delivery fails can increase the rate of successfully delivered notifications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quickly build an MVP-stage notification system with Courier
&lt;/h2&gt;

&lt;p&gt;Building an MVP notification system from scratch need not be overly complicated. We encourage you to think through the MVP metrics you're looking to drive with a notification system, and to understand which notification channels will be most relevant for your internal and external customers.&lt;/p&gt;

&lt;p&gt;While you’re at it, why not check out Courier? &lt;/p&gt;

&lt;p&gt;Courier provides a comprehensive, easy-to-integrate API that takes care of all notification types. Start with an MVP, and add more functionality later without locking yourself into a particular provider.&lt;/p&gt;

</description>
      <category>notifications</category>
      <category>mvp</category>
      <category>ux</category>
    </item>
  </channel>
</rss>
