docs/platform/integrations/trigger-overrides.mdx
Trigger overrides let you to modify the default behavior of specific aspects of a workflow trigger (event), giving you fine-tuned control over how messages are delivered across different channels and providers.
Channel overrides let you customize specific channel settings and content during workflow trigger. Each channel has its own supported override options, documented in their respective channel guides.
<Note> Channel overrides is only available for Email and SMS channels. </Note> <Columns cols={2}> <Card title="Email overrides" icon="mail" href="/platform/integrations/email" /> <Card title="SMS overrides" icon="message-square" href="/platform/integrations/sms" /> </Columns>Provider overrides give you fine-tuned control over how messages are delivered by allowing direct configuration of the underlying provider SDKs during the workflow's trigger phase.
This feature is designed for advanced use cases where Novu's default message editor or UI does not expose specific provider capabilities.
Use provider overrides to:
This mechanism offers a flexible customization layer that lets you pass deeply nested payloads that align directly with your provider’s native API. It helps decouple workflow behavior from provider-specific implementation details, which is essential when working across multiple channels like email, push, or chat.
<Note> Because overrides interact directly with provider SDKs, they won’t work if they're misconfigured. Make sure you understand the supported options for each provider before using this feature. </Note>Overrides are defined in the overrides property of a trigger payload. You can specify configuration values at two levels:
Workflow-level provider overrides apply configuration to all steps that use a given provider in the workflow. They’re useful for applying shared logic across multiple steps, without repeating the same settings in each one.
Use workflow-level overrides when:
const novu = new Novu({ secretKey: "<YOUR_SECRET_KEY_HERE>" });
await novu.trigger({ to: { subscriberId: "subscriber_unique_identifier", firstName: "Albert", lastName: "Einstein", email: "[email protected]", phone: "+1234567890", }, workflowId: "workflow_identifier", payload: { comment_id: "string", post: { text: "string" }, }, overrides: { providers: { sendgrid: { template_id: "xxxxxxxx", trackingSettings: { clickTracking: { enable: true, enableText: false, }, }, }, }, }, });
</Tab>
<Tab title="Python">
```python
import os
import novu_py
from novu_py import Novu
with Novu(secret_key=os.getenv("NOVU_SECRET_KEY", "")) as novu:
novu.trigger(trigger_event_request_dto=novu_py.TriggerEventRequestDto(
workflow_id="workflow_identifier",
to={
"subscriber_id": "subscriber_unique_identifier",
"first_name": "Albert",
"last_name": "Einstein",
"email": "[email protected]",
"phone": "+1234567890",
},
payload={
"comment_id": "string",
"post": {"text": "string"},
},
overrides={
"providers": {
"sendgrid": {
"template_id": "xxxxxxxx",
"trackingSettings": {
"clickTracking": {
"enable": True,
"enableText": False,
},
},
},
},
},
))
novugo "github.com/novuhq/novu-go"
"github.com/novuhq/novu-go/models/components"
)
s := novugo.New(novugo.WithSecurity(os.Getenv("NOVU_SECRET_KEY")))
res, err := s.Trigger(context.Background(), components.TriggerEventRequestDto{ WorkflowID: "workflow_identifier", To: components.CreateToSubscriberPayloadDto(components.SubscriberPayloadDto{ SubscriberID: "subscriber_unique_identifier", FirstName: "Albert", LastName: "Einstein", Email: "[email protected]", Phone: "+1234567890", }), Payload: map[string]any{ "comment_id": "string", "post": map[string]any{"text": "string"}, }, Overrides: map[string]map[string]any{ "providers": { "sendgrid": map[string]any{ "template_id": "xxxxxxxx", "trackingSettings": map[string]any{ "clickTracking": map[string]any{ "enable": true, "enableText": false, }, }, }, }, }, }, nil)
</Tab>
<Tab title="PHP">
```php
use novu;
use novu\Models\Components;
$sdk = novu\Novu::builder()
->setSecurity('<YOUR_SECRET_KEY_HERE>')
->build();
$sdk->trigger(
triggerEventRequestDto: new Components\TriggerEventRequestDto(
workflowId: 'workflow_identifier',
to: new Components\SubscriberPayloadDto(
subscriberId: 'subscriber_unique_identifier',
firstName: 'Albert',
lastName: 'Einstein',
email: '[email protected]',
phone: '+1234567890',
),
payload: [
'comment_id' => 'string',
'post' => ['text' => 'string'],
],
overrides: [
'providers' => [
'sendgrid' => [
'template_id' => 'xxxxxxxx',
'trackingSettings' => [
'clickTracking' => [
'enable' => true,
'enableText' => false,
],
],
],
],
],
),
);
var sdk = new NovuSDK(secretKey: "<YOUR_SECRET_KEY_HERE>");
await sdk.TriggerAsync(triggerEventRequestDto: new TriggerEventRequestDto() { WorkflowId = "workflow_identifier", To = To.CreateSubscriberPayloadDto(new SubscriberPayloadDto() { SubscriberId = "subscriber_unique_identifier", FirstName = "Albert", LastName = "Einstein", Email = "[email protected]", Phone = "+1234567890", }), Payload = new Dictionary<string, object>() { { "comment_id", "string" }, { "post", new Dictionary<string, object>() { { "text", "string" } } }, }, Overrides = new Overrides() { Providers = new Dictionary<string, Dictionary<string, object>>() { { "sendgrid", new Dictionary<string, object>() { { "template_id", "xxxxxxxx" }, { "trackingSettings", new Dictionary<string, object>() { { "clickTracking", new Dictionary<string, object>() { { "enable", true }, { "enableText", false }, } }, } }, } }, }, }, });
</Tab>
<Tab title="Java">
```java
import co.novu.Novu;
import co.novu.models.components.*;
import java.util.Map;
Novu novu = Novu.builder()
.secretKey("<YOUR_SECRET_KEY_HERE>")
.build();
novu.trigger()
.body(TriggerEventRequestDto.builder()
.workflowId("workflow_identifier")
.to(To2.of(SubscriberPayloadDto.builder()
.subscriberId("subscriber_unique_identifier")
.firstName("Albert")
.lastName("Einstein")
.email("[email protected]")
.phone("+1234567890")
.build()))
.payload(Map.ofEntries(
Map.entry("comment_id", "string"),
Map.entry("post", Map.of("text", "string"))))
.overrides(TriggerEventRequestDtoOverrides.builder()
.additionalProperties(Map.of("providers", Map.of("sendgrid", Map.ofEntries(
Map.entry("template_id", "xxxxxxxx"),
Map.entry("trackingSettings", Map.of("clickTracking", Map.ofEntries(
Map.entry("enable", true),
Map.entry("enableText", false))))))))
.build())
.build())
.call();
This configuration affects every step in the workflow that uses SendGrid, unless a step-level override provides a more specific value.
You can also send extra fields supported by the provider SDK. For example, if you want to send a headers to the provider SDK, then you could use the _passthrough field.
"overrides": {
"providers" : {
"sendgrid": {
"_passthrough": {
"headers": {
"Authorization": "Bearer my-api-key"
}
}
},
},
},
Step-level overrides let you apply provider-specific settings directly to an individual step in your workflow.
Use step-level overrides when:
const novu = new Novu({ secretKey: "<YOUR_SECRET_KEY_HERE>" });
await novu.trigger({ to: { subscriberId: "subscriber_unique_identifier", firstName: "Albert", lastName: "Einstein", email: "[email protected]", phone: "+1234567890", }, workflowId: "workflow_identifier", payload: { comment_id: "string", post: { text: "string" }, }, overrides: { steps: { "push-step": { providers: { fcm: { notification: { title: "New Comment", body: "Someone replied to your post!", sound: "default", }, android: { notification: { sound: "sound_bell", }, }, apns: { payload: { aps: { sound: "notification_bell.caf", }, }, }, }, }, }, }, }, });
</Tab>
<Tab title="Python">
```python
import os
import novu_py
from novu_py import Novu
with Novu(secret_key=os.getenv("NOVU_SECRET_KEY", "")) as novu:
novu.trigger(trigger_event_request_dto=novu_py.TriggerEventRequestDto(
workflow_id="workflow_identifier",
to={
"subscriber_id": "subscriber_unique_identifier",
"first_name": "Albert",
"last_name": "Einstein",
"email": "[email protected]",
"phone": "+1234567890",
},
payload={
"comment_id": "string",
"post": {"text": "string"},
},
overrides={
"steps": {
"push-step": {
"providers": {
"fcm": {
"notification": {
"title": "New Comment",
"body": "Someone replied to your post!",
"sound": "default",
},
"android": {
"notification": {
"sound": "sound_bell",
},
},
"apns": {
"payload": {
"aps": {
"sound": "notification_bell.caf",
},
},
},
},
},
},
},
},
))
novugo "github.com/novuhq/novu-go"
"github.com/novuhq/novu-go/models/components"
)
s := novugo.New(novugo.WithSecurity(os.Getenv("NOVU_SECRET_KEY")))
res, err := s.Trigger(context.Background(), components.TriggerEventRequestDto{ WorkflowID: "workflow_identifier", To: components.CreateToSubscriberPayloadDto(components.SubscriberPayloadDto{ SubscriberID: "subscriber_unique_identifier", FirstName: "Albert", LastName: "Einstein", Email: "[email protected]", Phone: "+1234567890", }), Payload: map[string]any{ "comment_id": "string", "post": map[string]any{"text": "string"}, }, Overrides: map[string]map[string]any{ "steps": { "push-step": map[string]any{ "providers": map[string]any{ "fcm": map[string]any{ "notification": map[string]any{ "title": "New Comment", "body": "Someone replied to your post!", "sound": "default", }, "android": map[string]any{ "notification": map[string]any{ "sound": "sound_bell", }, }, "apns": map[string]any{ "payload": map[string]any{ "aps": map[string]any{ "sound": "notification_bell.caf", }, }, }, }, }, }, }, }, }, nil)
</Tab>
<Tab title="PHP">
```php
use novu;
use novu\Models\Components;
$sdk = novu\Novu::builder()
->setSecurity('<YOUR_SECRET_KEY_HERE>')
->build();
$sdk->trigger(
triggerEventRequestDto: new Components\TriggerEventRequestDto(
workflowId: 'workflow_identifier',
to: new Components\SubscriberPayloadDto(
subscriberId: 'subscriber_unique_identifier',
firstName: 'Albert',
lastName: 'Einstein',
email: '[email protected]',
phone: '+1234567890',
),
payload: [
'comment_id' => 'string',
'post' => ['text' => 'string'],
],
overrides: [
'steps' => [
'push-step' => [
'providers' => [
'fcm' => [
'notification' => [
'title' => 'New Comment',
'body' => 'Someone replied to your post!',
'sound' => 'default',
],
'android' => [
'notification' => [
'sound' => 'sound_bell',
],
],
'apns' => [
'payload' => [
'aps' => [
'sound' => 'notification_bell.caf',
],
],
],
],
],
],
],
],
),
);
var sdk = new NovuSDK(secretKey: "<YOUR_SECRET_KEY_HERE>");
await sdk.TriggerAsync(triggerEventRequestDto: new TriggerEventRequestDto() { WorkflowId = "workflow_identifier", To = To.CreateSubscriberPayloadDto(new SubscriberPayloadDto() { SubscriberId = "subscriber_unique_identifier", FirstName = "Albert", LastName = "Einstein", Email = "[email protected]", Phone = "+1234567890", }), Payload = new Dictionary<string, object>() { { "comment_id", "string" }, { "post", new Dictionary<string, object>() { { "text", "string" } } }, }, Overrides = new Overrides() { Steps = new Dictionary<string, Dictionary<string, Dictionary<string, object>>>() { { "push-step", new Dictionary<string, Dictionary<string, object>>() { { "providers", new Dictionary<string, object>() { { "fcm", new Dictionary<string, object>() { { "notification", new Dictionary<string, object>() { { "title", "New Comment" }, { "body", "Someone replied to your post!" }, { "sound", "default" }, } }, { "android", new Dictionary<string, object>() { { "notification", new Dictionary<string, object>() { { "sound", "sound_bell" }, } }, } }, { "apns", new Dictionary<string, object>() { { "payload", new Dictionary<string, object>() { { "aps", new Dictionary<string, object>() { { "sound", "notification_bell.caf" }, } }, } }, } }, } }, } }, } }, }, }, });
</Tab>
<Tab title="Java">
```java
import co.novu.Novu;
import co.novu.models.components.*;
import java.util.Map;
Novu novu = Novu.builder()
.secretKey("<YOUR_SECRET_KEY_HERE>")
.build();
novu.trigger()
.body(TriggerEventRequestDto.builder()
.workflowId("workflow_identifier")
.to(To2.of(SubscriberPayloadDto.builder()
.subscriberId("subscriber_unique_identifier")
.firstName("Albert")
.lastName("Einstein")
.email("[email protected]")
.phone("+1234567890")
.build()))
.payload(Map.ofEntries(
Map.entry("comment_id", "string"),
Map.entry("post", Map.of("text", "string"))))
.overrides(TriggerEventRequestDtoOverrides.builder()
.additionalProperties(Map.of("steps", Map.of("push-step", Map.of("providers", Map.of("fcm", Map.ofEntries(
Map.entry("notification", Map.ofEntries(
Map.entry("title", "New Comment"),
Map.entry("body", "Someone replied to your post!"),
Map.entry("sound", "default"))),
Map.entry("android", Map.of("notification", Map.of("sound", "sound_bell"))),
Map.entry("apns", Map.of("payload", Map.of("aps", Map.of("sound", "notification_bell.caf"))))))))))
.build())
.build())
.call();
In this example, only the push-step is affected, and multiple FCM-specific settings are overridden for that step, which are the notification title, body, and sound configurations for both Android and iOS platforms.
Use provider overrides to send Slack Block Kit messages from a dashboard workflow. Pass a blocks array under overrides.steps.<step-id>.providers.slack, or use _passthrough.body for raw Slack API fields.