Insights & updates from our experts
Overview
The Slack connector integrates Xurrent iPaaS runbooks with a Slack workspace. It can send and manage messages, manage channels, look up users, upload files, and react to inbound Slack events (including interactive button clicks).
Status: The connector is published as Slack Connector - Alpha.
The connector calls the Slack Web API (https://slack.com/api/{method}) for its outbound actions and consumes the Slack Events API and interactive payloads for its inbound triggers.
It provides:
- Messaging — send, update, and delete messages; add emoji reactions.
- Interactions — receive button clicks and respond to them.
- Channels — list, get, create, and archive channels; invite and remove members.
- Users — list users, get a user, and look up a user by email.
- Files — upload a file and share it to a channel.
Prerequisites
To use this connector, you need:
- A Slack workspace with a Slack app configured.
- A Bot token (
xoxb-...) with the OAuth scopes required by the actions you use (see Authentication). - A Signing Secret (from your Slack app's Basic Information page) for verifying inbound webhook requests — required only if you use the triggers.
Authentication
The connector uses two separate connections.
Outbound (API calls)
Outbound actions authenticate with Bearer token authentication using a Slack Bot token.
| Field | Value |
|---|---|
| Bearer token | Your Slack Bot token (xoxb-...), stored as a secret. |
The required OAuth scopes depend on which actions you use:
| Action | Scope |
|---|---|
| Send / Update / Delete Message | chat:write |
| Add Reaction | reactions:write |
| List / Get / Create / Archive public channels | channels:read, channels:manage |
| List / Get / Create / Archive private channels | groups:read, groups:write |
List DMs (im types) |
im:read |
List group DMs (mpim types) |
mpim:read |
| Invite members (public channels) | channels:write.invites or channels:manage |
| Invite members (private channels) | groups:write.invites or groups:write |
| Remove members (public channels) | channels:manage |
| Remove members (private channels) | groups:write |
| List / Get Users | users:read |
| Find User by Email | users:read.email |
| Upload File | files:write |
Inbound (webhooks)
Inbound triggers authenticate each request with the app's Signing Secret.
| Field | Value |
|---|---|
| Signing Secret | Your Slack app's Signing Secret, stored as a secret. |
There is one Signing Secret per Slack app, so it is configured once on the inbound connection and shared by all Slack triggers.
Every inbound request is verified before any trigger parsing runs:
- The request signature is validated with HMAC-SHA256 request signing (
v0=scheme) using the Signing Secret. - The
X-Slack-Request-Timestampheader must be present and numeric. - Requests older than 5 minutes are rejected to prevent replay attacks; requests dated more than 60 seconds in the future are also rejected (allowing a small clock-skew tolerance).
- The
X-Slack-Signatureheader is compared to the computed signature using a constant-time comparison.
To send events, configure the Slack Events API Request URL to point at the Slack Events trigger endpoint. For button clicks, enable Interactivity in your Slack app and point the Request URL at the Button Click trigger endpoint.
Triggers
This connector provides two inbound triggers.
Slack Events
Receives events from the Slack Events API.
On first setup, Slack sends a url_verification request; the connector automatically answers it with the required challenge response, so no runbook action is needed. Only event_callback requests are processed further — any other request type is ignored.
Output
| Field | Type | Description |
|---|---|---|
type |
string | The outer event type (always event_callback for processed events). |
team_id |
string | The workspace (team) ID. Used as the job context identifier. |
api_app_id |
string | The Slack app ID. |
event_id |
string | Unique identifier for this event. |
event_time |
integer | Epoch time the event occurred. |
event |
object | The inner event payload (see below). |
event object
| Field | Type | Description |
|---|---|---|
type |
string | The inner event type (e.g., app_mention, message, reaction_added). |
channel |
string | Channel ID the event occurred in. |
user |
string | User ID that generated the event. |
text |
string | Message text, when applicable. |
ts |
string | Message timestamp. |
event_ts |
string | Event timestamp. |
channel_type |
string | Channel type (e.g., channel, im). |
Receiving events requires the corresponding Events API scopes on the bot token — typically app_mentions:read (for app_mention), channels:history (for message.channels), and reactions:read (for reaction_added / reaction_removed).
Button Click
Receives an interactive payload when a user clicks a button in a Slack message. Only block_actions interactions are processed; other interaction types are ignored.
Output
| Field | Type | Description |
|---|---|---|
type |
string | The interaction type (always block_actions for processed events). |
trigger_id |
string | Short-lived ID for opening modals in response. |
response_url |
string | URL to post a response to (use with the Respond to Button Click action). |
team |
object | id, domain. |
user |
object | id, username, name, team_id — the user who clicked. |
channel |
object | id, name. |
message |
object | type, text, ts — the message containing the button. |
actions |
array | One entry per clicked action: action_id, block_id, type, value, action_ts (strings) and text (object). |
Actions
Messaging
Send Message
Sends a message to a Slack channel using chat.postMessage.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
channel |
string | Yes | — | Channel ID (e.g., C1234567890). |
text |
string | Yes | — | Message text (supports Slack markdown). |
thread_ts |
string | No | — | Timestamp of the parent message to reply in a thread. |
Example Input
{
"channel": "C1234567890",
"text": "Deployment finished :white_check_mark:"
}
Output
ok (boolean), channel (string), ts (string), message (object).
Example Output
{
"ok": true,
"channel": "C1234567890",
"ts": "1700000000.000100",
"message": { "text": "Deployment finished :white_check_mark:", "type": "message" }
}
Update Message
Updates an existing message using chat.update.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
channel |
string | Yes | — | Channel ID containing the message. |
ts |
string | Yes | — | Timestamp of the message to update. |
text |
string | Yes | — | New message text. |
Output
ok (boolean), channel (string), ts (string), text (string), message (object).
Delete Message
Deletes a message using chat.delete.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
channel |
string | Yes | — | Channel ID containing the message. |
ts |
string | Yes | — | Timestamp of the message to delete. |
Output
ok (boolean), channel (string), ts (string).
Add Reaction
Adds an emoji reaction to a message using reactions.add.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
channel |
string | Yes | — | Channel ID where the message is located. |
timestamp |
string | Yes | — | Timestamp of the message to react to. |
name |
string | Yes | — | Emoji name without colons (e.g., thumbsup). |
Output
ok (boolean).
Interactions
Respond to Button Click
Responds to a Slack button click using the response_url from the Button Click trigger output. The request is posted directly to the Slack-provided URL and is validated to be a hooks.slack.com HTTPS URL.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
response_url |
string | Yes | — | The response_url from the Button Click trigger output. |
text |
string | Yes | — | Response message text (supports Slack markdown). |
replace_original |
boolean | No | true |
Whether to replace the original message. |
Output
ok (boolean).
Channels
List Channels
Lists channels in the workspace using conversations.list. This action is paginated (cursor-based) and returns one page per invocation; the connector tracks the cursor automatically.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
types |
string | No | public_channel |
Channel types: public_channel, private_channel, mpim, im (comma-separated). |
exclude_archived |
boolean | No | true |
Exclude archived channels. |
limit |
integer | No | 200 |
Channels per page (1–1000). |
Output
channels (array of channel objects) and has_next_page (boolean).
Channel object fields: id, name, is_channel, is_private, is_archived, num_members, creator, created.
Get Channel
Gets information about a channel using conversations.info.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
channel |
string | Yes | — | Channel ID (e.g., C1234567890). |
Output
id, name, is_channel, is_private, is_archived, num_members, topic (object), purpose (object), creator, created.
Create Channel
Creates a new channel using conversations.create.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | Yes | — | Channel name (lowercase, no spaces, max 80 chars). |
is_private |
boolean | No | false |
Whether to create a private channel. |
Output
id, name, is_channel, is_private, creator, created.
Archive Channel
Archives a channel using conversations.archive.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
channel |
string | Yes | — | Channel ID to archive. |
Output
ok (boolean).
Invite to Channel
Invites users to a channel using conversations.invite.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
channel |
string | Yes | — | Channel ID. |
users |
string | Yes | — | Comma-separated user IDs to invite (max 100 per call). |
Output
id (string), name (string) — the channel the users were invited to.
Remove from Channel
Removes a user from a channel using conversations.kick.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
channel |
string | Yes | — | Channel ID. |
user |
string | Yes | — | User ID to remove. |
Output
ok (boolean).
Users
List Users
Lists users in the workspace using users.list. This action is paginated (cursor-based) and returns one page per invocation; the connector tracks the cursor automatically.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
limit |
integer | No | 200 |
Users per page (1–1000). |
Output
members (array of user objects) and has_next_page (boolean).
User object fields: id, name, real_name, is_admin, is_bot, is_restricted, deleted, profile (object).
Get User
Gets information about a user using users.info.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
user |
string | Yes | — | User ID (e.g., U1234567890). |
Output
id, name, real_name, is_admin, is_bot, is_restricted, deleted, profile (object).
Find User by Email
Finds a user by email using users.lookupByEmail. This is the primary way runbooks map a Xurrent person (identified by email) to a Slack user ID.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
email |
string | Yes | — | Email address to look up. |
Output
id, name, real_name, is_admin, is_bot, deleted, profile (object).
Files
Upload File
Uploads a file and shares it to a channel using Slack's v2 upload flow (files.getUploadURLExternal → upload → files.completeUploadExternal).
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
channel_id |
string | Yes | — | Channel ID to share the file in. |
content |
binary | Yes | — | File content (text or binary bytes). |
filename |
string | Yes | — | Name of the file (e.g., report.txt). |
title |
string | No | filename | Title of the file. |
initial_comment |
string | No | — | Message text to accompany the file. |
Output
ok (boolean) and files (array of { id, title }).
Rate limiting
The connector includes built-in handling for Slack API rate limits: it automatically backs off and retries, respecting the Retry-After header returned by Slack.
| HTTP code | Scenario | Handling strategy |
|---|---|---|
| 429 | Rate limit exceeded | Retry with backoff (uses the Retry-After header). |
| 503 | Service unavailable | Retry with backoff. |
Slack rate limits are applied per API method, per workspace, per app. Design runbooks for roughly one request per second as a baseline. Note that chat.postMessage is additionally limited to about one message per second per channel.
Best Practices
- Resolve users by email. Use Find User by Email to map a Xurrent person to a Slack user ID rather than hard-coding IDs.
- Use channel IDs, not names. All channel parameters expect an ID (e.g.,
C1234567890), not a#channel-name. - Complete pagination. For List Channels and List Users, keep invoking the action while
has_next_pageistrue; do not infer completion from the number of results returned. - Request only the scopes you use. Grant the bot token only the scopes for the actions your runbooks actually call (see Authentication).
- Verify inbound requests. Configure the Signing Secret on the inbound connection so every event and interaction is signature-verified before processing.
- Keep messages within Slack limits. Message text has practical length limits; for large content, use Upload File instead.
Common Use Cases
- Notify on record change: Xurrent event → Send Message to a channel.
- Approvals in Slack: Send Message with a button → Button Click trigger → Respond to Button Click to confirm the choice.
- Targeted alerts: Find User by Email → Send Message to that user's ID.
- Provisioning: Create Channel → Invite to Channel → Send Message with onboarding info.
- Share reports: generate a file in a runbook → Upload File to a channel with an initial comment.
References
Slack API reference
Concepts
Setup






.webp)






.webp)
.webp)













