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.
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.
| Need | Use |
|---|---|
| Post a message to one known channel | Incoming Webhook + HTTP Request node |
| Post to a channel chosen dynamically, react to messages, manage users/channels | Slack 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.
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
- n8n Slack node documentation, docs.n8n.io
- n8n HTTP Request node documentation, docs.n8n.io
- Slack Incoming Webhooks guide, api.slack.com