n8n Slack Notifications: Alerts, Threads, and Approvals (2026)
Build Slack notification workflows in n8n — pick the right auth, avoid the token rotation trap, format readable alerts, and approve actions from inside Slack.
By Ali Ilyas · · Updated July 28, 2026
Sending a Slack message from n8n is a two-field node. The setup around it is where the decisions live, and two of them are hard to undo.
The first is your authentication method: n8n recommends OAuth2 for the Slack node, but OAuth2 does not work with the Slack Trigger. Pick it, then decide six weeks later that you want your workflow to react to Slack messages, and you're rebuilding your credential.
The second is worse. Slack offers token rotation, which sounds like straightforward good security hygiene. Enable it and your tokens expire every 12 hours — and you cannot turn it back off. The only remedy is creating a new Slack app from scratch.
Both are decided in the first five minutes, so this guide covers them before anything else. Then: sending notifications people can actually read, and the operation that turns alerts into approvals.
What's on this page
- What you'll need
- Choose your authentication method first
- Create the Slack app
- Do not enable token rotation
- Send your first notification
- Writing alerts people actually read
- Approvals: replying inside Slack
- Reacting to Slack events
- The one-request-URL problem
- Common errors and fixes
- Frequently asked questions
What you'll need
- A Slack workspace where you can install apps. This usually needs admin rights — installing to a workspace is an admin action, and it's the step that stalls people inside larger companies.
- A running n8n instance. Sending works from anywhere, including
localhost. The Slack Trigger needs a public HTTPS URL, because Slack delivers events to you — same constraint as the Telegram Trigger. If you're local, start with n8n in Docker; for the trigger you'll want a real domain with HTTPS.
Choose your authentication method first
n8n supports two ways to authenticate with Slack, and they are not interchangeable:
| API Access Token | OAuth2 | |
|---|---|---|
| Slack node | Works | Works (n8n's recommendation) |
| Slack Trigger | Required | Not supported |
| Setup | Paste a bot token | Client ID + secret + callback URL |
Read the middle row again, because it's the one that costs time. The Slack Trigger only accepts an API Access Token. If you set up OAuth2 because it's labelled as recommended, and later add a trigger, you'll be creating a second credential and reconnecting nodes.
My recommendation: use the API Access Token unless you have a specific reason not to. It's less setup, it works with every node including the trigger, and the "recommended" label on OAuth2 reflects general credential hygiene rather than anything about capability here.
That's the opposite of the advice for Google Sheets, where OAuth2 genuinely is the easier path. The right default is per-service, not universal.
Create the Slack app
Both methods start the same way, and n8n gives you a manifest to skip most of the clicking.
- Go to Slack's app directory and choose Create New App → From a manifest.
- Select your workspace.
- Replace the default manifest JSON with the one from n8n's Slack credentials documentation — it pre-fills every scope the node needs.
- Review and create.
Then install it:
- Open OAuth & Permissions.
- Select Install to Workspace and authorize.
- Copy the Bot User OAuth Token.
Paste that token into n8n's Slack credential as the Access Token. Done.
The manifest sets scopes including chat:write (send messages), channels:read and channels:history (see public channels), groups:*, im:* and mpim:* (private channels and DMs), files:read / files:write, reactions:*, and users:read. If you build the app by hand instead of from the manifest, missing scopes are the leading cause of the permission errors at the end of this guide.
Using OAuth2 instead? Copy the OAuth Callback URL from n8n, substitute it into the manifest where it says <your-oauth-callback-url>, install to the workspace, then paste the Client ID and Client Secret into n8n.
Do not enable token rotation
Slack's app settings offer token rotation. Leave it off.
With rotation enabled, your tokens expire every 12 hours. An n8n credential holding a static token stops working overnight, and the workflow fails at whatever hour the token lapsed — typically the morning after you set everything up and confirmed it worked.
The part that makes this worth a section rather than a footnote: once enabled, token rotation cannot be disabled. There is no toggle back. Recovering means creating a new Slack app, reinstalling it, and re-entering the new token everywhere you used the old one.
It's an easy switch to flip while exploring the settings page, and it's the only genuinely irreversible mistake available in this setup.
Send your first notification
Add a Slack node, set Resource to Message and Operation to Send.
Choose where it goes — a channel, or a user for a direct message — then write your text. Channels can be picked from a list, or specified by ID or URL when the destination is dynamic.
Then invite the bot to the channel. This is the step everyone skips. Your app is installed in the workspace, but that doesn't put it in any particular channel. Open the target channel and run:
/invite @your-bot-name
Without this you get not_in_channel, which reads like a scope problem and isn't one. Private channels always require the invite. Note also that a bot can post to a channel it was invited to even if a human would need to be a member — inviting the bot is about the bot, not about you.
For a first test, use a channel you own rather than #general. Slack workspaces often restrict posting there, and a permission error on your first run sends you debugging the wrong thing.
Writing alerts people actually read
A notification workflow that works is easy. One people don't mute takes a little more.
Send fewer, richer messages. The instinct is to fire a node per event. In a busy channel that's noise, and it also runs into Slack's rate limiting — chat.postMessage is throttled roughly to one message per second per channel. Aggregate with a Loop Over Items or Code node and post one summary.
Thread follow-ups instead of stacking messages. The Get permalink operation retrieves a message's link, and replying in-thread keeps a multi-stage workflow — started, progressing, finished — as one collapsed conversation rather than three separate interruptions.
Put the important part in the first line. Slack truncates in previews and notifications, so Deploy failed: payments-api is read on a lock screen; Workflow execution completed with status is not.
Use blocks for structure, but keep a text fallback. Block Kit gives you sections, dividers, and buttons. The catch is that blocks don't render everywhere — notifications and some clients fall back to plain text. Always set the plain-text field too, or those surfaces show an empty message.
Reserve @channel. Automated mentions that wake everyone are the fastest route to a muted channel, which defeats the point of the alert.
Approvals: replying inside Slack
The most useful operation on this node isn't Send — it's Send and Wait for Response, and most Slack automation guides never mention it.
It posts a message and then pauses the workflow until someone responds. The workflow resumes the moment they do. That turns Slack from a notification target into a control surface: expense over a threshold, content ready to publish, a deploy waiting on sign-off — all approved from a phone, without opening n8n.
Set Response Type to:
- Approval — interactive buttons rendered natively in Slack. The approver taps and never leaves the app.
- Free Text — collects typed input.
- Custom Form — a structured form. Free Text and Custom Form use link buttons that open a page, so only Approval is fully in-Slack.
Under Advanced Interactivity:
- Capture Who Responded — enables the interactive buttons and records the responder's ID, name, username, email, channel, and message ID. Enable it: an approval you can't attribute isn't much of an approval.
- Restrict Who Can Approve — limits which users count. Without it, anyone in the channel can approve.
- Unauthorized Reply — what someone sees when they try anyway.
- After Decision — how the original message is updated once resolved, so the channel doesn't keep a live-looking button on a settled request.
This same operation is what makes human-in-the-loop AI agents practical: the agent proposes, a person approves in Slack, the workflow proceeds.
Reacting to Slack events
The Slack Trigger starts a workflow from Slack activity. Available events:
Any Event, App Home Opened, Bot / App Mention, File Made Public, File Shared, New Message Posted to Channel, New Public Channel Created, New User, and Reaction Added.
Key settings:
Watch Whole Workspace — off by default, which is the right default. On, you receive events from every channel; in an active workspace that's a lot of executions for very little signal. Leave it off and set Channel to Watch.
Resolve IDs — off by default. Slack sends raw IDs like U01ABCDEF, not names. Turn this on and n8n resolves them, saving you lookup nodes.
Emoji Names to Filter — restricts Reaction Added to specific emoji. Note the format: comma-separated and not colon-separated. white_check_mark, eyes works; :white_check_mark: doesn't.
Usernames or IDs to ignore — worth setting to your own bot, so its messages don't retrigger the workflow.
The trigger needs Event Subscriptions enabled in the Slack app, with n8n's webhook URL as the Request URL. Add the Signing Secret from Basic Information to your n8n credential so incoming requests are verified as genuinely from Slack — a public webhook without signature verification will accept anything that finds the URL.
The one-request-URL problem
Slack allows one request URL per app. n8n uses a test URL while you're executing from the editor and a production URL once the workflow is active, so the two can't coexist.
If that sounds familiar, it's the same class of problem as Telegram's one-webhook-per-bot rule, and it produces the same symptom: the workflow behaves in one mode and goes silent in the other, with no error to explain it.
Same fix, too. Create a second Slack app for development, with its own credential, and point your test workflow at it. Swapping the request URL back and forth by hand works but means your live automation is down whenever you're building.
Common errors and fixes
not_in_channel
The bot isn't in that channel. Run /invite @your-bot-name there. Installing the app to the workspace is not the same as joining a channel.
missing_scope
The token lacks a permission. The response names the scope it wanted. Add it under OAuth & Permissions, then reinstall the app — scope changes only take effect on reinstall, which is the half people miss.
channel_not_found
Either the ID is wrong, or it's a private channel the bot hasn't been invited to. Private channels are invisible to an app that isn't a member, so "not found" here often means "not allowed".
invalid_auth or token_revoked after it worked fine
Token rotation is enabled and the token expired. Check your app settings. If rotation is on, you need a new app.
ratelimited
Too many calls. chat.postMessage allows roughly one per second per channel. Batch your messages instead of one node run per item.
invalid_blocks
Malformed Block Kit JSON. Paste it into Slack's Block Kit Builder to find the problem — the API error rarely points at the right element.
The trigger fires but every field is an ID. Turn on Resolve IDs in the trigger options.
The trigger works in the editor but not when active, or the reverse. The single request URL. See above.
Frequently asked questions
Do I need a paid Slack plan? No. Apps and bots work on the free plan. Free workspaces limit message history, which affects reading old messages, not sending new ones.
Can I send to a direct message instead of a channel? Yes — set the destination to a user. The DM comes from your bot, and the user must be able to receive messages from apps.
Why does my message look fine in the channel but empty in the notification? You sent blocks with no plain-text fallback. Notifications render the text field.
Can several workflows use one Slack app? For sending, yes — unlimited. For triggers, no: one request URL per app. Route events into a single trigger and branch, or use separate apps.
How do I log Slack messages to a spreadsheet? Chain a Google Sheets node onto the Slack Trigger and append a row per message. The append and upsert patterns are in the Google Sheets guide.
Slack or Telegram for alerts? Slack if the alerts are for a team that already lives there, and especially if you want approvals — the in-Slack buttons have no clean Telegram equivalent. Telegram if it's personal alerts or an external audience, since it needs no workspace and no admin to install anything.
Official references worth bookmarking: n8n's Slack node documentation and Slack's Block Kit reference for designing message layouts.
Want it prebuilt? Importable Slack workflows — error alerts, daily digests, and an approval flow — are on our templates page. Need the public HTTPS URL the trigger depends on? That's the self-hosting guide, or n8n in Docker if you're starting fresh.