Slack Action
Posts and manages Slack from a flow. Sixteen operations across messages, channels, reactions, users and files — including the two that people usually reach for a bot to get: an ephemeral message only one person sees, and a message scheduled for later.
Setup
Pick a Slack credential — an OAuth connection or an incoming webhook. A webhook can post to the channel it was created for and nothing else, so choosing it narrows the operation list accordingly.
Mode — action or AI toolkit
The Mode selector decides who drives the node. In Action mode you pick one operation and fill its fields, and the node does that every time it runs. In AI toolkit mode the operations become tools an AI Node can call, and the model chooses which one and with what arguments.
Operations
The Operation dropdown decides what the node does and which fields appear under it. These are the exact values the API validates against:
| Value | In the dropdown | What it does |
|---|---|---|
| sendMessage | Send message | Post a message to a channel, group, or DM. |
| updateMessage | Update message | Edit a message the bot posted earlier. |
| deleteMessage | Delete message | Delete a message the bot posted earlier. |
| sendEphemeral | Send ephemeral | Post a message visible only to a single user (the rest of the channel does not see it). |
| scheduleMessage | Schedule message | Schedule a message to be posted at a future time. |
| getMessage | Get message | Fetch a single message by its timestamp. |
| listChannels | List channels | List public + private channels the bot can see in the workspace. |
| getChannelHistory | Get channel history | Read recent messages from a channel. |
| getThreadReplies | Get thread replies | Fetch replies to a thread. |
| createChannel | Create channel | Create a new public or private channel. |
| inviteToChannel | Invite to channel | Invite one or more users to a channel. |
| addReaction | Add reaction | Add an emoji reaction to a message. |
| removeReaction | Remove reaction | Remove an emoji reaction from a message. |
| listUsers | List users | List human members of the workspace (excludes deleted users + bots by default). |
| getUserInfo | Get user info | Fetch a user profile (name, email, timezone, status). |
| uploadFile | Upload file | Upload a file (PDF, image, anything) and optionally share it in a channel. |
| updateProfile | Update profile | Change a member's names, title, phone or status. Empty user = the account that connected. |
| createUser | Create user | Create a member of the workspace. |
| updateUser | Update user | Change a member's username, names, email or title, or reactivate them. |
| deleteUser | Delete user | Deactivate a member. Slack keeps the account; Update user can reactivate it. |
People are picked, not typed. Invite to channel lists the workspace's members by name — bots and deactivated accounts left out — and takes several at once. To take them from the flow, choose Type IDs or a template under the list.
Gotchas
- Posting works anywhere public; reading needs the bot inside. The bot can post to any public channel without joining. Reading a message, the history or a thread, reacting, and receiving trigger events need it in the channel: use Add bot next to the channel picker (public channels) or
/invite @HostWebhook(private ones). Otherwise Slack answersnot_in_channel. - Create channel, Invite and user emails need newer permissions. HostWebhook asks for
channels:manage,groups:writeandusers:read.emailsince 2026-10-03. A Slack credential connected before that getsmissing_scopeon those operations (and empty emails) until you reconnect it in Settings → Credentials. - Upload file takes a file of this run (its id, shown to an AI agent under "Files in this event", or
{{payload._file.downloadUrl}}), a public URL, or inline base64 — up to 50 MB. A file's link is signed again when the node runs, so it still works after a Delay or an approval. - Block Kit: paste the whole Block Kit Builder payload or just its
blocksarray. Templates inside blocks — including{{$resumeUrl("…")}}in a button — are filled in when the node runs. - Post at accepts a template, e.g. one hour from now:
{{$timestamp | divide(1000) | add(3600) | round}}(Unix seconds). - List channels / List users page through Slack up to
limit(200 by default, 1,000 at most) and sayhasMorewhen there are more. - Errors keep their meaning. A missing permission, a channel or message that does not exist, or a bad field fails with a 4xx and is not retried; Slack's rate limit (429) and outages (503) are.
- Managing users (Create, Update, Delete user and Update profile) needs a Slack credential connected with Manage users turned on, by a Slack Owner or Admin. Create, Update and Delete user need Slack Business+ or Enterprise; Delete user deactivates (Owners can't be deactivated).
- Editing and deleting only work on the bot's own messages.
tsis the message id. Slack identifies messages by timestamp, so keep thetsa send returns if you plan to edit, delete or thread onto it.- Thread replies use
threadTs, the parent'sts— not the reply's. - Blocks beat text. Passing
blocksgives you the layout;textis still worth filling because it is what notifications show.