Skip to main content
The Tool channel delivers a payload from a workflow to an operational system. Use it to page on-call, open an incident, or POST JSON to an endpoint you control. It is a channel step, like email or SMS. Novu sends through a Tool integration in the Integration Store. It is not a replacement for step.custom, which runs arbitrary code in your bridge and returns structured results to later steps.
Connect a Tool provider before triggering. PagerDuty, Opsgenie, and Grafana route per subscriber via channel endpoints. Tool webhook can use a shared URL (static) or per-subscriber URLs (dynamic).

When to use step.tool

A common pattern is to fetch in step.custom, then page with step.tool using that result.

Providers

If a subscriber has no channel endpoint for an endpoint-routed provider (or no dynamic webhook URLs), Novu marks the Tool step skipped for that subscriber. Other subscribers on the same trigger are unaffected.

Define a tool step

The resolver must return a body string. That string is the default content sent to the provider.

Workflow with payload

Trigger the workflow as usual. Delivery uses the subscriber’s Tool endpoints for that environment.

Provider overrides

Use the providers option to pass fields the shared body schema does not cover. Keys are Tool provider IDs: pagerduty, opsgenie, grafana, and tool-webhook. Only the override for the integration that actually sends is applied. You can define several; unused ones are ignored.
PagerDuty defaults severity to critical and source to novu when you omit those fields. See incident payload defaults.
You can also use _passthrough to merge extra body, headers, or query into the underlying provider request. See provider overrides.

Step controls

Expose copy that non-developers can edit in the dashboard without changing code.
After you sync the workflow, the dashboard renders a body field for this step. Payload data still comes from novu.trigger. Learn more about controls.

Skip the step

Skip delivery from previous-step results, payload flags, or subscriber data.
skip runs at send time, not during dashboard preview. See skip.

Channel preferences

Disable Tool for a workflow (or leave it subscriber-controlled) with preferences.channels.tool:

Output

The resolver returns { body: string }. The step does not return a result, so you cannot branch later steps on whether the provider accepted the request. See the Tool step reference.

Tool step reference

Output schema and SDK types.

Tool webhook

Static vs dynamic routing, request body merge, and HMAC signatures.

PagerDuty

Per-subscriber routing keys and Events API v2 incident fields.

Custom step

Fetch data in your bridge, then pass it into step.tool.