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.

ℹToolkit mode is opt-in per node, and it is what makes this node show up in an AI Node's tool picker. A node left in Action mode is invisible to agents.

Operations

The Operation dropdown decides what the node does and which fields appear under it. These are the exact values the API validates against:

ValueIn the dropdownWhat it does
sendMessageSend messagePost a message to a channel, group, or DM.
updateMessageUpdate messageEdit a message the bot posted earlier.
deleteMessageDelete messageDelete a message the bot posted earlier.
sendEphemeralSend ephemeralPost a message visible only to a single user (the rest of the channel does not see it).
scheduleMessageSchedule messageSchedule a message to be posted at a future time.
getMessageGet messageFetch a single message by its timestamp.
listChannelsList channelsList public + private channels the bot can see in the workspace.
getChannelHistoryGet channel historyRead recent messages from a channel.
getThreadRepliesGet thread repliesFetch replies to a thread.
createChannelCreate channelCreate a new public or private channel.
inviteToChannelInvite to channelInvite one or more users to a channel.
addReactionAdd reactionAdd an emoji reaction to a message.
removeReactionRemove reactionRemove an emoji reaction from a message.
listUsersList usersList human members of the workspace (excludes deleted users + bots by default).
getUserInfoGet user infoFetch a user profile (name, email, timezone, status).
uploadFileUpload fileUpload a file (PDF, image, anything) and optionally share it in a channel.
updateProfileUpdate profileChange a member's names, title, phone or status. Empty user = the account that connected.
createUserCreate userCreate a member of the workspace.
updateUserUpdate userChange a member's username, names, email or title, or reactivate them.
deleteUserDelete userDeactivate 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 answers not_in_channel.
  • Create channel, Invite and user emails need newer permissions. HostWebhook asks for channels:manage, groups:write and users:read.email since 2026-10-03. A Slack credential connected before that gets missing_scope on 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 blocks array. 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 say hasMore when 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.
  • ts is the message id. Slack identifies messages by timestamp, so keep the ts a send returns if you plan to edit, delete or thread onto it.
  • Thread replies use threadTs, the parent's ts — not the reply's.
  • Blocks beat text. Passing blocks gives you the layout; text is still worth filling because it is what notifications show.