Repository: novuhq/docs
Pull request #811: feat: Segment Integration Guide
Author: login: iampearceman
Created: 2025-04-06T10:54:09Z | Merged: 2025-04-07T12:46:46Z



Diff:
diff --git a/content/docs/guides/overview.mdx b/content/docs/guides/overview.mdx
index 2a0e50c10..3f21ce210 100644
--- a/content/docs/guides/overview.mdx
+++ b/content/docs/guides/overview.mdx
@@ -6,16 +6,21 @@ pageTitle: 'Guides overview'
 import { Card, Cards } from 'fumadocs-ui/components/card';
 import { ClerkIcon } from '@/components/icons/clerk';
 import { StripeIcon } from '@/components/icons/stripe';
+import { SegmentIcon } from '@/components/icons/segment';
 
-## Webhook Integration Guides
+## Integration Guides
+
+Novu provides various ways to integrate with external services to trigger notification workflows. Here are the main integration approaches:
+
+### Webhook Integration Guides
 
 Webhooks enable real-time event-driven communication between applications, making integrations more efficient and responsive.  
 
-In Novu, webhooks trigger notification workflows whenever specific events occur in external applications. This ensures notifications are delivered exactly when they’re needed, keeping users informed without delay.
+In Novu, webhooks trigger notification workflows whenever specific events occur in external applications. This ensures notifications are delivered exactly when they're needed, keeping users informed without delay.
 
 For example, when a user signs up via Clerk or completes a payment through Stripe, a webhook delivers the event payload to Novu, which then processes it and triggers the appropriate workflow.
 
-This allows for real-time notifications—whether it’s a welcome email, payment confirmation SMS, or in-app alert—without the need for constant polling, ensuring efficiency and a seamless user experience.
+This allows for real-time notifications—whether it's a welcome email, payment confirmation SMS, or in-app alert—without the need for constant polling, ensuring efficiency and a seamless user experience.
 
 <Cards>
   <Card title="Clerk" icon={<ClerkIcon />} href="/guides/webhooks/clerk">
@@ -28,4 +33,16 @@ This allows for real-time notifications—whether it’s a welcome email, paymen
     Use Stripe webhooks events to trigger payment related notifications workflows.
   </p>
   </Card>
+</Cards>
+
+### Analytics & Data Platform Integrations
+
+Some integrations use different mechanisms than webhooks to send data to Novu. For example, analytics and data platforms often use custom destinations or functions to forward events.
+
+<Cards>
+  <Card title="Segment" icon={<SegmentIcon />} href="/guides/webhooks/segment">
+  <p>
+    Use Segment's Destination Functions to forward user events and traits to trigger notification workflows.
+  </p>
+  </Card>
 </Cards>
\ No newline at end of file
diff --git a/content/docs/guides/webhooks/meta.json b/content/docs/guides/webhooks/meta.json
index 8326afef7..0bfd39024 100644
--- a/content/docs/guides/webhooks/meta.json
+++ b/content/docs/guides/webhooks/meta.json
@@ -1,3 +1,4 @@
 {
-  "pages": ["clerk", "stripe"]
+  "title": "Webhooks",
+  "pages": ["clerk", "stripe", "segment"]
 }
diff --git a/content/docs/guides/webhooks/segment.mdx b/content/docs/guides/webhooks/segment.mdx
new file mode 100644
index 000000000..ec3fe98c3
--- /dev/null
+++ b/content/docs/guides/webhooks/segment.mdx
@@ -0,0 +1,236 @@
+---
+title: 'Segment'
+pageTitle: 'Integrate Segment with Novu'
+description: 'Learn how to set up Segment as a data source for Novu using Destination Functions. Send user events from Segment to trigger notifications in Novu.'
+---
+
+import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
+import { Card, Cards } from 'fumadocs-ui/components/card';
+import { NextjsIcon } from '@/components/icons/nextjs';
+import { ExpressjsIcon } from '@/components/icons/expressjs';
+import { Callout } from 'fumadocs-ui/components/callout';
+import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
+import { File, Folder, Files } from 'fumadocs-ui/components/files';
+
+This guide demonstrates how to use Segment's Destination Functions to send user events and traits to Novu. You'll learn how to:
+- Create a custom Segment destination for Novu
+- Map Segment identify calls to Novu subscribers
+- Trigger notification workflows from Segment track events
+- Handle errors and retry logic for reliable delivery
+
+By the end, you'll have a working integration that creates subscribers and triggers notification workflows in Novu based on Segment events.
+
+<Callout type="info">
+  **Prerequisites**
+
+  Before you start, ensure you have:
+  - A **Segment account** with access to **Functions** (check your workspace permissions)
+  - A **Novu account** with an **API key** (find this in your Novu dashboard under Settings > API Keys)
+</Callout>
+
+<Steps>
+  <Step>
+    ## Create a Destination Function in Segment
+
+    1. Log in to your Segment account
+    2. Navigate to **Connections** > **Functions** in the left sidebar
+    3. Click **New Function** and select **Destination**
+    4. Name your function (e.g., Novu Destination) and click **Create Function**
+  </Step>
+
+  <Step>
+    ## Configure the Destination Function
+
+    The Destination Function will handle two key Segment event types:
+    - **identify**: Creates or updates a subscriber in Novu
+    - **track**: Triggers a notification workflow in Novu
+
+    Paste the following complete code into the Segment Function editor:
+
+    ```jsx
+    /**
+     * Handles identify events: Creates or updates a subscriber in Novu
+     * @param {SegmentIdentifyEvent} event - The Segment identify event
+     * @param {FunctionSettings} settings - Function settings including API key
+     */
+    async function onIdentify(event, settings) {
+      const endpoint = 'https://api.novu.co/v2/subscribers';
+      const apiKey = settings.apiKey;
+
+      if (!apiKey) throw new Error('Novu API key is missing in settings');
+      if (!event.userId) throw new Error('userId is required in identify event');
+
+      const subscriberData = {
+        subscriberId: event.userId,
+        firstName: event.traits?.firstName || null,
+        lastName: event.traits?.lastName || null,
+        email: event.traits?.email || null,
+        phone: event.traits?.phone || null,
+        avatar: event.traits?.avatar || null,
+      };
+
+      try {
+        const response = await fetch(endpoint, {
+          method: 'POST',
+          headers: {
+            'Authorization': `ApiKey ${apiKey}`,
+            'Content-Type': 'application/json'
+          },
+          body: JSON.stringify(subscriberData)
+        });
+
+        const responseBody = await response.json();
+        if (!response.ok) {
+          if (response.status >= 500 || response.status === 429) {
+            throw new RetryError(`Server error: ${response.status}`);
+          }
+          throw new Error(`API error: ${response.status} - ${responseBody.message || 'Unknown error'}`);
+        }
+      } catch (error) {
+        throw error instanceof RetryError ? error : new RetryError(error.message);
+      }
+    }
+
+    // Mapping of Segment track events to Novu workflows
+    const EVENT_TO_WORKFLOW_MAPPINGS = {
+      'User Registered': 'welcome'
+      // Add more mappings: 'Event Name': 'novu-workflow-name'
+    };
+
+    /**
+     * Handles track events: Triggers a notification workflow in Novu
+     * @param {SegmentTrackEvent} event - The Segment track event
+     * @param {FunctionSettings} settings - Function settings including API key
+     */
+    async function onTrack(event, settings) {
+      const endpoint = 'https://api.novu.co/v1/events/trigger';
+      const apiKey = settings.apiKey;
+
+      if (!apiKey) throw new Error('Novu API key is missing in settings');
+      if (!event.userId) throw new Error('userId is required in track event');
+
+      const workflow = EVENT_TO_WORKFLOW_MAPPINGS[event.event];
+      if (!workflow) throw new Error(`No workflow mapped for event: ${event.event}`);
+
+      const triggerEvent = {
+        name: workflow,
+        to: { subscriberId: event.userId },
+        payload: event.properties || {}
+      };
+
+      try {
+        const response = await fetch(endpoint, {
+          method: 'POST',
+          headers: {
+            'Authorization': `ApiKey ${apiKey}`,
+            'Content-Type': 'application/json'
+          },
+          body: JSON.stringify(triggerEvent)
+        });
+
+        const responseBody = await response.json();
+        if (!response.ok) {
+          if (response.status >= 500 || response.status === 429) {
+            throw new RetryError(`Server error: ${response.status}`);
+          }
+          throw new Error(`API error: ${response.status} - ${responseBody.message || 'Unknown error'}`);
+        }
+      } catch (error) {
+        throw error instanceof RetryError ? error : new RetryError(error.message);
+      }
+    }
+    ```
+
+    <Accordions>
+      <Accordion title="Code Explanation">
+        - **`onIdentify`**:
+            - Maps Segment traits (e.g., firstName, lastName, email) to Novu subscriber fields
+            - Uses Novu's `/v2/subscribers` endpoint
+            - Creates or updates subscribers (Novu's API is idempotent for existing `subscriberIds`)
+        - **`onTrack`**:
+            - Maps Segment `track` events to Novu workflows using `EVENT_TO_WORKFLOW_MAPPINGS`
+            - Sends the event properties as the payload to trigger a workflow via `/v1/events/trigger`
+        - **Error Handling**: Retries on server errors (5xx) or rate limits (429), fails fast on other errors
+      </Accordion>
+    </Accordions>
+
+    <Callout type="info">
+      **Customize the Mapping**: Update `EVENT_TO_WORKFLOW_MAPPINGS` with your Segment event names and corresponding Novu workflow names.
+    </Callout>
+  </Step>
+
+  <Step>
+    ## Deploy the Function
+
+    1. Click **Save** in the Function editor
+    2. Enable the function by toggling it to **Active**
+  </Step>
+
+  <Step>
+    ## Connect the Function to a Source
+
+    1. Go to **Connections** > Select your **Source** (e.g., website, app)
+    2. In the **Destinations** tab, click **Add Destination**
+    3. Choose your **Novu Destination Function** from the list
+    4. Click **Connect**. When prompted, enter your **Novu API key** in the apiKey field
+    5. Save the configuration
+  </Step>
+
+  <Step>
+    ## Testing the Integration
+
+    Verify everything works:
+
+    <Accordions>
+      <Accordion title="1. Send an identify event">
+        Example:
+        ```json
+        {
+          "type": "identify",
+          "traits": {
+            "name": "Peter Gibbons",
+            "email": "peter@example.com",
+            "plan": "premium",
+            "logins": 5
+          },
+          "userId": "97980cfea0067"
+        }
+        ```
+        Check Novu's **Subscribers** list to confirm the subscriber appears.
+      </Accordion>
+
+      <Accordion title="2. Send a track event">
+        Example:
+        ```json
+        {
+          "type": "track",
+          "event": "User Registered",
+          "properties": {
+            "plan": "Pro Annual",
+            "accountType" : "Facebook"
+          }
+        }
+        ```
+        Verify the `welcome` workflow triggers in Novu's activity feed.
+      </Accordion>
+    </Accordions>
+
+    Use Segment's **Debugger** to monitor function calls and catch any errors.
+  </Step>
+</Steps>
+
+<Accordions>
+  <Accordion title="Troubleshooting">
+    - **401 Unauthorized**: Double-check your Novu API key in the function settings
+    - **Subscriber Not Created**: Ensure userId is included in the identify event
+    - **Workflow Not Triggering**: Confirm the event name matches a key in EVENT_TO_WORKFLOW_MAPPINGS and the workflow exists in Novu
+    - **API Errors**: Check Segment's logs for detailed error messages
+  </Accordion>
+
+  <Accordion title="Additional Notes">
+    - **Subscriber Updates**: Novu's /v1/subscribers endpoint updates existing subscribers if the subscriberId matches, keeping data current with each identify event
+    - **Expanding Functionality**: Add more event types (e.g., group, page) by defining additional handlers like onGroup in the code
+  </Accordion>
+</Accordions>
+
+With this setup, your Segment events will seamlessly flow into Novu, enabling powerful notification workflows tailored to your users' actions.
diff --git a/src/components/icons/segment.tsx b/src/components/icons/segment.tsx
new file mode 100644
index 000000000..f9daa42df
--- /dev/null
+++ b/src/components/icons/segment.tsx
@@ -0,0 +1,10 @@
+export function SegmentIcon(props: React.ComponentProps<'svg'>) {
+  return (
+    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 264.968" {...props}>
+      <path
+        fill="#4fb58b"
+        d="m233.56 141.927.17.013 17.892 1.87a4.927 4.927 0 0 1 3.225 1.707l.133.163-.17.085a4.93 4.93 0 0 1 1.02 3.74 133.272 133.272 0 0 1-41.604 81.083 128.86 128.86 0 0 1-87.629 34.38 127.488 127.488 0 0 1-46.156-8.57l-.802-.312a4.716 4.716 0 0 1-2.686-2.533l-.077-.187a4.891 4.891 0 0 1-.083-3.66l7.062-17.23a4.846 4.846 0 0 1 6.118-2.799l.163.061c36.097 13.938 76.98 6.088 105.349-20.228a104.455 104.455 0 0 0 32.891-63.32 4.93 4.93 0 0 1 5.013-4.27l.17.006zm-190.08 64.31.251-.002.253.002c8.12.093 14.658 6.658 14.746 14.749v.253c0 .084 0 .168-.002.252-.14 8.284-6.97 14.885-15.254 14.745-8.284-.142-14.884-6.97-14.745-15.254.139-8.115 6.695-14.616 14.75-14.745zM4.93 147.082h146.316a4.973 4.973 0 0 1 4.928 4.844l.002.171v18.316a4.974 4.974 0 0 1-4.76 5.01l-.17.004H4.93A4.974 4.974 0 0 1 0 170.584v-18.659a4.975 4.975 0 0 1 4.755-4.838zM169.56 7.311a4.974 4.974 0 0 1 2.848 2.635 5.096 5.096 0 0 1 0 3.867l-6.375 16.999a4.845 4.845 0 0 1-6.162 2.974A101.228 101.228 0 0 0 62.13 51.252a105.267 105.267 0 0 0-34.507 54.99 4.93 4.93 0 0 1-4.76 3.698h-1.105L4.25 105.733a4.886 4.886 0 0 1-3.103-2.295h-.085A4.929 4.929 0 0 1 .51 99.57 133.393 133.393 0 0 1 44.92 29.366C79.739.7 127.019-7.666 169.56 7.311zm-64.807 73.434H251.07a4.972 4.972 0 0 1 4.922 4.67l.008.174v18.317a4.973 4.973 0 0 1-4.76 5.01l-.17.004H104.754a4.972 4.972 0 0 1-4.885-4.841l-.002-.174V85.76a4.972 4.972 0 0 1 4.714-5.008zm101.572-55.883.252-.002.253.002c8.12.093 14.658 6.659 14.746 14.748v.253l-.001.253c-.141 8.284-6.97 14.885-15.255 14.744-8.283-.14-14.884-6.97-14.744-15.253.138-8.116 6.695-14.616 14.75-14.745z"
+      />
+    </svg>
+  );
+}


Reviews:
user: login: scopsy
body: Looks good 🚀 Let's also add this to the overview page as a link
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-06T12:41:13Z
user: login: scopsy
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-06T12:42:03Z
user: login: scopsy
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-06T12:42:17Z
user: login: iampearceman
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-06T13:29:06Z

Review comments:
diff_hunk: @@ -0,0 +1,241 @@
+---
+title: 'Segment'
+pageTitle: 'Integrate Segment with Novu'
+description: 'Learn how to set up Segment as a data source for Novu using Destination Functions. Send user events from Segment to trigger notifications in Novu.'
+---
+
+import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
+import { Card, Cards } from 'fumadocs-ui/components/card';
+import { NextjsIcon } from '@/components/icons/nextjs';
+import { ExpressjsIcon } from '@/components/icons/expressjs';
+import { Callout } from 'fumadocs-ui/components/callout';
+import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
+import { File, Folder, Files } from 'fumadocs-ui/components/files';
+
+This guide demonstrates how to use Segment's Destination Functions to send user events and traits to Novu. You'll learn how to:
+- Create a custom Segment destination for Novu
+- Map Segment identify calls to Novu subscribers
+- Trigger notification workflows from Segment track events
+- Handle errors and retry logic for reliable delivery
+
+By the end, you'll have a working integration that creates subscribers and triggers notification workflows in Novu based on Segment events.
+
+<Callout type="info">
+  **Prerequisites**
+
+  Before you start, ensure you have:
+  - A **Segment account** with access to **Functions** (check your workspace permissions)
+  - A **Novu account** with an **API key** (find this in your Novu dashboard under Settings > API Keys)
+</Callout>
+
+<Steps>
+  <Step>
+    ## Create a Destination Function in Segment
+
+    1. Log in to your Segment account
+    2. Navigate to **Connections** > **Functions** in the left sidebar
+    3. Click **New Function** and select **Destination**
+    4. Name your function (e.g., Novu Destination) and click **Create Function**
+  </Step>
+
+  <Step>
+    ## Configure the Destination Function
+
+    The Destination Function will handle two key Segment event types:
+    - **identify**: Creates or updates a subscriber in Novu
+    - **track**: Triggers a notification workflow in Novu
+
+    Paste the following complete code into the Segment Function editor:
+
+    ```jsx
+    /**
+     * Handles identify events: Creates or updates a subscriber in Novu
+     * @param {SegmentIdentifyEvent} event - The Segment identify event
+     * @param {FunctionSettings} settings - Function settings including API key
+     */
+    async function onIdentify(event, settings) {
+      const endpoint = 'https://api.novu.co/v1/subscribers';
path: content/docs/guides/webhooks/segment.mdx
user: login: scopsy
body: ```suggestion
      const endpoint = 'https://api.novu.co/v1/subscribers';
```

Any reason for not using v2 endpoint here? 
created_at: 2025-04-06T12:42:03Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,241 @@
+---
+title: 'Segment'
+pageTitle: 'Integrate Segment with Novu'
+description: 'Learn how to set up Segment as a data source for Novu using Destination Functions. Send user events from Segment to trigger notifications in Novu.'
+---
+
+import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
+import { Card, Cards } from 'fumadocs-ui/components/card';
+import { NextjsIcon } from '@/components/icons/nextjs';
+import { ExpressjsIcon } from '@/components/icons/expressjs';
+import { Callout } from 'fumadocs-ui/components/callout';
+import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
+import { File, Folder, Files } from 'fumadocs-ui/components/files';
+
+This guide demonstrates how to use Segment's Destination Functions to send user events and traits to Novu. You'll learn how to:
+- Create a custom Segment destination for Novu
+- Map Segment identify calls to Novu subscribers
+- Trigger notification workflows from Segment track events
+- Handle errors and retry logic for reliable delivery
+
+By the end, you'll have a working integration that creates subscribers and triggers notification workflows in Novu based on Segment events.
+
+<Callout type="info">
+  **Prerequisites**
+
+  Before you start, ensure you have:
+  - A **Segment account** with access to **Functions** (check your workspace permissions)
+  - A **Novu account** with an **API key** (find this in your Novu dashboard under Settings > API Keys)
+</Callout>
+
+<Steps>
+  <Step>
+    ## Create a Destination Function in Segment
+
+    1. Log in to your Segment account
+    2. Navigate to **Connections** > **Functions** in the left sidebar
+    3. Click **New Function** and select **Destination**
+    4. Name your function (e.g., Novu Destination) and click **Create Function**
+  </Step>
+
+  <Step>
+    ## Configure the Destination Function
+
+    The Destination Function will handle two key Segment event types:
+    - **identify**: Creates or updates a subscriber in Novu
+    - **track**: Triggers a notification workflow in Novu
+
+    Paste the following complete code into the Segment Function editor:
+
+    ```jsx
+    /**
+     * Handles identify events: Creates or updates a subscriber in Novu
+     * @param {SegmentIdentifyEvent} event - The Segment identify event
+     * @param {FunctionSettings} settings - Function settings including API key
+     */
+    async function onIdentify(event, settings) {
+      const endpoint = 'https://api.novu.co/v1/subscribers';
+      const apiKey = settings.apiKey;
+
+      if (!apiKey) throw new Error('Novu API key is missing in settings');
+      if (!event.userId) throw new Error('userId is required in identify event');
+
+      const subscriberData = {
+        subscriberId: event.userId,
+        firstName: event.traits?.firstName || null,
+        lastName: event.traits?.lastName || null,
+        email: event.traits?.email || null,
+        phone: event.traits?.phone || null,
+        avatar: event.traits?.avatar || null,
+        timezone: event.context?.timezone || null,
+        locale: event.context?.locale || null,
+        data: {
+          updatedAt: event.timestamp || null
path: content/docs/guides/webhooks/segment.mdx
user: login: scopsy
body: Let's remove this one, it's not needed and auto computed by novu
created_at: 2025-04-06T12:42:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,241 @@
+---
+title: 'Segment'
+pageTitle: 'Integrate Segment with Novu'
+description: 'Learn how to set up Segment as a data source for Novu using Destination Functions. Send user events from Segment to trigger notifications in Novu.'
+---
+
+import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
+import { Card, Cards } from 'fumadocs-ui/components/card';
+import { NextjsIcon } from '@/components/icons/nextjs';
+import { ExpressjsIcon } from '@/components/icons/expressjs';
+import { Callout } from 'fumadocs-ui/components/callout';
+import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
+import { File, Folder, Files } from 'fumadocs-ui/components/files';
+
+This guide demonstrates how to use Segment's Destination Functions to send user events and traits to Novu. You'll learn how to:
+- Create a custom Segment destination for Novu
+- Map Segment identify calls to Novu subscribers
+- Trigger notification workflows from Segment track events
+- Handle errors and retry logic for reliable delivery
+
+By the end, you'll have a working integration that creates subscribers and triggers notification workflows in Novu based on Segment events.
+
+<Callout type="info">
+  **Prerequisites**
+
+  Before you start, ensure you have:
+  - A **Segment account** with access to **Functions** (check your workspace permissions)
+  - A **Novu account** with an **API key** (find this in your Novu dashboard under Settings > API Keys)
+</Callout>
+
+<Steps>
+  <Step>
+    ## Create a Destination Function in Segment
+
+    1. Log in to your Segment account
+    2. Navigate to **Connections** > **Functions** in the left sidebar
+    3. Click **New Function** and select **Destination**
+    4. Name your function (e.g., Novu Destination) and click **Create Function**
+  </Step>
+
+  <Step>
+    ## Configure the Destination Function
+
+    The Destination Function will handle two key Segment event types:
+    - **identify**: Creates or updates a subscriber in Novu
+    - **track**: Triggers a notification workflow in Novu
+
+    Paste the following complete code into the Segment Function editor:
+
+    ```jsx
+    /**
+     * Handles identify events: Creates or updates a subscriber in Novu
+     * @param {SegmentIdentifyEvent} event - The Segment identify event
+     * @param {FunctionSettings} settings - Function settings including API key
+     */
+    async function onIdentify(event, settings) {
+      const endpoint = 'https://api.novu.co/v1/subscribers';
path: content/docs/guides/webhooks/segment.mdx
user: login: iampearceman
body: Not sure - I think no
created_at: 2025-04-06T13:29:06Z
author_association: MEMBER

PR comments:
user: login: linear[bot]
created_at: 2025-04-06T10:54:12Z
body: <p><a href="https://linear.app/novu/issue/MRK-539/segment-integration-guide">MRK-539 Segment Integration Guide</a></p>
author_association: NONE
user: login: netlify[bot]
created_at: 2025-04-06T10:54:30Z
body: ### <span aria-hidden="true">✅</span> Deploy Preview for *docs-novu* ready!


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | 42b34de6d53ff6f04848bd5d3dadbc926f55da95 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/docs-novu/deploys/67f2840c2baed800085d4425 |
|<span aria-hidden="true">😎</span> Deploy Preview | [https://deploy-preview-811--docs-novu.netlify.app](https://deploy-preview-811--docs-novu.netlify.app) |
|<span aria-hidden="true">📱</span> Preview on mobile | <details><summary> Toggle QR Code... </summary><br /><br />![QR Code](https://app.netlify.com/qr-code/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJodHRwczovL2RlcGxveS1wcmV2aWV3LTgxMS0tZG9jcy1ub3Z1Lm5ldGxpZnkuYXBwIn0.5H5DHqzTB0hKMh75zbSKNwV_a61H3T2vyBfGAmhSVMo)<br /><br />_Use your smartphone camera to open QR code link._</details> |
---
<!-- [docs-novu Preview](https://deploy-preview-811--docs-novu.netlify.app) -->
_To edit notification comments on pull requests, go to your [Netlify site configuration](https://app.netlify.com/sites/docs-novu/configuration/notifications#deploy-webhooks)._
author_association: NONE