n8n Slack Integration: Send Automated Notifications & Messages 2026

Slack is the communication hub for millions of teams worldwide, and connecting it to your n8n workflows unlocks a powerful layer of automation. Whether you need to send deployment alerts, daily digest reports, or build an interactive approval bot — the n8n Slack integration makes it straightforward once you understand the setup.

In this guide we cover everything from credentials configuration to advanced Block Kit messages, Slack triggers, and complete workflow patterns you can use today.

⚡ Speed tip

Don't want to build the workflow manually? Describe what you need in plain English at Scriflow and get a ready-to-import n8n JSON in seconds.

Setting Up Slack Credentials in n8n

Before sending any message you need a Slack App with the right OAuth scopes. Here's the minimal setup:

1. Create a Slack App

  1. Go to api.slack.com/apps and click Create New App → From Scratch.
  2. Give it a name (e.g. n8n Bot) and select your workspace.
  3. Under OAuth & Permissions → Scopes → Bot Token Scopes, add the permissions you need.
  4. Click Install to Workspace and authorize.
  5. Copy the Bot User OAuth Token (starts with xoxb-).

Required OAuth Scopes

chat:write
scope
Send messages as the bot to channels it's a member of.
channels:read
scope
List public channels to pick one by name or ID.
users:read
scope
Look up user info to send DMs by email.
reactions:write
scope
Add emoji reactions to messages programmatically.

2. Add Credentials in n8n

  1. In n8n, go to Credentials → New → Slack OAuth2 API.
  2. Paste your Bot User OAuth Token.
  3. Name it something recognizable (e.g. Slack – n8n Bot) and save.
💡 Tip

For production, create a dedicated Slack App per workspace to avoid accidentally posting to the wrong team. Store the token securely using n8n's built-in credential encryption.

Slack Node Overview

The n8n Slack node exposes all major Slack API endpoints as operations. The most commonly used ones are:

ResourceOperationWhat It Does
MessageSendPost a text or Block Kit message to a channel or user
MessageUpdateEdit a previously sent message by its ts timestamp
MessageDeleteRemove a message from a channel
MessageGet PermalinkGet a permanent link to any message
ChannelGet ManyList all channels in the workspace
UserGetFetch user info by ID or email
ReactionAddReact to a message with an emoji
FileUploadUpload and share files in channels

Sending Messages to Channels

The most fundamental operation is sending a message. Here's a minimal Slack node configuration:

// Slack node — Send Message operation Resource: Message Operation: Send Channel: #deployments // or channel ID: C0123456789 Text: "✅ Deploy successful: {{ $json.projectName }} v{{ $json.version }}"

You can reference any field from the incoming data using n8n expressions inside double curly braces. This makes messages dynamic and context-aware without any coding.

Sending Direct Messages to Users

To send a DM, first use the User → Get operation to fetch the user's Slack ID by their email, then use that ID as the channel:

// Step 1: Get User by email Resource: User Operation: Get User: "{{ $json.userEmail }}" // email from previous node // Step 2: Send DM using the user ID Resource: Message Operation: Send Channel: "{{ $('Get User').item.json.id }}" Text: "Hi! Your report is ready: {{ $json.reportUrl }}"

Using Block Kit for Rich Messages

Plain text messages work, but Block Kit is where Slack automation becomes visually impressive. Block Kit lets you build messages with sections, buttons, dividers, images, and interactive elements.

In the Slack node, enable JSON Parameters and switch to the Blocks field to provide a Block Kit JSON array:

[ { "type": "header", "text": { "type": "plain_text", "text": "🚨 Alert: High CPU Usage Detected" } }, { "type": "section", "fields": [ { "type": "mrkdwn", "text": "*Server:*\n{{ $json.serverName }}" }, { "type": "mrkdwn", "text": "*CPU:*\n{{ $json.cpuPercent }}%" }, { "type": "mrkdwn", "text": "*Time:*\n{{ $now.toISO() }}" } ] }, { "type": "actions", "elements": [ { "type": "button", "text": { "type": "plain_text", "text": "View Dashboard" }, "url": "{{ $json.dashboardUrl }}", "style": "danger" } ] } ]
💡 Tip

Use the official Slack Block Kit Builder to visually design your message layout, then paste the JSON directly into n8n's Blocks field.

Slack Triggers in n8n

Beyond sending messages, n8n can listen to Slack events and react to them. The Slack Trigger node connects to the Slack Events API via webhooks.

Setting Up the Slack Trigger

  1. Add a Slack Trigger node to your workflow.
  2. Copy the Webhook URL generated by n8n.
  3. In your Slack App settings, go to Event Subscriptions, enable it, and paste the URL.
  4. Subscribe to the events you need (e.g. message.channels, reaction_added).
  5. Reinstall the app to your workspace after adding new event subscriptions.

Available Trigger Events

EventFires WhenUse Case
messageAny message posted to a channelCommands, Q&A bots
reaction_addedSomeone reacts to a messageApproval workflows via emoji
app_mentionBot is @mentionedInteractive chatbot
channel_createdA new channel is createdAuto-invite members, set topic
member_joined_channelSomeone joins a channelWelcome message automation

Building a Monitoring Alert System

One of the most popular use cases for n8n + Slack is operational monitoring. Here's a complete workflow pattern for sending server health alerts:

Workflow: CPU / Memory Alert → Slack

  1. Schedule Trigger — runs every 5 minutes.
  2. HTTP Request — calls your monitoring API (e.g. Prometheus, Datadog, or a custom endpoint) to fetch current metrics.
  3. IF Node — checks if CPU > 80% or memory > 90%.
  4. Slack Node (true branch) — sends a Block Kit alert to #ops-alerts.
  5. Slack Node (false branch, optional) — updates a status message to "All systems normal".
// IF node condition example {{ $json.cpu_percent }} > 80 OR {{ $json.memory_percent }} > 90

Common Workflow Patterns

Pattern 1: Error Notifications

Wrap any workflow's error path with a Slack notification so you're always aware of failures. Use n8n's Error Workflow setting (in workflow settings) to route all errors to a dedicated error-handling workflow that sends a Slack DM to the on-call engineer.

// Error workflow Slack message Text: "❌ *Workflow failed*: {{ $workflow.name }}\nError: {{ $json.message }}\nNode: {{ $json.node }}" Channel: "@oncall-engineer"

Pattern 2: Daily Reports

Use a Schedule Trigger set to run every morning at 9 AM, query your database or analytics tool, aggregate the data with a Code node, and post a formatted summary to a #daily-metrics channel.

Pattern 3: Approval Workflows

When an action requires human approval (e.g. a large refund request or a production deployment), post a Block Kit message with Approve and Reject buttons to Slack. Use n8n's Wait node to pause execution until a webhook callback is received when the button is clicked.

  1. Trigger event arrives (e.g. refund request from Stripe webhook).
  2. Slack node sends a message with interactive buttons to #approvals.
  3. Wait node pauses the workflow (up to 24 hours).
  4. Manager clicks Approve/Reject in Slack → webhook received.
  5. Workflow resumes, processes the decision, and sends a confirmation.
🔑 Key insight

For interactive button callbacks to work, you need to configure an Interactivity & Shortcuts Request URL in your Slack App settings pointing to a separate n8n webhook workflow that receives the button action and triggers the main workflow's resume endpoint.

Tips & Best Practices

  • Rate limits: Slack allows ~1 message per second per channel. Use a Wait node or batch your messages if sending in bulk.
  • Thread replies: Use the thread_ts parameter to reply in threads and keep channels clean. Pass the original message's ts value.
  • Avoid message floods: Add an IF node to check whether an alert was already sent in the last N minutes before re-alerting.
  • Use channel IDs, not names: Channel names can change; IDs never do. Find the ID by right-clicking a channel in Slack → Copy Link.
  • Test with Bolt: During development, use Slack's Bolt framework playground or the Block Kit Builder to preview messages without sending real notifications.

Frequently Asked Questions

Can n8n send Slack messages to private channels?
Yes — the bot just needs to be invited to the private channel first. Run /invite @YourBotName in the channel, then use the channel ID in your n8n Slack node.
How do I send a Slack message to multiple channels?
Use a Split In Batches or Loop Over Items node before the Slack node to iterate over an array of channel IDs. Each iteration sends the message to one channel.
Can I schedule Slack messages for a future time?
Use the Slack API's chat.scheduleMessage endpoint via the HTTP Request node. The native Slack node doesn't expose this operation directly, but a raw POST to the API works perfectly.
What's the difference between using a Slack bot token and a user token?
Bot tokens (xoxb-) post as the bot identity — recommended for automation. User tokens (xoxp-) post as a real user but require user-level OAuth and are harder to manage. Always prefer bot tokens.
How can I generate this Slack workflow automatically?
Go to Scriflow, describe your workflow in plain English (e.g. "Send a Slack alert to #ops when a Stripe payment fails"), and get a ready-to-import n8n JSON file.