Skip to main content
Tool Webhook sends workflow Tool step output to an HTTP endpoint you control. Choose static routing to call a single integration URL for every subscriber, or dynamic routing to register one or more destination URLs per subscriber as channel endpoints.
Static mode never uses channel endpoints. Dynamic mode fans out to every tool_webhook endpoint registered for the subscriber on the integration. If a subscriber has no endpoints in dynamic mode, the Tool step is marked skipped for that subscriber.

Prerequisites

  • An HTTPS (or HTTP for local testing) endpoint that accepts POST, PUT, or PATCH requests and returns a 2xx response
  • Access to the Novu dashboard
  • For dynamic routing: your Novu secret key to register endpoints from your server

Static vs dynamic routing

Set Routing Mode when you create the integration. Defaults to Static when omitted.
Dynamic routing does not fall back to the integration URL. Register at least one tool_webhook endpoint per subscriber you intend to deliver to, or the step is skipped for that subscriber.

Add Tool Webhook in Novu

1

Open the Integrations Store

In the Novu dashboard, click Integrations Store in the sidebar.
2

Add Tool Webhook

Click Connect Provider, select Tool, then choose Tool webhook.
3

Choose routing mode and defaults

Configure shared defaults that apply to every delivery in this environment:
4

Create the integration

Click Create Integration and note the integrationIdentifier — you need it when registering dynamic endpoints and when adding a Tool step to a workflow.

Request shape

Novu sends Content-Type: application/json. The exact JSON body depends on whether you configured a Body template on the integration.

Body merge

  1. Integration Body (optional) — parsed as a JSON object and used as the base key/value map.
  2. Step editor — the rendered Tool step content is always sent as content and wins over any content key in the integration Body template.
  3. Step overrides — additional keys from the step or trigger overrides are merged into the payload (excluding reserved routing fields).
Without an integration Body template, the request body is:
With an integration Body template of {"event":"novu.tool","version":1}, the outbound body becomes:

Header merge

Headers are merged in this order (later keys override earlier ones):
  1. Content-Type: application/json
  2. Integration Headers (JSON object)
  3. Dynamic endpoint headers (when present on the tool_webhook endpoint)
  4. Step-level header overrides (when configured on the step)
Use endpoint or step headers to override integration defaults — for example, swap an Authorization token per subscriber without changing the integration.

HTTP method

Resolution order: endpoint method (dynamic) → step override → integration HTTP MethodPOST.

Verify X-Novu-Signature

When you set a Signing Secret on the integration, Novu signs the exact UTF-8 request body string with HMAC SHA-256 and sends the hex digest in the X-Novu-Signature header. Verify on your server using the raw request body bytes (before JSON re-serialization):
Re-stringifying a parsed JSON object often produces a different byte sequence than Novu signed. Always verify against the raw request body.
Your endpoint should return any 2xx response. Novu treats non-2xx responses as delivery failures.

Dynamic mode: register subscriber endpoints

In dynamic routing, each subscriber can have multiple tool_webhook endpoints on the same integration. Novu delivers the Tool step once per endpoint — useful when a subscriber wants parallel notifications to several systems.
Registering endpoints requires your Novu secret key. Call the channel-endpoints API from your server, never from a browser or mobile client.

Create an endpoint

Register a subscriber destination with type tool_webhook. Set createSubscriberIfMissing: true to provision the Novu subscriber on first connect.

Endpoint shape

Unlike PagerDuty or Opsgenie, a subscriber may register multiple tool_webhook endpoints on the same integration. Each endpoint receives its own HTTP request when the workflow runs.

Update, list, and delete

Rotate a URL or headers with PATCH /v1/channel-endpoints/:identifier. List endpoints for a subscriber:
Delete an endpoint to remove a destination. This removes the encrypted url and header values stored on the endpoint. See the channel endpoints API reference for full request and response details.

Send from a workflow

1

Add a Tool step

In the workflow editor, add a step and select Tool as the channel. Choose the Tool Webhook integration you created.
2

Write the step body

The step body becomes the content field in the outbound JSON (after template rendering). Use placeholders such as {{payload.orderId}} or {{subscriber.firstName}}.
3

Trigger the workflow

Trigger the workflow for a subscriber. In static mode Novu calls the integration URL. In dynamic mode Novu calls every tool_webhook endpoint registered for that subscriber.

What happens without an endpoint (dynamic mode)

If Routing Mode is Dynamic and a subscriber has no tool_webhook endpoints on the integration, Novu marks the Tool step as skipped for that subscriber in the Activity feed. Other subscribers on the same trigger are unaffected.

Create a channel endpoint

API reference for POST /v1/channel-endpoints, including the tool_webhook variant.

Update an endpoint

API reference for PATCH /v1/channel-endpoints/:identifier. Rotate URLs or headers for a subscriber destination.