Chaining

Connecting to Slack for Team Notifications

⏱ 14 min

The CRM and email steps from the last lesson handle the customer-facing side. This lesson adds the internal one: telling your own team, in Slack, that something happened. There are two real, standard ways to get a message into a Slack channel from an n8n workflow, and which one you reach for depends on how much Slack does beyond posting a message.

What you'll learn in this lesson
Two real integration paths
n8n's Slack node (OAuth, full API) versus a Slack Incoming Webhook URL (simpler, message-only).
Setting up the Slack node's credential and scopes
Why chat:write has to be added to your Slack app before the node will post anything.
Composing a message from earlier workflow data
Referencing fields from the CRM and order data already in the workflow.
When the simpler webhook path is the better choice
One-way notifications with no need to read channels, react, or manage users.
Prerequisites

A Slack workspace where you can create or configure an app. Either Slack app OAuth credentials (for the Slack node) or a channel with an Incoming Webhook enabled (for the simpler path). The workflow from Lesson 4, so there’s real order and CRM data to reference.

Step 1: Choose the Slack node or an Incoming Webhook

n8n’s Slack node covers a lot of ground: Channel (create, archive, invite, rename, and more), Message (send, update, delete, search, get permalink), File (upload, get), Reaction, Star, User, and User Group operations. If all you need is “post a message to a channel,” that’s more setup than the job requires, an OAuth app with the right scopes just to send text. A Slack Incoming Webhook is the lighter option: a single URL, generated once in Slack, that accepts a JSON POST and posts it to one fixed channel, no OAuth flow at all.

Which Slack path to use
NeedUse
Post a message to one known channelIncoming Webhook + HTTP Request node
Post to a channel chosen dynamically, react to messages, manage users/channelsSlack node with OAuth

Step 2: The simple path, an Incoming Webhook

In Slack, add the “Incoming Webhooks” feature to an app (or create a simple app for this purpose) and activate a webhook for the channel you want, like #sales-alerts. Slack gives you a URL that looks like https://hooks.slack.com/services/T000/B000/xxxxxxxx. Add an HTTP Request node to your n8n workflow, Method POST, that URL, JSON body:

// n8n HTTP Request node body (JSON)
{
  "text": "New high-value order #{{ $json.order_id }} from {{ $json.customer_name }}, ${{ $json.order_total }}. HubSpot deal created."
}

No credential setup at all, the URL itself is the secret, treat it the same way you’d treat an API key, don’t commit it to a public repo.

Step 3: The full path, the Slack node with OAuth

If you want richer behavior, like posting to a channel selected dynamically based on which team the order belongs to, add the Slack node instead. Its credential setup requires a Slack app with, at minimum, the chat:write scope added under OAuth & Permissions, then installed to your workspace. Set Resource to Message, Operation to Send, Channel to whichever channel field your workflow computes, and the message text the same way as the webhook example above.

// Slack node message text field
"New high-value order #{{ $json.order_id }} from {{ $json.customer_name }}, ${{ $json.order_total }}. HubSpot deal created."

Step 4: Place the Slack step correctly in the chain

Add this node after the CRM step from Lesson 4, not before it, so the Slack message can honestly say “HubSpot deal created” rather than announcing something that might still fail. If you want the team notified even when the CRM step fails, add a separate error branch (n8n’s “On Error” output from the CRM node) that posts a different, “CRM update failed for order #X” message instead, so failures get surfaced to the team rather than silently dropped.

Test it

Run the workflow with a qualifying test order and confirm the message lands in the right Slack channel, with the order ID, customer name, and total correctly interpolated. Then temporarily break the CRM step (an invalid credential works) and confirm your error branch, if you built one, posts a distinct failure message rather than nothing at all.

An Incoming Webhook URL is a bearer credential, not a password-protected endpoint

Anyone with the URL can post to that channel, there’s no username or token check beyond possessing the link itself. Store it as an n8n credential or environment variable rather than hardcoding it into the HTTP Request node’s URL field where it might get exported or shared along with the workflow JSON.

Recap

Slack notifications from an n8n workflow have two real paths: a lightweight Incoming Webhook posted to with a plain HTTP Request node, good for fixed-channel, message-only alerts, or the full Slack node with OAuth and chat:write, needed for dynamic channel selection or anything beyond posting text. Place the Slack step after the CRM enrichment so the message reflects real, completed state, and consider a separate error branch so failures get announced too, not just successes. The next lesson takes every pattern from this course and shows the equivalent nodes in Make and Zapier.

Resources & further reading

← Chaining WordPress Actions With CRMs and Email Doing the Same With Make and Zapier →