- 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 and manage messages, create and manage channels, look up users and files, add reactions, 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 16 actions. All are HTTP-based and run on a connected Slack workspace.
| Action key | Display name | What it does | Required inputs | Optional inputs and defaults |
|---|---|---|---|---|
slack/send-message | Send Message | Sends a message to a channel or DM | channelId, text | thread_ts to reply in a thread |
slack/list-channels | List Channels | Lists channels in the workspace | none | types (default public_channel), limit (default 200), exclude_archived (default true) |
slack/create-channel | Create Channel | Creates a public or private channel | name | is_private (default false) |
slack/get-channel | Get Channel | Returns info about a channel | channel | none |
slack/list-users | List Users | Lists users in the workspace | none | limit (default 200) |
slack/get-user | Get User | Returns info about a user | user | none |
slack/update-message | Update Message | Updates an existing message | channel, ts, text | none |
slack/delete-message | Delete Message | Deletes a message | channel, ts | none |
slack/add-reaction | Add Reaction | Adds an emoji reaction to a message | channel, timestamp, name | none |
slack/get-channel-history | Get Channel History | Lists messages and events from a channel | channel | limit (default 100), cursor for pagination |
slack/get-thread-replies | Get Thread Replies | Lists replies in a thread | channel, channel_ts | none |
slack/archive-channel | Archive Channel | Archives a channel | channel | none |
slack/invite-to-channel | Invite to Channel | Invites users to a channel | channel, users (comma-separated user IDs) | none |
slack/search-messages | Search Messages | Searches for messages matching a query | query | none |
slack/create-reminder | Create Reminder | Creates a reminder | text, time | none |
slack/get-file-info | Get File Info | Returns information about a file | file | none |
Field notes
slack/send-message:channelIdis a channel dropdown that lists public, non-archived channels in the workspace.textis a free-text field. To post to a private channel, type the channel ID directly instead of picking from the dropdown.slack/list-channels:typesaccepts a comma-separated list ofpublic_channel,private_channel,mpim,im.slack/add-reaction:nameis an emoji name without colons, for examplethumbsuporsmile.slack/add-reaction:timestampis the target message timestamp.slack/update-messageandslack/delete-messageusetsfor the same purpose, andslack/get-thread-repliesuseschannel_tsfor the parent message.- User-ID fields such as
user,users, andchannelare plain text. You enter the IDs directly; there is no user picker dropdown.
Get Channel History, Get Thread Replies, Search Messages, and Create Reminder need Slack permissions that the standard connect flow does not request. On a default connection they can fail with a missing-scope error from Slack. Search Messages and Create Reminder also require user-token permissions that a standard workspace install does not grant, so treat those two as the most likely to fail.
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. |
| 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 only maps the HTTP status, so these surface as a successful step with
ok: false in the output rather than as an error code. When an action seems to do nothing, check
the ok field in the action output.
Known limitations
- The Send Message channel dropdown lists public, non-archived channels only, up to 200. To post to a private channel, supply its channel ID directly in the
channelIdfield. - There is one generic event trigger. It 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. - The trigger requires your Slack signing secret. TaskJuice rejects any delivery whose timestamp is older than 5 minutes.
- Rate limits surface as retryable
RATE_LIMITEDerrors. Slack enforces its own per-method rate limits, including a posting limit of roughly one message per second per channel for sending messages. These are Slack's limits, not TaskJuice's. - Get Channel History, Get Thread Replies, Search Messages, and Create Reminder need Slack scopes the standard connection does not request, so they may return a missing-scope failure on a default connection.
- Get File Info returns a file's metadata only. There is no file upload action and no action that downloads file contents, and no standalone send-direct-message action. To send a DM, use Send Message with a direct-message channel ID.