Connect Slack to Novu to send chat notifications through workflows using OAuth. Deliver messages to channels or DMs and manage subscriber Slack credentials.
This feature is currently in public beta, please contact us at support@novu.co to enable it for your organization.
The Slack chat integration lets your application send notifications directly to your subscribers’ Slack workspaces using their own Slack accounts and workspace permissions. With this integration, Novu can deliver messages to Slack channels, direct messages (DMs) to Slack users, and incoming webhooks. For incoming webhooks, Novu can use Slack’s native channel picker during OAuth.Novu handles the full lifecycle of Slack connections and message delivery. You define where notifications should be delivered, and Novu automatically routes each message to the correct Slack workspace, channel, or user.This guide walks you through setting up Slack chat, connect workspaces, and deliver notifications to the exact Slack destinations your users expect it.
Check out the agents documentation for more information on how to build agents using Slack.
Before integrating Slack chat with Novu, you must create and configure a Slack app. The Slack app manages the OAuth permissions, bot token scopes, and redirect URLs needed for Novu to connect to your users’ workspaces securely.
In Slack, click Create an App to start a new app registration.
3
Select From scratch
Choose From scratch and enter an app name and workspace.
4
Enter app name and workspace
Enter an app name of your choice in the App Name field.
Pick a Slack workspace to develop your app in.
5
Create the app
Click Create App. You’ll be directed to the Basic Application for the Slack app which contains the credentials you need for configuring Slack chat inside Novu:
Your app needs permission to perform actions like sending messages or reading channel lists.
1
Open OAuth & Permissions
In the sidebar, select OAuth & Permissions.
2
Open Scopes
Scroll down to the Scopes section.
3
Add an OAuth Scope
Under Bot Token Scopes, click Add an OAuth Scope.
4
Add recommended scopes
chat:write
chat:write.public
channels:read
groups:read
users:read
users:read.email
(optional) incoming-webhook if you want Slack’s built-in channel picker.
These scopes are required for Novu to send messages, read channels and read users (for DMs and pickers). If you remove some of them, then certain features like channel or user selection might not work.
In the Integration Store, click Connect provider to begin setup.
4
Select Slack
5
Fill in credentials
Fill in the required fields using the credentials from your Slack app:
Application Id: Paste your Slack app App ID.
Client ID: Paste your Slack App Client ID.
Client Secret: Paste your Slack App Client Secret.
Redirect URL (Optional): Enter the URL where you want users to be redirected to after they successfully connect their workspace. If there is no redirect URL, then Novu closes the tab immediately after the OAuth flow completes.
6
Create the integration
Click Create Integration to create the Slack integration. Once saved, Novu is able to:
Generate OAuth (Connect Slack) URLs for your users
Receive Slack’s OAuth callback.
Store workspace tokens as connections.
You are now ready to implement the frontend flow to let users connect their workspaces.
To send messages to Slack, your users must first authorize Novu to access one of their Slack workspaces. This authorization happens through Slack’s OAuth flow, which Novu generates and manages for you.
When a user clicks Connect Slack in your application, your backend should request a unique authorization URL from Novu.This URL is specific to the Subscriber or the Context (Tenant) it will be generated for.
The generated OAuth URL is valid for only 5 minutes. Do not cache this URL; generate it dynamically when the user initiates the flow.
Node.js
Python
Go
PHP
.NET
Java
cURL
import { Novu } from '@novu/api';const novu = new Novu({ secretKey: "<NOVU_SECRET_KEY>" });const response = await novu.integrations.generateChatOAuthUrl({ integrationIdentifier: 'slack', subscriberId: 'subscriberId', context: { "tenant": "orgId"},});
Your application can support multiple Slack workspace connections per user or per tenant by triggering separate OAuth flows.Novu allows one connection per (integration + subscriber + context). To connect multiple workspaces, provide different combinations of subscriber or context.
Once your backend returns the oauthUrl, open it in a new tab or window.
window.open(oauthUrl, '_blank');
Slack then guides the user through:
1
Review permissions
Reviewing your app’s requested permissions
2
Approve authorization
Approving the authorization
3
Redirect to Novu
Redirecting back to Novu’s callback URL
After the user approves access, Novu handles the rest of the OAuth flow automatically.
1
Novu exchanges the code
Novu stores the Slack access token for the connected workspace.
2
Novu creates a connection
Novu creates a Slack connection for that workspace, it is referenced by connectionIdentifier when creating endpoints.You can also provider a custom connectionIdentifier to the generateChatOAuthUrl() and then connection with such identifier will be created instead of randomly generated one.
Alternative: handle OAuth yourself. Instead of generateChatOAuthUrl(), you can run the Slack OAuth flow with your own app, use the access token with Slack’s APIs directly, then register the workspace with Novu via channelConnections.create (or POST /v1/channel-connections):
await novu.channelConnections.create({ integrationIdentifier: 'slack', subscriberId: 'user-123', // provide subscriberId, context, or both — at least one is required context: { tenant: 'acme' }, // scope to a tenant (required when subscriberId is omitted) workspace: { id: authData.team.id, // Slack workspace ID from OAuth name: authData.team.name, }, auth: { accessToken: authData.access_token, },});
Provide at least one of subscriberId or context — same as the Novu-managed OAuth flow.
After a workspace is connected, you or users decide where in Slack to send the messages. This can either be a Slack channel, to a user or an incoming webhook URLs. After the delivery location has been selected, a Slack endpoint is then created for that location.
Slack channel
Slack user
Incoming webhook
This is the typical flow for sending notifications to public or private channels.
1
Get the channel ID
curl -X GET "https://slack.com/api/conversations.list" \ -H "Authorization: Bearer <YOUR_BOT_TOKEN>"
To learn more about using Slack conversations API to either get public or private channels, refer Slack documentation.
2
Create the endpoint
Node.js
Python
Go
PHP
.NET
Java
cURL
import { Novu } from '@novu/api';const novu = new Novu({ secretKey: "<NOVU_SECRET_KEY>" });await novu.channelEndpoints.create({ subscriberId: 'user-123', integrationIdentifier: 'slack', connectionIdentifier: 'conn_slack_acme', context: { tenant: 'acme' }, type: 'slack_channel', endpoint: { channelId: 'C012345' },});
Use this to send personal messages and notifications directly to a specific user.
1
Get the Slack user ID
curl -X GET "https://slack.com/api/users.list" \ -H "Authorization: Bearer <YOUR_BOT_TOKEN>"
For example, you can look up a Slack user ID by their email address, if you requested the users:read.email scope.To learn more about using Slack users.list method, refer Slack documentation.
2
Create the endpoint
Node.js
Python
Go
PHP
.NET
Java
cURL
import { Novu } from '@novu/api';const novu = new Novu({ secretKey: "<NOVU_SECRET_KEY>" });await novu.channelEndpoints.create({ type: 'slack_user', subscriberId: 'user-123', integrationIdentifier: 'slack', connectionIdentifier: 'conn_slack_acme', context: { tenant: 'acme' }, endpoint: { userId: 'U01234567' },});
If incoming-webhook scope was included when configuring the OAuth and permissions scopes in Step 1.1. Slack would show its own channel picker during the OAuth flow:
1
User selects a channel
The subscriber picks a Slack channel where notifications should be delivered.
2
Slack returns webhook URL
3
Novu creates webhook endpoint
Novu automatically creates a webhook endpoint for that subscriber using that URL.
You don’t need to collect channelId yourself in this mode, Slack’s native channel picker handles it.
Slack is a supported agent provider. Connect your Slack app to an agent so users can message in channels or DMs and get replies in the same thread — without building Slack event handling yourself.
Build agents on Slack
Learn how Novu agents work, including managed and custom code agents.
The user messages your Slack app and your agent replies in the same thread.
Workflow notification
You trigger a workflow with a Chat step and Novu sends a one-way message to the subscriber’s linked Slack destination.
Both can use the same Slack integration. Your agent handles back-and-forth conversations while workflows send updates such as deploy alerts to the same workspace.