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

Prerequisites

  • An existing Google Cloud Storage bucket, created before you configure the endpoint
  • A Google Cloud service account with a JSON key that can create objects in that bucket

Required permission

Writing a new object requires the storage.objects.create permission, which is included in the predefined roles/storage.objectCreator role. That role can create objects but cannot read, overwrite, or delete them, which is usually what an append-only event archive wants. Grant it on the bucket rather than the project:
See Cloud Storage IAM roles for the full permission reference. Paste the complete JSON key into the credentials field and treat it as a secret.

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 bucket

Create the bucket and service account credentials. Keep the complete credentials JSON available.
2

Add the endpoint

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

Enter connection details

Enter Bucket and the service account Credentials JSON.
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

Select the event types to store. Selecting fewer event types also limits which events reach the transformation.
6

Test the endpoint

Create the endpoint. In Testing, send an example for a subscribed event type. Confirm success in Logs, then verify the bucket contains a new timestamp-suffixed object with the expected content.

Verify delivery

List objects under your key prefix, then read one and compare it with the transformation output in the endpoint’s Logs:
If roles/storage.objectCreator is the only role you granted, the connector’s service account cannot list or read objects. Run these commands with your own credentials rather than the connector’s key.

Troubleshooting

  • Credentials are rejected: Paste the complete service account credentials JSON and confirm it is valid JSON.
  • The bucket cannot be accessed: Confirm the bucket exists and the supplied service account can write to it.
  • No object appears after a successful test: Check the exact bucket name and inspect the transformed output in Logs.
  • Object contents are malformed: Confirm config.format matches data. For "raw", return a string.
  • Events are missing: Confirm the endpoint subscribes to those event types in the intended Novu environment.

Official references