- Documentation
- Integrations
- Apps
- Slack integration
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.
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
Open Connections in your workspace
Open your workspace in TaskJuice and go to Connections.
Choose Slack and connect
Choose Slack and click Connect. TaskJuice sends you to Slack to authorize the workspace.
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.
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 key | Display name | Fires on |
|---|---|---|
slack/event-callback | Slack Event | Any 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.
| Field | Type | Description |
|---|---|---|
team_id | string | The Slack workspace (team) ID the event came from |
api_app_id | string | The Slack app ID that received the event |
event | object | The event payload. Its shape varies by event type and contains nested type, event_ts, and user fields |
event.type | string | The specific Slack event type, for example message, app_mention, or reaction_added |
event.event_ts | string | Event timestamp in seconds.microseconds format |
event.user | string | The Slack user ID that triggered the event, when applicable |
type | string | The outer envelope type, always event_callback |
event_id | string | A unique delivery ID that is stable across Slack retries, useful for deduplication |
event_time | integer | Epoch 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.
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 key | Display name | What it does |
|---|---|---|
slack/send-message | Send Message | Posts a message to a channel |
slack/send-direct-message | Send Direct Message | Posts a direct message to a user |
slack/send-ephemeral-message | Send Ephemeral Message | Posts a message visible to only one user in a channel |
slack/update-message | Update Message | Edits an existing message |
slack/delete-message | Delete Message | Deletes a message |
slack/schedule-message | Schedule Message | Schedules a message for a future time (post_at Unix timestamp) |
slack/delete-scheduled-message | Delete Scheduled Message | Cancels a scheduled message before it is sent |
slack/get-message-permalink | Get Message Permalink | Returns a permalink URL for a message |
slack/get-channel-history | Get Channel History | Lists messages and events from a channel |
slack/get-thread-replies | Get Thread Replies | Lists replies in a thread |
Channels
| Action key | Display name | What it does |
|---|---|---|
slack/list-channels | List Channels | Lists channels in the workspace |
slack/create-channel | Create Channel | Creates a public or private channel |
slack/get-channel | Get Channel | Returns info about a channel |
slack/archive-channel | Archive Channel | Archives a channel |
slack/unarchive-channel | Unarchive Channel | Reactivates an archived channel |
slack/set-channel-topic | Set Channel Topic | Sets a channel's topic |
slack/set-channel-purpose | Set Channel Purpose | Sets a channel's purpose (description) |
slack/rename-channel | Rename Channel | Renames a channel |
slack/join-channel | Join Channel | Adds the connected bot to a public channel |
slack/leave-channel | Leave Channel | Removes the connected bot from a channel |
slack/invite-to-channel | Invite to Channel | Invites users to a channel |
slack/remove-user-from-channel | Remove User from Channel | Removes (kicks) a user from a channel |
slack/list-channel-members | List Channel Members | Lists the members of a channel |
Users
| Action key | Display name | What it does |
|---|---|---|
slack/list-users | List Users | Lists users in the workspace |
slack/get-user | Get User | Returns info about a user |
slack/find-user-by-email | Find User by Email | Looks up a user by email address |
slack/get-user-profile | Get User Profile | Returns a user's profile fields |
slack/list-user-conversations | List User's Channels | Lists the conversations a user belongs to |
slack/get-user-presence | Get User Presence | Returns whether a user is active or away |
Files
| Action key | Display name | What it does |
|---|---|---|
slack/get-upload-url | Get Upload URL | Step 1 of the upload flow: reserves an upload URL and ID |
slack/complete-upload | Complete Upload | Step 3 of the upload flow: finalizes and shares files |
slack/list-files | List Files | Lists files, optionally filtered by channel or user |
slack/delete-file | Delete File | Deletes a file |
slack/get-file-info | Get File Info | Returns a file's metadata |
Reactions and pins
| Action key | Display name | What it does |
|---|---|---|
slack/add-reaction | Add Reaction | Adds an emoji reaction to a message |
slack/remove-reaction | Remove Reaction | Removes an emoji reaction |
slack/get-reactions | Get Reactions | Returns the reactions on a message |
slack/pin-message | Pin Message | Pins a message to a channel |
slack/unpin-message | Unpin Message | Removes a pinned message |
slack/list-pins | List Pins | Lists the pinned items in a channel |
User groups
| Action key | Display name | What it does |
|---|---|---|
slack/list-usergroups | List User Groups | Lists the user groups in the workspace |
slack/create-usergroup | Create User Group | Creates a user group |
slack/update-usergroup | Update User Group | Updates a group's name, handle, or description |
slack/update-usergroup-members | Update User Group Members | Replaces the users belonging to a group |
slack/enable-usergroup | Enable User Group | Re-enables a disabled user group |
slack/disable-usergroup | Disable User Group | Disables a user group |
Status and presence
| Action key | Display name | What it does |
|---|---|---|
slack/set-user-status | Set User Status | Sets the authenticated user's status text and emoji |
slack/set-presence | Set Presence | Sets the authenticated user's presence (auto/away) |
Search and reminders
| Action key | Display name | What it does |
|---|---|---|
slack/search-messages | Search Messages | Searches for messages matching a query |
slack/search-files | Search Files | Searches for files matching a query |
slack/create-reminder | Create Reminder | Creates a reminder |
slack/list-reminders | List Reminders | Lists the authenticated user's reminders |
slack/delete-reminder | Delete Reminder | Deletes 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-channelandslack/update-usergroup-members:usersis 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-reactionandslack/remove-reaction:nameis an emoji name without colons, for examplethumbsuporsmile.- Message-timestamp fields are named
ts(Update / Delete Message),timestamp(reactions, pins),message_ts(Get Message Permalink), orchannel_ts(Get Thread Replies). - Uploading a file is a two-step flow: call Get Upload URL, PUT the file bytes to the returned
upload_urlwith an HTTP node, then call Complete Upload with thefilesarray. Slack retired the single-callfiles.uploadmethod in March 2025.
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 status | Error code | Retryable | When you see it |
|---|---|---|---|
| 401 | AUTH_EXPIRED | No | The connection's token is no longer valid. Reconnect the Slack account. |
| 404 | NOT_FOUND | No | The 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. |
| 429 | RATE_LIMITED | Yes | Slack is throttling the request. TaskJuice retries it. |
| 500 | PROVIDER_ERROR | Yes | Slack returned a server error. TaskJuice retries it. |
200 with ok: false | PROVIDER_REPORTED_ERROR | No | Slack accepted the request but rejected it, for example not_in_channel or missing_scope. The error message carries Slack's own reason. |
| any other failure | UPSTREAM_REQUEST_FAILED | No | An unmapped failure from Slack. |
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_channelon 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 withnot_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: falsefails the step. Slack returns HTTP 200 even when a call fails logically, for example on a missing scope or an invalid channel. TaskJuice reads theokfield rather than the HTTP status, so those replies fail the step with thePROVIDER_REPORTED_ERRORcode and carry Slack's own reason (such asnot_in_channelormissing_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: falsewithnot_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
429withRetry-After, which TaskJuice classifies as a retryableRATE_LIMITEDerror 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.uploadin 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.typedownstream. 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.