Skip to content
This repository was archived by the owner on Jun 26, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
271 changes: 271 additions & 0 deletions content/docs/platform/developer/webhooks/connectors.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,271 @@
---
title: 'Webhook connectors'
pageTitle: 'Novu webhook connectors'
description: 'Send Novu webhook events directly to data warehouses, analytics databases, and AWS messaging services.'
icon: 'Plug'
---

In addition to standard HTTP webhook endpoints, Novu supports webhook connectors that deliver events directly to third-party services. Use them to route Novu events to data warehouses, analytics databases, and AWS messaging services without building a custom receiver.

Check warning on line 8 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L8

[write-good.TooWordy] 'In addition' is too wordy.
Raw output
{"message": "[write-good.TooWordy] 'In addition' is too wordy.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 8, "column": 1}}}, "severity": "WARNING"}

Check notice on line 8 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L8

[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 8, "column": 211}}}, "severity": "INFO"}

Novu webhook delivery is powered by [Svix](https://docs.svix.com/introduction). Connector endpoints use Svix [transformations](https://docs.svix.com/transformations) to shape each event before it is written to your destination.

Check warning on line 10 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L10

[write-good.Passive] 'is powered' may be passive voice. Use active voice if you can.
Raw output
{"message": "[write-good.Passive] 'is powered' may be passive voice. Use active voice if you can.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 10, "column": 23}}}, "severity": "WARNING"}

Check notice on line 10 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L10

[Google.Passive] In general, use active voice instead of passive voice ('is powered').
Raw output
{"message": "[Google.Passive] In general, use active voice instead of passive voice ('is powered').", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 10, "column": 23}}}, "severity": "INFO"}

Check notice on line 10 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L10

[write-good.E-Prime] Try to avoid using 'is'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 10, "column": 23}}}, "severity": "INFO"}

Check warning on line 10 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L10

[write-good.TooWordy] 'it is' is too wordy.
Raw output
{"message": "[write-good.TooWordy] 'it is' is too wordy.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 10, "column": 194}}}, "severity": "WARNING"}

Check notice on line 10 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L10

[Google.Contractions] Use 'it's' instead of 'it is'.
Raw output
{"message": "[Google.Contractions] Use 'it's' instead of 'it is'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 10, "column": 194}}}, "severity": "INFO"}

Check warning on line 10 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L10

[write-good.Passive] 'is written' may be passive voice. Use active voice if you can.
Raw output
{"message": "[write-good.Passive] 'is written' may be passive voice. Use active voice if you can.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 10, "column": 197}}}, "severity": "WARNING"}

Check notice on line 10 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L10

[Google.Passive] In general, use active voice instead of passive voice ('is written').
Raw output
{"message": "[Google.Passive] In general, use active voice instead of passive voice ('is written').", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 10, "column": 197}}}, "severity": "INFO"}

Check notice on line 10 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L10

[write-good.E-Prime] Try to avoid using 'is'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 10, "column": 197}}}, "severity": "INFO"}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Keep branding consistent

The surrounding webhook pages were changed to remove direct Svix brand references, but this new connectors page introduces a prominent Svix mention and link in the opening section. If the product-facing docs are meant to avoid vendor branding, the webhooks section now gives conflicting guidance across pages.

Prompt To Fix With AI
This is a comment left during a code review.
Path: content/docs/platform/developer/webhooks/connectors.mdx
Line: 10

Comment:
**Keep branding consistent**

The surrounding webhook pages were changed to remove direct Svix brand references, but this new connectors page introduces a prominent Svix mention and link in the opening section. If the product-facing docs are meant to avoid vendor branding, the webhooks section now gives conflicting guidance across pages.

How can I resolve this? If you propose a fix, please make it concise.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Fix in Cursor


<Callout>Outbound webhooks feature is only available in the <a href="https://novu.co/pricing" target="_blank" rel="noopener noreferrer">Team and Enterprise plans</a>.</Callout>

Check notice on line 12 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L12

[write-good.E-Prime] Try to avoid using 'is'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 12, "column": 36}}}, "severity": "INFO"}

## How to add a connector endpoint

1. Go to the **[Webhooks](https://dashboard.novu.co/webhooks)** page in the Novu dashboard.
2. Select the **Endpoints** tab.
3. Click **Add Endpoint**.
4. Search for or select the connector you want to use from the integrations list.
![Webhook integrations list](/images/developer-tools/webhook-integrations.png)
5. Enter a **Description** to identify this endpoint.
6. Configure the connector-specific connection settings described in the sections below.
7. For **data warehouse connectors** (ClickHouse, Snowflake, Redshift): define the **table schema** and write a **transformation** that maps Novu webhook payloads to rows matching that schema. See [Data warehouse connectors](#data-warehouse-connectors).

Check notice on line 23 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L23

[Google.Parens] Use parentheses judiciously.
Raw output
{"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 23, "column": 38}}}, "severity": "INFO"}
8. For **message connectors** (Amazon SQS, Amazon SNS): review and customize the **transformation** that shapes the message body sent to the queue or topic. See [Message connectors](#message-connectors).

Check notice on line 24 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L24

[Google.Parens] Use parentheses judiciously.
Raw output
{"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 24, "column": 31}}}, "severity": "INFO"}

Check notice on line 24 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L24

[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 24, "column": 39}}}, "severity": "INFO"}

Check notice on line 24 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L24

[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 24, "column": 51}}}, "severity": "INFO"}
9. Select the [event types](/platform/developer/webhooks/event-types) you want this endpoint to subscribe to.
Comment on lines +21 to +25

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Select events first

These steps tell users to write the connector schema and transformation before selecting event types, but the transformation must handle every subscribed event type. That ordering encourages users to configure a transformation before they know the complete set of event shapes it must map, which can leave subscribed events unhandled.

Prompt To Fix With AI
This is a comment left during a code review.
Path: content/docs/platform/developer/webhooks/connectors.mdx
Line: 21-25

Comment:
**Select events first**

These steps tell users to write the connector schema and transformation before selecting event types, but the transformation must handle every subscribed event type. That ordering encourages users to configure a transformation before they know the complete set of event shapes it must map, which can leave subscribed events unhandled.

How can I resolve this? If you propose a fix, please make it concise.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Fix in Cursor

10. Click **Create**.
11. Open the endpoint, go to the **Testing** tab, and **Send Example** for each subscribed event type. Confirm delivery succeeds in **Logs**, then verify the row or message appears in your destination.

After the endpoint is created, Novu delivers matching events to your configured destination. You can monitor delivery attempts, retry failed messages, and test the endpoint from the dashboard.

Check notice on line 29 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L29

[write-good.E-Prime] Try to avoid using 'is'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 29, "column": 20}}}, "severity": "INFO"}

Check warning on line 29 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L29

[write-good.Passive] 'is created' may be passive voice. Use active voice if you can.
Raw output
{"message": "[write-good.Passive] 'is created' may be passive voice. Use active voice if you can.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 29, "column": 20}}}, "severity": "WARNING"}

Check notice on line 29 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L29

[Google.Passive] In general, use active voice instead of passive voice ('is created').
Raw output
{"message": "[Google.Passive] In general, use active voice instead of passive voice ('is created').", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 29, "column": 20}}}, "severity": "INFO"}

Check warning on line 29 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L29

[write-good.TooWordy] 'monitor' is too wordy.
Raw output
{"message": "[write-good.TooWordy] 'monitor' is too wordy.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 29, "column": 102}}}, "severity": "WARNING"}

## Available connectors

Novu supports the following webhook connectors:

| Connector | Type | Description |
| --- | --- | --- |
| [ClickHouse](#clickhouse) | Data warehouse | Store events in a ClickHouse table. |
| [Snowflake](#snowflake) | Data warehouse | Store events in a Snowflake table. |
| [Amazon Redshift](#amazon-redshift) | Data warehouse | Store events in an Amazon Redshift table. |
| [Amazon SQS](#amazon-sqs) | Message | Send events to an Amazon SQS queue. |

Check notice on line 40 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L40

[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 40, "column": 11}}}, "severity": "INFO"}

Check notice on line 40 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L40

[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 40, "column": 66}}}, "severity": "INFO"}
| [Amazon SNS](#amazon-sns) | Message | Send events to an Amazon SNS topic. |

Check notice on line 41 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L41

[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 41, "column": 11}}}, "severity": "INFO"}

Check notice on line 41 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L41

[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 41, "column": 66}}}, "severity": "INFO"}

Additional warehouse connectors (such as BigQuery) may appear in the dashboard. They follow the same **table schema + transformation** pattern described below.

Check warning on line 43 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L43

[write-good.TooWordy] 'Additional' is too wordy.
Raw output
{"message": "[write-good.TooWordy] 'Additional' is too wordy.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 43, "column": 1}}}, "severity": "WARNING"}

Check notice on line 43 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L43

[Google.Parens] Use parentheses judiciously.
Raw output
{"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 43, "column": 33}}}, "severity": "INFO"}

## Transformations

Every connector endpoint runs a JavaScript **transformation** before delivery. The transformation converts the raw Novu webhook into the format your destination expects.

In the Novu dashboard, configure the transformation when creating or editing a connector endpoint. Each connector type ships with a default template—use it as your starting point.

### How to write a transformation

Svix expects a function named `handler`. For connector endpoints, the handler receives a `webhook` object with:

| Property | Description |
| --- | --- |
| `webhook.eventType` | The Novu event type (for example, `message.sent`). |

Check notice on line 57 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L57

[Google.Parens] Use parentheses judiciously.
Raw output
{"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 57, "column": 1}}}, "severity": "INFO"}
| `webhook.payload` | The webhook JSON body. Shape depends on the event type—see [event types](/platform/developer/webhooks/event-types). |
| `webhook.method` | HTTP method. Usually `"POST"`. |

Check warning on line 59 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L59

[write-good.Weasel] 'Usually' is a weasel word!
Raw output
{"message": "[write-good.Weasel] 'Usually' is a weasel word!", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 59, "column": 35}}}, "severity": "WARNING"}
| `webhook.url` | Destination URL. Generally leave unchanged for connectors. |
| `webhook.cancel` | Set to `true` to skip delivery for a given event. Defaults to `false`. |

The handler must return the `webhook` object after modifying `webhook.payload` (and optionally other allowed properties). Test your code in the dashboard against a sample payload before going live.

Check notice on line 63 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L63

[Google.Parens] Use parentheses judiciously.
Raw output
{"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 63, "column": 80}}}, "severity": "INFO"}

<Callout type="info">Handle every [event type](/platform/developer/webhooks/event-types) your endpoint subscribes to. Use `switch (webhook.eventType)` or equivalent logic so each event maps to a valid destination record.</Callout>

Check warning on line 65 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L65

[write-good.TooWordy] 'equivalent' is too wordy.
Raw output
{"message": "[write-good.TooWordy] 'equivalent' is too wordy.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 65, "column": 155}}}, "severity": "WARNING"}

## Data warehouse connectors

Data warehouse connectors (ClickHouse, Snowflake, Redshift, and similar) insert one row per delivered webhook. Credentials and table location alone are not enough—you must also configure:

Check notice on line 69 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L69

[Google.Parens] Use parentheses judiciously.
Raw output
{"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 69, "column": 27}}}, "severity": "INFO"}

Check notice on line 69 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L69

[Google.Contractions] Use 'aren't' instead of 'are not'.
Raw output
{"message": "[Google.Contractions] Use 'aren't' instead of 'are not'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 69, "column": 149}}}, "severity": "INFO"}

Check notice on line 69 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L69

[write-good.E-Prime] Try to avoid using 'are'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'are'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 69, "column": 149}}}, "severity": "INFO"}

1. **Table schema** — Column names and types that match your destination table.

Check failure on line 71 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L71

[Google.EmDash] Don't put a space before or after a dash.
Raw output
{"message": "[Google.EmDash] Don't put a space before or after a dash.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 71, "column": 20}}}, "severity": "ERROR"}
2. **Transformation** — JavaScript that maps each webhook `eventType` and `payload` into a row compatible with that schema.

Check failure on line 72 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L72

[Google.EmDash] Don't put a space before or after a dash.
Raw output
{"message": "[Google.EmDash] Don't put a space before or after a dash.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 72, "column": 22}}}, "severity": "ERROR"}

### Recommended setup flow

1. **Create the destination table** in your warehouse with columns for the fields you want to store (for example, `event_type`, `message_id`, `subscriber_id`, `payload`, `created_at`).

Check notice on line 76 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L76

[Google.Parens] Use parentheses judiciously.
Raw output
{"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 76, "column": 1}}}, "severity": "INFO"}
2. **Grant insert permissions** to the user or role Novu connects with.
3. **Add the connector endpoint** in Novu and fill in connection settings (URL, credentials, database, table name, and so on).

Check notice on line 78 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L78

[Google.Parens] Use parentheses judiciously.
Raw output
{"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 78, "column": 75}}}, "severity": "INFO"}
4. **Define the table schema** in the connector configuration so it matches your destination table.
5. **Write the transformation** to map Novu payloads into that schema. Start from the dashboard template and adjust field names and types for your table.
6. **Subscribe** to the event types you want to store.
7. **Test** with **Send Example**, confirm success in **Logs**, then query the table to verify rows were inserted.

Check notice on line 82 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L82

[Google.Passive] In general, use active voice instead of passive voice ('were inserted').
Raw output
{"message": "[Google.Passive] In general, use active voice instead of passive voice ('were inserted').", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 82, "column": 101}}}, "severity": "INFO"}

Check notice on line 82 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L82

[write-good.E-Prime] Try to avoid using 'were'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'were'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 82, "column": 101}}}, "severity": "INFO"}

Check warning on line 82 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L82

[write-good.Passive] 'were inserted' may be passive voice. Use active voice if you can.
Raw output
{"message": "[write-good.Passive] 'were inserted' may be passive voice. Use active voice if you can.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 82, "column": 101}}}, "severity": "WARNING"}

### Example transformation

This example maps a `message.sent` event into a flat row. Adjust field names to match your table schema and add cases for every event type you subscribe to.

```js
function handler(webhook) {
switch (webhook.eventType) {
case "message.sent":
webhook.payload = {
event_type: webhook.eventType,
message_id: webhook.payload.id,
subscriber_id: webhook.payload.subscriberId,
channel: webhook.payload.channel,
created_at: webhook.payload.createdAt,
raw_payload: JSON.stringify(webhook.payload),
};
break;
// Add a case for each subscribed event type
}
return webhook;
Comment on lines +89 to +103

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Handle unmatched events

This sample only maps message.sent. For any other subscribed event type, the switch falls through and returns the original webhook payload, so a copied transformation can try to insert a raw event shape into the warehouse table and fail schema validation or create bad rows.

Prompt To Fix With AI
This is a comment left during a code review.
Path: content/docs/platform/developer/webhooks/connectors.mdx
Line: 89-103

Comment:
**Handle unmatched events**

This sample only maps `message.sent`. For any other subscribed event type, the `switch` falls through and returns the original webhook payload, so a copied transformation can try to insert a raw event shape into the warehouse table and fail schema validation or create bad rows.

How can I resolve this? If you propose a fix, please make it concise.

Fix in Cursor

}
```

If deliveries succeed in Novu but no rows appear in your warehouse, the transformation output likely does not match your table schema. Compare the transformed payload in the **Logs** tab with your table definition.

Check notice on line 107 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L107

[Google.Contractions] Use 'doesn't' instead of 'does not'.
Raw output
{"message": "[Google.Contractions] Use 'doesn't' instead of 'does not'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 107, "column": 102}}}, "severity": "INFO"}

## Message connectors

Message connectors (Amazon SQS and Amazon SNS) publish each webhook as a queue message or topic notification. Use the transformation to shape the JSON body your consumers receive.

Check notice on line 111 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L111

[Google.Parens] Use parentheses judiciously.
Raw output
{"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 111, "column": 20}}}, "severity": "INFO"}

Check notice on line 111 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L111

[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 111, "column": 28}}}, "severity": "INFO"}

Check notice on line 111 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L111

[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 111, "column": 43}}}, "severity": "INFO"}

The default template typically forwards the webhook payload. Customize it if downstream workers expect a specific structure (for example, flattening nested fields or adding metadata).

Check notice on line 113 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L113

[Google.Parens] Use parentheses judiciously.
Raw output
{"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 113, "column": 125}}}, "severity": "INFO"}

```js
function handler(webhook) {
webhook.payload = {
eventType: webhook.eventType,
data: webhook.payload,
receivedAt: new Date().toISOString(),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Avoid replay timestamps

new Date() records when the transformation runs, not when the Novu event happened. During retries or recovery, old events can be republished with a fresh receivedAt, so downstream workers or analytics can treat replayed events as new current events.

Prompt To Fix With AI
This is a comment left during a code review.
Path: content/docs/platform/developer/webhooks/connectors.mdx
Line: 120

Comment:
**Avoid replay timestamps**

`new Date()` records when the transformation runs, not when the Novu event happened. During retries or recovery, old events can be republished with a fresh `receivedAt`, so downstream workers or analytics can treat replayed events as new current events.

How can I resolve this? If you propose a fix, please make it concise.

Fix in Cursor

};
return webhook;
}
```

After creating the endpoint, send a test event and confirm the message appears in your SQS queue or SNS topic subscription.

Check notice on line 126 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L126

[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 126, "column": 88}}}, "severity": "INFO"}

Check notice on line 126 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L126

[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 126, "column": 101}}}, "severity": "INFO"}

## ClickHouse

Check warning on line 128 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L128

[Google.Headings] 'ClickHouse' should use sentence-style capitalization.
Raw output
{"message": "[Google.Headings] 'ClickHouse' should use sentence-style capitalization.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 128, "column": 4}}}, "severity": "WARNING"}

The ClickHouse connector stores Novu webhook events directly in a ClickHouse table. Use it when you want to analyze notification events in ClickHouse without building a custom ingestion pipeline.

### Configuration

| Field | Required | Description |
| --- | --- | --- |
| URL | Yes | The ClickHouse server URL (for example, `https://clickhouse.example.com:8443`). |

Check notice on line 136 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L136

[Google.Parens] Use parentheses judiciously.
Raw output
{"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 136, "column": 1}}}, "severity": "INFO"}
| Username | Yes | The username used to authenticate with ClickHouse. |
| Password | Yes | The password for the ClickHouse user. |
| Table name | Yes | The name of the table where events are stored. |

Check notice on line 139 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L139

[write-good.E-Prime] Try to avoid using 'are'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'are'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 139, "column": 57}}}, "severity": "INFO"}

Check warning on line 139 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L139

[write-good.Passive] 'are stored' may be passive voice. Use active voice if you can.
Raw output
{"message": "[write-good.Passive] 'are stored' may be passive voice. Use active voice if you can.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 139, "column": 57}}}, "severity": "WARNING"}

Check notice on line 139 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L139

[Google.Passive] In general, use active voice instead of passive voice ('are stored').
Raw output
{"message": "[Google.Passive] In general, use active voice instead of passive voice ('are stored').", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 139, "column": 57}}}, "severity": "INFO"}
| Database | No | The ClickHouse database name. If omitted, the default database is used. |

Check notice on line 140 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L140

[Google.Passive] In general, use active voice instead of passive voice ('is used').
Raw output
{"message": "[Google.Passive] In general, use active voice instead of passive voice ('is used').", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 140, "column": 82}}}, "severity": "INFO"}

Check notice on line 140 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L140

[write-good.E-Prime] Try to avoid using 'is'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 140, "column": 82}}}, "severity": "INFO"}

Check warning on line 140 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L140

[write-good.Passive] 'is used' may be passive voice. Use active voice if you can.
Raw output
{"message": "[write-good.Passive] 'is used' may be passive voice. Use active voice if you can.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 140, "column": 82}}}, "severity": "WARNING"}
| Table schema | Yes | Column definitions that match your ClickHouse table. |
| Transformation | Yes | JavaScript that maps webhook payloads to rows matching the table schema. |

### Setup

1. Create a ClickHouse table to receive webhook events.
2. Ensure the configured user has permission to insert rows into the target table.
3. In the Novu dashboard, select **ClickHouse** when adding a webhook endpoint.
4. Fill in connection settings, **table schema**, and **transformation**.
5. Select event types, create the endpoint, and verify rows with **Send Example**.

## Snowflake

The Snowflake connector stores Novu webhook events directly in a Snowflake table. Use it when you want notification data available in your Snowflake data warehouse for reporting, analytics, or downstream pipelines.

### Configuration

| Field | Required | Description |
| --- | --- | --- |
| Account identifier | Yes | Your Snowflake account identifier. |
| User ID | Yes | The Snowflake user used to authenticate. |
| Private key | Yes | The private key for key-pair authentication. |
| Database name | No | The Snowflake database where events are stored. |

Check notice on line 163 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L163

[Google.Passive] In general, use active voice instead of passive voice ('are stored').
Raw output
{"message": "[Google.Passive] In general, use active voice instead of passive voice ('are stored').", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 163, "column": 60}}}, "severity": "INFO"}

Check notice on line 163 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L163

[write-good.E-Prime] Try to avoid using 'are'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'are'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 163, "column": 60}}}, "severity": "INFO"}

Check warning on line 163 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L163

[write-good.Passive] 'are stored' may be passive voice. Use active voice if you can.
Raw output
{"message": "[write-good.Passive] 'are stored' may be passive voice. Use active voice if you can.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 163, "column": 60}}}, "severity": "WARNING"}
| Schema name | No | The schema containing the target table. |
| Table name | No | The table where events are stored. |

Check warning on line 165 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L165

[write-good.Passive] 'are stored' may be passive voice. Use active voice if you can.
Raw output
{"message": "[write-good.Passive] 'are stored' may be passive voice. Use active voice if you can.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 165, "column": 44}}}, "severity": "WARNING"}

Check notice on line 165 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L165

[Google.Passive] In general, use active voice instead of passive voice ('are stored').
Raw output
{"message": "[Google.Passive] In general, use active voice instead of passive voice ('are stored').", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 165, "column": 44}}}, "severity": "INFO"}

Check notice on line 165 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L165

[write-good.E-Prime] Try to avoid using 'are'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'are'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 165, "column": 44}}}, "severity": "INFO"}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Require target tables

The Snowflake and Redshift connector sections describe inserting rows into a destination table, but both configuration tables mark Table name as optional. If a user follows the docs and leaves this blank, the connector has no target table to write transformed rows into, so setup cannot complete or deliveries can fail at insert time. Please mark Table name as required for both Snowflake and Redshift.

Prompt To Fix With AI
This is a comment left during a code review.
Path: content/docs/platform/developer/webhooks/connectors.mdx
Line: 165

Comment:
**Require target tables**

The Snowflake and Redshift connector sections describe inserting rows into a destination table, but both configuration tables mark `Table name` as optional. If a user follows the docs and leaves this blank, the connector has no target table to write transformed rows into, so setup cannot complete or deliveries can fail at insert time. Please mark `Table name` as required for both Snowflake and Redshift.

How can I resolve this? If you propose a fix, please make it concise.

Fix in Cursor

| Table schema | Yes | Column definitions that match your Snowflake table. |
| Transformation | Yes | JavaScript that maps webhook payloads to rows matching the table schema. |

### Setup

1. Create a Snowflake table to receive webhook events.
2. Configure a Snowflake user with key-pair authentication and insert permissions on the target table.
3. In the Novu dashboard, select **Snowflake** when adding a webhook endpoint.
4. Fill in connection settings, **table schema**, and **transformation**.
5. Select event types, create the endpoint, and verify rows with **Send Example**.

## Amazon Redshift

Check warning on line 177 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L177

[Google.Headings] 'Amazon Redshift' should use sentence-style capitalization.
Raw output
{"message": "[Google.Headings] 'Amazon Redshift' should use sentence-style capitalization.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 177, "column": 4}}}, "severity": "WARNING"}

The Amazon Redshift connector stores Novu webhook events directly in a Redshift table. Use it when you want notification events available in your Redshift data warehouse for analytics and reporting.

### Configuration

| Field | Required | Description |
| --- | --- | --- |
| Region | Yes | The AWS region where your Redshift cluster or workgroup is located. |

Check notice on line 185 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L185

[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 185, "column": 22}}}, "severity": "INFO"}

Check warning on line 185 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L185

[write-good.Passive] 'is located' may be passive voice. Use active voice if you can.
Raw output
{"message": "[write-good.Passive] 'is located' may be passive voice. Use active voice if you can.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 185, "column": 74}}}, "severity": "WARNING"}

Check notice on line 185 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L185

[Google.Passive] In general, use active voice instead of passive voice ('is located').
Raw output
{"message": "[Google.Passive] In general, use active voice instead of passive voice ('is located').", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 185, "column": 74}}}, "severity": "INFO"}

Check notice on line 185 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L185

[write-good.E-Prime] Try to avoid using 'is'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 185, "column": 74}}}, "severity": "INFO"}
| Access key ID | Yes | The AWS access key ID with permission to write to Redshift. |

Check notice on line 186 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L186

[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 186, "column": 29}}}, "severity": "INFO"}
| Secret access key | Yes | The AWS secret access key for the IAM user. |

Check notice on line 187 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L187

[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 187, "column": 33}}}, "severity": "INFO"}

Check notice on line 187 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L187

[Google.Acronyms] Spell out 'IAM', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'IAM', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 187, "column": 63}}}, "severity": "INFO"}
| Cluster identifier | No | The Redshift cluster identifier. Required for provisioned clusters. |
| Workgroup name | No | The Redshift Serverless workgroup name. Required for serverless deployments. |
| Database user | No | The database user for provisioned clusters. |
| Database name | No | The Redshift database where events are stored. |

Check notice on line 191 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L191

[Google.Passive] In general, use active voice instead of passive voice ('are stored').
Raw output
{"message": "[Google.Passive] In general, use active voice instead of passive voice ('are stored').", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 191, "column": 59}}}, "severity": "INFO"}

Check warning on line 191 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L191

[write-good.Passive] 'are stored' may be passive voice. Use active voice if you can.
Raw output
{"message": "[write-good.Passive] 'are stored' may be passive voice. Use active voice if you can.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 191, "column": 59}}}, "severity": "WARNING"}

Check notice on line 191 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L191

[write-good.E-Prime] Try to avoid using 'are'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'are'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 191, "column": 59}}}, "severity": "INFO"}
| Schema name | No | The schema containing the target table. |
| Table name | No | The table where events are stored. |

Check warning on line 193 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L193

[write-good.Passive] 'are stored' may be passive voice. Use active voice if you can.
Raw output
{"message": "[write-good.Passive] 'are stored' may be passive voice. Use active voice if you can.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 193, "column": 44}}}, "severity": "WARNING"}

Check notice on line 193 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L193

[Google.Passive] In general, use active voice instead of passive voice ('are stored').
Raw output
{"message": "[Google.Passive] In general, use active voice instead of passive voice ('are stored').", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 193, "column": 44}}}, "severity": "INFO"}

Check notice on line 193 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L193

[write-good.E-Prime] Try to avoid using 'are'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'are'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 193, "column": 44}}}, "severity": "INFO"}
Comment on lines +188 to +193

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Mark conditional requirements

This table marks all Redshift target fields as optional, while the callout below says provisioned clusters require Cluster identifier and Database user, and serverless requires Workgroup name. A user can follow the table, omit all of these fields, and end up with an invalid Redshift connector configuration. Please mark the Redshift fields as conditionally required based on provisioned versus serverless setup.

Prompt To Fix With AI
This is a comment left during a code review.
Path: content/docs/platform/developer/webhooks/connectors.mdx
Line: 188-193

Comment:
**Mark conditional requirements**

This table marks all Redshift target fields as optional, while the callout below says provisioned clusters require `Cluster identifier` and `Database user`, and serverless requires `Workgroup name`. A user can follow the table, omit all of these fields, and end up with an invalid Redshift connector configuration. Please mark the Redshift fields as conditionally required based on provisioned versus serverless setup.

How can I resolve this? If you propose a fix, please make it concise.

Fix in Cursor

| Table schema | Yes | Column definitions that match your Redshift table. |
| Transformation | Yes | JavaScript that maps webhook payloads to rows matching the table schema. |

<Callout type="info">For provisioned Redshift clusters, set **Cluster identifier** and **Database user**. For Redshift Serverless, set **Workgroup name** instead.</Callout>

### Setup

1. Create a Redshift table to receive webhook events.
2. Create an IAM user with the permissions required to write data to Redshift.

Check notice on line 202 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L202

[Google.Acronyms] Spell out 'IAM', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'IAM', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 202, "column": 14}}}, "severity": "INFO"}
3. In the Novu dashboard, select **Redshift** when adding a webhook endpoint.
4. Fill in connection settings, **table schema**, and **transformation**.
5. Select event types, create the endpoint, and verify rows with **Send Example**.

## Amazon SQS

Check warning on line 207 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L207

[Google.Headings] 'Amazon SQS' should use sentence-style capitalization.
Raw output
{"message": "[Google.Headings] 'Amazon SQS' should use sentence-style capitalization.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 207, "column": 4}}}, "severity": "WARNING"}

Check notice on line 207 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L207

[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 207, "column": 11}}}, "severity": "INFO"}

The Amazon SQS connector sends Novu webhook events to an Amazon SQS queue. Use it when you want to process notification events asynchronously through your existing AWS messaging infrastructure.

Check notice on line 209 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L209

[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 209, "column": 12}}}, "severity": "INFO"}

Check notice on line 209 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L209

[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 209, "column": 65}}}, "severity": "INFO"}

Check notice on line 209 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L209

[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 209, "column": 165}}}, "severity": "INFO"}

### Configuration

| Field | Required | Description |
| --- | --- | --- |
| Queue URL | Yes | The URL of the target SQS queue. |

Check notice on line 215 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L215

[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 215, "column": 43}}}, "severity": "INFO"}
| Region | Yes | The AWS region where the queue is located. |

Check notice on line 216 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L216

[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 216, "column": 22}}}, "severity": "INFO"}

Check warning on line 216 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L216

[write-good.Passive] 'is located' may be passive voice. Use active voice if you can.
Raw output
{"message": "[write-good.Passive] 'is located' may be passive voice. Use active voice if you can.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 216, "column": 49}}}, "severity": "WARNING"}

Check notice on line 216 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L216

[write-good.E-Prime] Try to avoid using 'is'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 216, "column": 49}}}, "severity": "INFO"}

Check notice on line 216 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L216

[Google.Passive] In general, use active voice instead of passive voice ('is located').
Raw output
{"message": "[Google.Passive] In general, use active voice instead of passive voice ('is located').", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 216, "column": 49}}}, "severity": "INFO"}
| Access key ID | Yes | The AWS access key ID with permission to send messages to the queue. |

Check notice on line 217 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L217

[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 217, "column": 29}}}, "severity": "INFO"}
| Secret access key | Yes | The AWS secret access key for the IAM user. |

Check notice on line 218 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L218

[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 218, "column": 33}}}, "severity": "INFO"}

Check notice on line 218 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L218

[Google.Acronyms] Spell out 'IAM', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'IAM', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 218, "column": 63}}}, "severity": "INFO"}
| Endpoint URL | No | A custom endpoint URL. Use this when connecting to LocalStack or other SQS-compatible services. |

Check notice on line 219 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L219

[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 219, "column": 94}}}, "severity": "INFO"}
| Transformation | Yes | JavaScript that shapes the message body sent to the queue. |

### Setup

1. Create an SQS queue in your AWS account.

Check notice on line 224 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L224

[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 224, "column": 14}}}, "severity": "INFO"}

Check notice on line 224 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L224

[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 224, "column": 32}}}, "severity": "INFO"}
2. Create an IAM user with `sqs:SendMessage` permission on the target queue.

Check notice on line 225 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L225

[Google.Acronyms] Spell out 'IAM', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'IAM', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 225, "column": 14}}}, "severity": "INFO"}
3. In the Novu dashboard, select **SQS** when adding a webhook endpoint.

Check notice on line 226 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L226

[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SQS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 226, "column": 36}}}, "severity": "INFO"}
4. Fill in connection settings and review the **transformation**.
5. Select event types, create the endpoint, and verify messages with **Send Example**.

## Amazon SNS

Check warning on line 230 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L230

[Google.Headings] 'Amazon SNS' should use sentence-style capitalization.
Raw output
{"message": "[Google.Headings] 'Amazon SNS' should use sentence-style capitalization.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 230, "column": 4}}}, "severity": "WARNING"}

Check notice on line 230 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L230

[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 230, "column": 11}}}, "severity": "INFO"}

The Amazon SNS connector publishes Novu webhook events to an Amazon SNS topic. Use it when you want to fan out notification events to multiple subscribers through SNS.

Check notice on line 232 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L232

[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 232, "column": 12}}}, "severity": "INFO"}

Check notice on line 232 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L232

[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 232, "column": 69}}}, "severity": "INFO"}

Check warning on line 232 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L232

[write-good.TooWordy] 'multiple' is too wordy.
Raw output
{"message": "[write-good.TooWordy] 'multiple' is too wordy.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 232, "column": 135}}}, "severity": "WARNING"}

Check notice on line 232 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L232

[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 232, "column": 164}}}, "severity": "INFO"}

### Configuration

| Field | Required | Description |
| --- | --- | --- |
| Topic ARN | Yes | The ARN of the target SNS topic. |

Check notice on line 238 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L238

[Google.Acronyms] Spell out 'ARN', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'ARN', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 238, "column": 9}}}, "severity": "INFO"}

Check notice on line 238 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L238

[Google.Acronyms] Spell out 'ARN', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'ARN', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 238, "column": 25}}}, "severity": "INFO"}

Check notice on line 238 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L238

[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 238, "column": 43}}}, "severity": "INFO"}
| Region | Yes | The AWS region where the topic is located. |

Check notice on line 239 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L239

[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 239, "column": 22}}}, "severity": "INFO"}

Check notice on line 239 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L239

[write-good.E-Prime] Try to avoid using 'is'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 239, "column": 49}}}, "severity": "INFO"}

Check warning on line 239 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L239

[write-good.Passive] 'is located' may be passive voice. Use active voice if you can.
Raw output
{"message": "[write-good.Passive] 'is located' may be passive voice. Use active voice if you can.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 239, "column": 49}}}, "severity": "WARNING"}

Check notice on line 239 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L239

[Google.Passive] In general, use active voice instead of passive voice ('is located').
Raw output
{"message": "[Google.Passive] In general, use active voice instead of passive voice ('is located').", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 239, "column": 49}}}, "severity": "INFO"}
| Access key ID | Yes | The AWS access key ID with permission to publish to the topic. |

Check notice on line 240 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L240

[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 240, "column": 29}}}, "severity": "INFO"}
| Secret access key | Yes | The AWS secret access key for the IAM user. |

Check notice on line 241 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L241

[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 241, "column": 33}}}, "severity": "INFO"}

Check notice on line 241 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L241

[Google.Acronyms] Spell out 'IAM', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'IAM', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 241, "column": 63}}}, "severity": "INFO"}
| Endpoint URL | No | A custom endpoint URL. Use this when connecting to LocalStack or other SNS-compatible services. |

Check notice on line 242 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L242

[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 242, "column": 94}}}, "severity": "INFO"}
| Transformation | Yes | JavaScript that shapes the notification body published to the topic. |

### Setup

1. Create an SNS topic in your AWS account.

Check notice on line 247 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L247

[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 247, "column": 14}}}, "severity": "INFO"}

Check notice on line 247 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L247

[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'AWS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 247, "column": 32}}}, "severity": "INFO"}
2. Create an IAM user with `sns:Publish` permission on the target topic.

Check notice on line 248 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L248

[Google.Acronyms] Spell out 'IAM', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'IAM', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 248, "column": 14}}}, "severity": "INFO"}
3. In the Novu dashboard, select **SNS** when adding a webhook endpoint.

Check notice on line 249 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L249

[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'SNS', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 249, "column": 36}}}, "severity": "INFO"}
4. Fill in connection settings and review the **transformation**.
5. Select event types, create the endpoint, and verify messages with **Send Example**.

## Monitoring and troubleshooting

Connector endpoints support the same delivery monitoring, retry, and recovery features as standard webhook endpoints. From the endpoint details page in the Novu dashboard, you can:

- View delivery attempts and failure reasons in the **Logs** tab.

Check warning on line 257 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L257

[Novu.BulletStyle] Prefer '*' over '-' for bullet points (ignore inside code fences).
Raw output
{"message": "[Novu.BulletStyle] Prefer '*' over '-' for bullet points (ignore inside code fences).", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 257, "column": 1}}}, "severity": "WARNING"}
- Inspect the transformed payload sent to your destination.

Check warning on line 258 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L258

[Novu.BulletStyle] Prefer '*' over '-' for bullet points (ignore inside code fences).
Raw output
{"message": "[Novu.BulletStyle] Prefer '*' over '-' for bullet points (ignore inside code fences).", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 258, "column": 1}}}, "severity": "WARNING"}
- Resend individual failed events.

Check warning on line 259 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L259

[Novu.BulletStyle] Prefer '*' over '-' for bullet points (ignore inside code fences).
Raw output
{"message": "[Novu.BulletStyle] Prefer '*' over '-' for bullet points (ignore inside code fences).", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 259, "column": 1}}}, "severity": "WARNING"}
- Recover or replay failed messages from a selected time window.

Check warning on line 260 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L260

[Novu.BulletStyle] Prefer '*' over '-' for bullet points (ignore inside code fences).
Raw output
{"message": "[Novu.BulletStyle] Prefer '*' over '-' for bullet points (ignore inside code fences).", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 260, "column": 1}}}, "severity": "WARNING"}

If deliveries fail consistently, check the following:

| Symptom | What to check |
| --- | --- |
| Authentication errors | Connector credentials, IAM permissions, or database user grants. |

Check notice on line 266 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L266

[Google.Acronyms] Spell out 'IAM', if it's unfamiliar to the audience.
Raw output
{"message": "[Google.Acronyms] Spell out 'IAM', if it's unfamiliar to the audience.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 266, "column": 50}}}, "severity": "INFO"}
| Schema or type errors | Table schema matches your destination table; transformation output uses the correct column names and types. |
| Missing rows or messages | Delivery shows success in **Logs** but destination is empty—transformation may not match the expected insert or message format. |

Check notice on line 268 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L268

[write-good.E-Prime] Try to avoid using 'is'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 268, "column": 81}}}, "severity": "INFO"}
| Unhandled event types | Transformation includes a branch for every subscribed [event type](/platform/developer/webhooks/event-types). |

If the destination service is unreachable from Novu's webhook infrastructure, deliveries will continue to retry according to the [retry schedule](/platform/developer/webhooks#recovery-and-resending-failed-messages) before the endpoint is disabled.

Check notice on line 271 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L271

[write-good.E-Prime] Try to avoid using 'is'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 271, "column": 28}}}, "severity": "INFO"}

Check warning on line 271 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L271

[write-good.Passive] 'is disabled' may be passive voice. Use active voice if you can.
Raw output
{"message": "[write-good.Passive] 'is disabled' may be passive voice. Use active voice if you can.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 271, "column": 236}}}, "severity": "WARNING"}

Check notice on line 271 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L271

[write-good.E-Prime] Try to avoid using 'is'.
Raw output
{"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 271, "column": 236}}}, "severity": "INFO"}

Check notice on line 271 in content/docs/platform/developer/webhooks/connectors.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] content/docs/platform/developer/webhooks/connectors.mdx#L271

[Google.Passive] In general, use active voice instead of passive voice ('is disabled').
Raw output
{"message": "[Google.Passive] In general, use active voice instead of passive voice ('is disabled').", "location": {"path": "content/docs/platform/developer/webhooks/connectors.mdx", "range": {"start": {"line": 271, "column": 236}}}, "severity": "INFO"}
1 change: 1 addition & 0 deletions content/docs/platform/developer/webhooks/event-types.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
title: 'Event types'
pageTitle: "Webhooks event types"
description: 'Learn more about the types of events that Novu sends webhook events for.'
icon: 'Tags'
---

Novu supports the following webhook event types:
Expand Down
Loading
Loading