Skip to main content

Slack integration

Post and manage Slack messages, work with channels and users, and start workflows from Slack events.

What it does

The Slack integration connects a Slack workspace so your workflows can post channel messages and direct messages, create and manage channels, look up users by email, upload and manage files, add reactions and pins, manage user groups, set status, and start a run when Slack delivers an event. Connect a workspace once and reuse the connection across any workflow.

Slack is in beta

Every Slack action and the Slack trigger are marked beta. They work, but expect rough edges, and read the Known limitations before you build a production workflow on top of them.

Connect a Slack account

  1. Open Connections in your workspace

    Open your workspace in TaskJuice and go to Connections.

  2. Choose Slack and connect

    Choose Slack and click Connect. TaskJuice sends you to Slack to authorize the workspace.

  3. Authorize as the workspace owner

    Sign in to Slack as your client, or have them complete the authorization in their own workspace. Slack asks them to approve the permissions TaskJuice requests to post messages, read and manage channels, look up users, read files, and add reactions.

  4. Return to TaskJuice

    Slack returns you to the workspace with the connection ready to use in any workflow.

For the full connect flow, including how connections are scoped and reused, see Connect an account.

Add your signing secret for triggers

If you plan to start workflows from Slack events, you also need to paste your Slack signing secret into TaskJuice. TaskJuice verifies each incoming event with that secret so it only acts on deliveries that genuinely came from Slack.

Copy the value from your Slack app settings under Basic Information, Signing Secret, then paste it into the trigger configuration in TaskJuice. Deliveries with a timestamp older than 5 minutes are rejected.

Triggers

Slack has one trigger.

Trigger keyDisplay nameFires on
slack/event-callbackSlack EventAny event Slack delivers to the Events API endpoint: messages, mentions, channel changes, reactions, and so on

This is a single generic trigger that receives every event your Slack app subscribes to, in real time. There are no separate "new message" or "reaction added" triggers. To act on one specific event type, read event.type in the trigger output and route with a downstream Branch or Switch node.

Each delivery is one event, so every activation processes exactly one Slack event. There is no batched array to loop over.

Trigger output

The trigger output is the Slack Events API envelope. These top-level fields are always present.

FieldTypeDescription
team_idstringThe Slack workspace (team) ID the event came from
api_app_idstringThe Slack app ID that received the event
eventobjectThe event payload. Its shape varies by event type and contains nested type, event_ts, and user fields
event.typestringThe specific Slack event type, for example message, app_mention, or reaction_added
event.event_tsstringEvent timestamp in seconds.microseconds format
event.userstringThe Slack user ID that triggered the event, when applicable
typestringThe outer envelope type, always event_callback
event_idstringA unique delivery ID that is stable across Slack retries, useful for deduplication
event_timeintegerEpoch seconds for when Slack dispatched the event

Actions

Slack provides 53 actions across ten domains. All are HTTP-based and run on a connected Slack workspace. Channel, user, and user-group selectors are dropdowns backed by your live workspace; every dropdown also accepts an expression so you can compute the value from an upstream node.

Action shape confidence

A core subset is verified live against a connected Slack workspace: the OAuth connection, the channel, user, and user-group resource pickers, Get Channel (a read), and Send Message (a write) all returned ok: true. Every other action follows Slack's official Web API method docs and is documented-shape, pending live curl-confirmation against a connected workspace. Two sets stay pending to exercise end to end: the six user-group actions need a workspace that has user groups, and the user-token actions need a user-token connection (see Known limitations). Report any field-name mismatch you hit so the contract can be corrected.

Messaging

Action keyDisplay nameWhat it does
slack/send-messageSend MessagePosts a message to a channel
slack/send-direct-messageSend Direct MessagePosts a direct message to a user
slack/send-ephemeral-messageSend Ephemeral MessagePosts a message visible to only one user in a channel
slack/update-messageUpdate MessageEdits an existing message
slack/delete-messageDelete MessageDeletes a message
slack/schedule-messageSchedule MessageSchedules a message for a future time (post_at Unix timestamp)
slack/delete-scheduled-messageDelete Scheduled MessageCancels a scheduled message before it is sent
slack/get-message-permalinkGet Message PermalinkReturns a permalink URL for a message
slack/get-channel-historyGet Channel HistoryLists messages and events from a channel
slack/get-thread-repliesGet Thread RepliesLists replies in a thread

Channels

Action keyDisplay nameWhat it does
slack/list-channelsList ChannelsLists channels in the workspace
slack/create-channelCreate ChannelCreates a public or private channel
slack/get-channelGet ChannelReturns info about a channel
slack/archive-channelArchive ChannelArchives a channel
slack/unarchive-channelUnarchive ChannelReactivates an archived channel
slack/set-channel-topicSet Channel TopicSets a channel's topic
slack/set-channel-purposeSet Channel PurposeSets a channel's purpose (description)
slack/rename-channelRename ChannelRenames a channel
slack/join-channelJoin ChannelAdds the connected bot to a public channel
slack/leave-channelLeave ChannelRemoves the connected bot from a channel
slack/invite-to-channelInvite to ChannelInvites users to a channel
slack/remove-user-from-channelRemove User from ChannelRemoves (kicks) a user from a channel
slack/list-channel-membersList Channel MembersLists the members of a channel

Users

Action keyDisplay nameWhat it does
slack/list-usersList UsersLists users in the workspace
slack/get-userGet UserReturns info about a user
slack/find-user-by-emailFind User by EmailLooks up a user by email address
slack/get-user-profileGet User ProfileReturns a user's profile fields
slack/list-user-conversationsList User's ChannelsLists the conversations a user belongs to
slack/get-user-presenceGet User PresenceReturns whether a user is active or away

Files

Action keyDisplay nameWhat it does
slack/get-upload-urlGet Upload URLStep 1 of the upload flow: reserves an upload URL and ID
slack/complete-uploadComplete UploadStep 3 of the upload flow: finalizes and shares files
slack/list-filesList FilesLists files, optionally filtered by channel or user
slack/delete-fileDelete FileDeletes a file
slack/get-file-infoGet File InfoReturns a file's metadata

Reactions and pins

Action keyDisplay nameWhat it does
slack/add-reactionAdd ReactionAdds an emoji reaction to a message
slack/remove-reactionRemove ReactionRemoves an emoji reaction
slack/get-reactionsGet ReactionsReturns the reactions on a message
slack/pin-messagePin MessagePins a message to a channel
slack/unpin-messageUnpin MessageRemoves a pinned message
slack/list-pinsList PinsLists the pinned items in a channel

User groups

Action keyDisplay nameWhat it does
slack/list-usergroupsList User GroupsLists the user groups in the workspace
slack/create-usergroupCreate User GroupCreates a user group
slack/update-usergroupUpdate User GroupUpdates a group's name, handle, or description
slack/update-usergroup-membersUpdate User Group MembersReplaces the users belonging to a group
slack/enable-usergroupEnable User GroupRe-enables a disabled user group
slack/disable-usergroupDisable User GroupDisables a user group

Status and presence

Action keyDisplay nameWhat it does
slack/set-user-statusSet User StatusSets the authenticated user's status text and emoji
slack/set-presenceSet PresenceSets the authenticated user's presence (auto/away)

Search and reminders

Action keyDisplay nameWhat it does
slack/search-messagesSearch MessagesSearches for messages matching a query
slack/search-filesSearch FilesSearches for files matching a query
slack/create-reminderCreate ReminderCreates a reminder
slack/list-remindersList RemindersLists the authenticated user's reminders
slack/delete-reminderDelete ReminderDeletes a reminder

Field notes

  • Channel, user, and user-group fields are dropdowns backed by your live workspace: pick a channel, user, or user group by name and TaskJuice sends the ID. Toggle the {} expression escape to compute the value from an upstream node instead. To post to a private channel that is not in the dropdown, switch the field to expression mode and supply the channel ID.
  • slack/send-direct-message: the recipient is a user picker. Slack posts to that user's direct-message channel.
  • slack/invite-to-channel and slack/update-usergroup-members: users is a comma-separated list of user IDs (a multi-value field), so it stays a text field. Wire it from an upstream node or type the IDs directly.
  • slack/add-reaction and slack/remove-reaction: name is an emoji name without colons, for example thumbsup or smile.
  • Message-timestamp fields are named ts (Update / Delete Message), timestamp (reactions, pins), message_ts (Get Message Permalink), or channel_ts (Get Thread Replies).
  • Uploading a file is a two-step flow: call Get Upload URL, PUT the file bytes to the returned upload_url with an HTTP node, then call Complete Upload with the files array. Slack retired the single-call files.upload method in March 2025.
Search, reminder, and status actions need a user-token connection

Search Messages, Search Files, Create Reminder, List Reminders, Delete Reminder, and Set User Status call Slack methods that reject a bot token (not_allowed_token_type). They require a user-token connection. Token injection for user-token methods is not yet wired, so treat these six as pending until a user-token connection is available.

Errors

Every Slack action and the channel dropdown map the provider's HTTP status to the same TaskJuice error codes. The default failure code is UPSTREAM_REQUEST_FAILED.

Provider HTTP statusError codeRetryableWhen you see it
401AUTH_EXPIREDNoThe connection's token is no longer valid. Reconnect the Slack account.
404NOT_FOUNDNoThe requested channel, user, or message does not exist. Returned by actions that read a single resource, such as Get Channel, Get User, Update Message, and Delete Message.
429RATE_LIMITEDYesSlack is throttling the request. TaskJuice retries it.
500PROVIDER_ERRORYesSlack returned a server error. TaskJuice retries it.
200 with ok: falsePROVIDER_REPORTED_ERRORNoSlack accepted the request but rejected it, for example not_in_channel or missing_scope. The error message carries Slack's own reason.
any other failureUPSTREAM_REQUEST_FAILEDNoAn unmapped failure from Slack.
Logical failures fail the step

Slack returns HTTP 200 even when a call fails logically, for example on a missing scope or an invalid channel. TaskJuice reads the ok field in Slack's response, so an ok: false reply fails the step with the PROVIDER_REPORTED_ERROR code and Slack's own reason, rather than recording a successful step you have to inspect by hand.

Known limitations

  • not_in_channel on posts. A bot can only post to, or read the history of, a channel it belongs to. If a Send Message or history action fails with not_in_channel, run Join Channel first (the bot must be in the channel), then retry. This is the single most common Slack automation failure.
  • ok: false fails the step. Slack returns HTTP 200 even when a call fails logically, for example on a missing scope or an invalid channel. TaskJuice reads the ok field rather than the HTTP status, so those replies fail the step with the PROVIDER_REPORTED_ERROR code and carry Slack's own reason (such as not_in_channel or missing_scope) in the error message. Handle them like any other step failure, with a per-node on-error policy or a downstream branch.
  • User-token methods. Search Messages, Search Files, Create Reminder, List Reminders, Delete Reminder, and Set User Status require a user-token connection. On a bot-token connection they return ok: false with not_allowed_token_type.
  • Tiered rate limits. Slack enforces its own per-method rate limits, grouped into tiers (roughly Tier 1 about 1 request/minute up to Tier 4 about 100+ requests/minute), plus a posting limit of about one message per second per channel. When Slack throttles a request it returns 429 with Retry-After, which TaskJuice classifies as a retryable RATE_LIMITED error and retries. These are Slack's limits, not TaskJuice's.
  • File upload is a two-step flow. There is no single upload action (Slack retired files.upload in March 2025). Use Get Upload URL, PUT the bytes to the returned URL with an HTTP node, then Complete Upload. TaskJuice does not download file contents; Get File Info returns metadata only.
  • Most action shapes are documented-shape. A core subset is verified live against a connected workspace: the OAuth connection, the channel, user, and user-group pickers, Get Channel, and Send Message all returned ok: true. Every other action follows Slack's official Web API method docs and is pending live curl-confirmation against a connected workspace.
  • One generic event trigger. The Slack Event trigger receives every event your Slack app is subscribed to. Narrow to a specific event by branching on event.type downstream. There are no per-event-type triggers yet.
  • Trigger signing. The trigger requires your Slack signing secret. TaskJuice rejects any delivery whose timestamp is older than 5 minutes.
Was this helpful?