Skip to content
Novu logoNovu

Changelog

Latest updates and improvements in the chat category.

Follow us on X

All changelog posts

  • Provider content overrides in the Dashboard

    Save provider-native JSON on Chat and Tool workflow steps, then version and promote it with the rest of the workflow.

    Authors:
    George DjabarovVictor Yakubu
    George D., Victor Y.
    Provider content overrides in the dashboard

    Provider content overrides can now be configured directly in the Novu Dashboard. Use them when a workflow needs fields from a provider's native API that the shared step editor does not expose, such as Slack Block Kit, WhatsApp templates, or PagerDuty incident fields.

    Previously, these payloads had to be added to every trigger() call in application code. You can now save the JSON once on the workflow step. It applies to every trigger and moves from development to production with the workflow.

    Keep provider-native content with the workflow

    Open a Chat or Tool step and select a connected provider from the content source dropdown. Provider tabs only appear when that provider has an active integration in the current environment.

    The override is stored as a JSON object on the step. It supports Liquid variables, so the payload can still use workflow and subscriber data:

    {
      "blocks": [
        {
          "type": "section",
          "text": {
            "type": "mrkdwn",
            "text": "Deploy *{{payload.status}}* for {{subscriber.firstName}}"
          }
        },
        {
          "type": "actions",
          "elements": [
            {
              "type": "button",
              "text": { "type": "plain_text", "text": "View run" },
              "url": "{{payload.runUrl}}"
            }
          ]
        }
      ]
    }

    The Dashboard also shows a preview of the merged payload before you save the workflow.

    Get validation where a provider schema is available

    Schema-backed editors help you catch malformed provider payloads before delivery. Slack overrides include autocomplete and validation against supported chat.postMessage fields, including nested Block Kit elements. The editor also links to Slack's Block Kit Builder.

    WhatsApp Business overrides provide autocomplete and validation for message shapes such as templates, interactive messages, media, and text. The same override interface is available for Tool providers, including PagerDuty, Opsgenie, Grafana, and Tool Webhook.

    When a provider does not have a schema-backed editor, the Dashboard provides a free-form JSON field with a warning and a link to the provider's documentation. Novu passes that object to the provider, so test the workflow with a real trigger before relying on it.

    Combine default content and overrides predictably

    The shared step body remains the default content. Novu merges the saved override into the provider request. If the override omits the provider's primary content field, such as text for Slack or text.body for WhatsApp, Novu fills it from the rendered step body.

    Overrides follow this precedence order:

    1. Dashboard override saved on the step.
    2. Workflow-level provider override passed at trigger time.
    3. Step-level provider override passed at trigger time.

    The higher-priority value wins when the same field appears at multiple levels. Arrays replace the lower-priority array as a whole. They are not merged by index.

    Some Slack chat.postMessage fields do not apply when the integration delivers through an incoming webhook. Check the Slack setup guide before relying on fields such as thread or sender metadata.

    Use Rich Chat for shared content and overrides for provider-specific fields

    The Rich Chat editor and provider content overrides work together. Use the block editor when you want to create one structured message and let Novu render it for each connected chat provider. Use an override when one provider needs its own JSON format or a field outside the shared card model.

    Provider content overrides are available for Tool steps and are rolling out gradually for Chat steps. If the provider dropdown does not appear on a Chat step yet, trigger-time provider overrides continue to work.

    Read the Chat provider content overrides overview, configure Slack overrides in the Dashboard, or review the provider override precedence rules.

  • Rich chat editor for workflow Chat steps

    Build structured chat notifications with text, images, lists, link buttons, variables, and provider-aware previews from the workflow editor.

    Authors:
    Paweł TymczukVictor Yakubu
    Paweł T., Victor Y.
    Rich chat editor for workflow Chat steps

    Workflow Chat steps now include a visual block editor. Instead of limiting every workflow-sent chat notification to one text body, you can compose structured messages for approvals, reports, summaries, prompts, and calls to action from the Dashboard.

    Novu converts the shared message into a provider-specific format at delivery time. You author the content once, then inspect how it may appear on each chat provider connected to the environment.

    Rich chat editor

    Build structured Chat steps visually

    Type / or use the add control to insert blocks into a Chat step. The first release supports:

    • Text and images.
    • Dividers, blockquotes, hard breaks, and numbered or bulleted lists.
    • Link buttons with variable-backed labels and redirect URLs.
    • Repeat and Digest blocks for content produced by earlier workflow steps.

    Dashboard buttons open a URL. They do not route a reply to an agent or call back into your application.

    Preview each provider before publishing

    The preview panel uses the same shared card model as delivery. Switch between providers configured in the current environment to inspect an approximate rendering for each one.

    Novu maps the card into provider-specific formats for Slack, Microsoft Teams, Telegram, and WhatsApp. Providers without a matching rich layout receive a compatible Markdown or text representation. When a provider cannot represent a block or button fully, the preview shows a compatibility warning so you can simplify the message or add a provider content override.

    Provider previews are approximate. The delivered message can still differ because each platform controls its own spacing, layout, and supported features.

    Existing text workflows keep their behavior

    Existing Chat steps that use plain text or Liquid continue to use the Text editor and deliver as before. New empty Chat steps open in the Block editor by default.

    You can switch between the Block and Text editors, but changing modes replaces the content stored for the current mode. Copy any content you need before switching while editing an existing workflow.

    Liquid variables and translations continue to work. Use the Text editor for templates that depend heavily on Liquid conditions or loops. Use the Block editor when the message benefits from a structured layout that can be shared across providers.

    Return the same card model from Framework

    Code-first workflows can return a card from step.chat() instead of a text-only body:

    Return the same card model from Framework
    import { Actions, Card, CardText, Divider } from '@novu/framework';
    
    await step.chat('deploy-complete', async () => ({
      card: Card({
        title: 'Deploy complete',
        children: [
          CardText('All checks passed.'),
          Divider(),
          Actions([
            {
              type: 'link-button',
              id: 'view-deploy',
              label: 'View deploy',
              url: 'https://example.com/deploys/123',
            },
          ]),
        ],
      }),
    }));

    Existing body returns remain valid. When a Chat step returns both body and card, Novu uses the card.

    Add provider-native JSON when the shared card is not enough

    The block editor covers shared rich content. Provider content overrides remain available beside Default content when you need exact provider JSON, such as a full Slack Block Kit payload or a WhatsApp template.

    Read how to write Chat templates in the Dashboard or see the Framework Chat step for code-first workflows.

  • Novu Chat SDK Adapter

    Bring your Chat SDK agent to Slack, Teams, WhatsApp, Telegram, and email: deliver multi-channel notifications from one trigger, resolve every channel to one unified subscriber, and drop in React connect components to put channels in front of your end-customers.

    The @novu/chat-sdk-adapter is now available. Wire it into your Chat SDK app and Novu manages credentials, identity, and delivery across Slack, Microsoft Teams, WhatsApp, Telegram, and email.

    npm install @novu/chat-sdk-adapter

    Multi-channel notifications from one trigger

    Define a workflow once in Novu with the channels you want, then fire a single trigger from any handler. Novu fans out to every step — Slack, email, WhatsApp, and more — and routes replies back through the same agent loop, so proactive notifications and conversational replies share one handler set.

    const ctx = getNovuContext(thread);
    
    // One trigger delivers to every channel in the workflow.
    await ctx.trigger("order-shipped", {
      payload: { orderId: "1234", trackingUrl: "https://example.com/track/1234" },
    });

    One unified subscriber across every channel

    Every channel resolves to a single Novu subscriber mapped to your own user, so your agent always knows who it's talking to — with email, phone, locale, custom data, and the canonical conversation history available inside any handler.

    const ctx = getNovuContext(thread);
    
    const subscriber = await ctx.getSubscriber(); // email, phone, locale, custom data
    const history = await ctx.getHistory();       // canonical transcript — ideal for LLM context

    Expose channels to end-customers with connect components

    Drop the prebuilt SlackConnectButton from @novu/react into your app so your end-customers can install and connect their own Slack workspace to your agent — OAuth, credentials, and Slack Connect handled by Novu. Microsoft Teams and Telegram connect buttons are in pre-release.

    import { SlackConnectButton } from '@novu/react';
    
    <SlackConnectButton
      integrationIdentifier={integrationIdentifier}
      connectionIdentifier={`${subscriberId}:${integrationIdentifier}:${agent.identifier}`}
      connectionMode="subscriber"
      connectLabel={`Install ${agent.name} ↗`}
      connectedLabel="Connected to Slack"
      onConnectSuccess={handleSlackOAuthSuccess}
    />

    Get started with npx novu connect --runtime chat-sdk, or read the connect components docs.

  • Native Slack and Microsoft Teams Integration

    Route notifications to Slack or Microsoft Teams channels and DMs using your app identity. One integration, simple OAuth per customer, and Novu handles the rest.

    Author:Adam Chmara
    Adam Chmara
    Native Slack and Microsoft Teams Integration

    Notify Slack channels, Microsoft Teams, and users through DMs using your app identity.

    The new chat integrations let you connect your Slack app or Microsoft Teams bot to Novu. You can then route notifications to the exact destinations your users choose.

    Messages go where they’re needed. You can alert teams about server problems. You can update hiring managers on candidates. You can send operational alerts to specific channels.

    Both integrations work the same way:

    • First, set up your app credentials in Novu.
    • Then, let users connect their workspaces via OAuth.
    • Finally, register endpoints for channels or users.

    Novu handles token management. It routes messages and delivers them. All this happens across different customer tenants using a single integration.

    Slack integration beta

    The Slack chat integration bot is currently in beta. Contact support@novu.co to enable it for your organization.

    Multi-tenant by design

    A single Slack app or Teams bot can serve all your customers. Each customer connects their own workspace through a one-time OAuth consent flow.

    Novu keeps the connection for you. It sends messages on your app's behalf.

    You won't need to manage tokens. Also, you won't have to set up separate integrations for each customer.

    In Microsoft Teams, your customers grant admin consent only once. Then, Novu can send messages to any team or user with your app installed.

    Users authorize their Slack workspace, so you can quickly route messages to channels or DMs.

    Flexible delivery targets

    Create Channel Endpoints to define exactly where notifications should land:

    • Channels: Post to `#alerts`, `#engineering`, or any channel where your app has access
    • Direct messages: Send personal notifications to individual users
    • Webhooks: Use Slack incoming webhooks or Teams Workflows. They allow easy channel-only delivery without needing a full bot setup.
    // Create a Slack channel endpoint
    await novu.channelEndpoints.create({
      type: 'slack_channel',
      subscriberId: 'user-123',
      integrationIdentifier: 'slack',
      connectionIdentifier: 'conn_slack_acme',
      context: { tenant: 'acme' },
      endpoint: {
        channelId: 'C01234567'
      }
    });

    When you trigger a Workflow, Novu matches the subscriber and context to the right endpoints and delivers messages through the appropriate workspace connection.


    See the Slack integration guide and Microsoft Teams integration guide to get started.