Skip to main content
The Azure Blob Storage connector writes selected Novu webhook events to a container. Each delivered batch creates a new blob. Novu webhook delivery is powered by Svix. This connector maps to the Svix object storage advanced endpoint, which is shared with Amazon S3 and Google Cloud Storage.
Outbound webhooks are available on Team and Enterprise plans.

Prerequisites

  • An Azure storage account
  • An existing blob container, created before you configure the endpoint
  • The storage account name and one of its access keys

Access model

The connector authenticates with a storage account access key. An account key grants full access to every container in that storage account, and it cannot be narrowed to a single container the way an Azure RBAC role assignment or a container-scoped SAS token can. Because of that, use a storage account dedicated to webhook exports rather than one that also holds application data, and rotate the key on your normal schedule. Azure supports two keys per account so you can rotate without downtime: update the endpoint to the second key, then regenerate the first.

Configuration

Transformation contract

Object storage connectors run the handler once per delivery batch. The handler receives one delivery batch:
  • input.events, an array whose length is capped by the endpoint batch size
  • input.events[].eventType, the Novu event type, for example message.sent
  • input.events[].payload, the webhook body
The webhook body wraps the resource in an envelope. payload.object is the resource type as a string, such as "message", and the resource itself is under payload.data.object. For message events, fields such as subscriberId and channel are therefore at event.payload.data.object. Other event families use different resource shapes, so guard extracted fields with defaults. The handler must return:
The default template returns the batch unchanged:
With "jsonl", each line is one event:

Novu example

This example groups objects by date and keeps each payload intact:
The connector appends a timestamp to config.key, so use the key for the prefix structure rather than adding a uniqueness suffix.

Batching behavior

One delivered batch produces one object. Treat its contents as a variable-length batch and read it line by line when using "jsonl".

Configure in the Dashboard

1

Prepare the container

Create the storage account and container. Keep the account name and access key available.
2

Add the endpoint

Open Webhooks in the Novu Dashboard, select Endpoints, click Add Endpoint, and choose .
3

Enter connection details

Enter Container, Account, and Access key.
4

Configure the transformation

Start from the provided object storage template. Change config.key to the prefix you want and keep config.format aligned with data.
5

Select event types

Choose only the event types that you want to store. The connector processes selected events in batches.
6

Test the endpoint

Create the endpoint. Open its Testing tab, choose a subscribed event type, and click Send Example. Confirm success in Logs, then verify that a timestamp-suffixed blob exists in the container and contains the expected data.

Verify delivery

List the most recent blobs under your key prefix:
Download one blob and compare its contents with the transformation output in the endpoint’s Logs:

Troubleshooting

  • Authentication fails: Recheck the account name and access key. Confirm the key is active and can access the configured container.
  • The container is not found: Confirm the container already exists in the specified storage account and that its spelling and casing match.
  • A successful delivery has unexpected contents: Inspect the transformed output in Logs and verify that format and data agree.
  • A raw blob is invalid: Return a string in data when config.format is "raw".
  • Expected events are absent: Check the endpoint’s selected event types and the current Novu environment.

Official references