# Slack

Post, schedule, update and search messages, manage channels, upload files, react, and look up users and user groups in Slack.

## Connect Slack

1. In the sidebar, open **Connections** and press **Add connection**.
2. Type `slack` and choose **Slack**.
3. Choose **Sign in with Slack**.
4. Press **Sign in with Slack** at the bottom of the sheet, then choose your account in Slack’s window and allow access.

Or choose **Paste your bot or user token**, paste it, and press **Test and save**. It stays until someone deletes it.

Sign in with Slack, or paste a token from your own Slack app (api.slack.com/apps → your app → OAuth & Permissions): the Bot User OAuth Token (xoxb-…) for most operations, or a User OAuth Token (xoxp-…) for searching messages, stars and setting a profile. Add the app to each private channel it should use. The app’s Signing Secret (Basic Information → App Credentials) is optional: steps do not use it.

**What if it says “Sign-in isn’t set up here yet”?**

Signing in with Slack needs a Slack app on this installation, and it has none yet. Until it is set up, **Paste your bot or user token** works without it.

**On Cloud:** The sheet says “It’s set up once for everyone who uses this service, not by an organization.”

**Self-hosted:** An admin of the installation sees **Set up Slack sign-in** instead, and sets it up once for everyone. Everyone else sees who to ask.

1. Create an app in Slack’s developer settings ([Slack’s guide](https://api.slack.com/apps)).
2. In GoRunner, copy the **Redirect address to add in Slack’s developer settings**, and add it to the app.
3. Paste the **Client ID** and **Client secret**, then press **Save and sign in**.

[Set up a sign-in app](https://docs.gorunner.io/self-host/oauth-apps#other-providers)

**Can I use my own Slack app?**

Yes. In the sheet, open **Use your own Slack app** and paste its **Client ID** and **Client secret**. Add the redirect address it shows to your app first. The connection then signs in through your app instead of the installation’s.

[Connections](https://docs.gorunner.io/build/connections) says how to sign in again, rename or delete it. In a product that embeds GoRunner, **Add connection** can be missing: then [your provider makes connections](https://docs.gorunner.io/embed/customer-connections) for you.

## Start a workflow

Add a trigger and choose **Slack**. The trigger uses the same connection as the steps.

### On Slack Event

Starts a run for each Slack event in the connection's workspace that you pick below (within seconds; nothing is polled). Signed in with Slack: nothing to set up, but the app only sees channels it was added to (invite it with /invite). With your own Slack app (a pasted token or your app's client ID): put the app's Signing Secret in the connection, publish, then paste the Request URL shown on this trigger into the app's Event Subscriptions once and subscribe it to the bot events you need (message.channels, message.im, app_mention, reaction_added …). Every delivery is checked against the Signing Secret and an unsigned or stale one is refused. A retried event starts no second run; messages from bots are ignored unless you turn that off.

- **Trigger On · Required**: Which events start a run. Your own Slack app must be subscribed to them as well; App mentioned needs the app_mentions:read permission. Options: Any event to Member's profile changed (18 options).
- **Only in Channel · Optional**: Start runs only for events in this channel. Empty: the whole workspace.
- **Ignore Bot Messages · Optional**: Skip messages sent by bots, this app's own included, so a reply cannot start the workflow again. On by default.
- **Ignore People · Optional**: User IDs (U…), separated by commas, whose events start nothing.

A later step can use its data, such as `{{trigger.channel}}`, `{{trigger.event_id}}`, `{{trigger.event_time}}` and 5 more. See [Use data from earlier steps](https://docs.gorunner.io/build/use-data-from-earlier-steps).

## Do things in Slack

Add a **Slack** step, choose a **Resource**, then an **Operation**. Choose a row to see its fields.

- [Message](https://docs.gorunner.io/apps/slack#fields-f-message): Send · Send and Wait for Approval · Update · Delete · Get Permalink · Search · Schedule · Get Many Scheduled · Delete Scheduled
- [Channel](https://docs.gorunner.io/apps/slack#fields-f-channel): Archive · Close · Create · Get · Get Many · History · Invite · Join · Kick · Leave · Get Members · Open · Rename · Replies · Set Purpose · Set Topic · Unarchive
- [File](https://docs.gorunner.io/apps/slack#fields-f-file): Upload · Get · Get Many
- [Reaction](https://docs.gorunner.io/apps/slack#fields-f-reaction): Add · Get · Remove
- [Star](https://docs.gorunner.io/apps/slack#fields-f-star): Add · Delete · Get Many
- [User](https://docs.gorunner.io/apps/slack#fields-f-user): Get · Get Many · Get Profile · Get Presence · Find by Email · Update Profile
- [User Group](https://docs.gorunner.io/apps/slack#fields-f-usergroup): Create · Disable · Enable · Get Many · Get Users · Update · Update Users

Later steps read a step’s output by its name: see [Use data from earlier steps](https://docs.gorunner.io/build/use-data-from-earlier-steps).

## Limits

- A reply from Slack can be up to 16 MB (a file download can have its own limit). A larger one fails the step; it is never cut short.
- When Slack says to slow down (429), the step waits as long as it asks, if the step’s time allows. Otherwise it fails and says when to try again.

Not in your list? See [When an app isn’t here](https://docs.gorunner.io/apps/when-an-app-isnt-here#q-not-in-list).

## For developers

In the API, which calls apps pieces, Slack is `pieceId: "slack"` with `actionId: "slack"`, set by `resource` and an `operation_…` field, such as `operation_channel`. Its trigger is `slacktrigger` / `slack_event`. [Get an app](https://docs.gorunner.io/api/apps/get-app) returns every field.

It can change something outside the run (`writes_external`). See [How versions and side effects work](https://docs.gorunner.io/apps#q-versions).

### Slack › Message

### Send

- **Send To · Optional**: A channel, or a person (the app's direct message with them). Options: Channel, User. Default: Channel.
- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link. Shows when **Send To** isn’t **User**.
- **User · Required**: The person. Pick one, or paste their user ID (U…). Shows when **Send To** is **User**.
- **Message Type · Optional**: Plain Slack text (mrkdwn), Markdown, Block Kit blocks, or legacy attachments. Options: Text, Markdown, Blocks, Attachments (legacy). Default: Text.
- **Text · Optional**: The message (Slack's mrkdwn, or Markdown when Message Type is Markdown). With blocks or attachments it is the notification text.
- **Attachments · Required**: Legacy attachments, such as [{"color": "#36a64f", "title": "Order #1042", "text": "Shipped"}]. Shows when **Message Type** is **Attachments (legacy)**.
- **Blocks · Required**: Block Kit blocks: a list, or what Block Kit Builder copies ({"blocks": [...]}), up to 50. For example, [{"type": "section", "text": {"type": "mrkdwn", "text": "*Order #1042* shipped"}}]. Shows when **Message Type** is **Blocks**.
- **Reply in Thread · Optional**: The ts (or link) of the thread's first message, to reply in its thread.
- **Also Send to Channel · Optional**: Show the thread reply in the channel too. Off by default.
- **Unfurl Links · Optional**: Show previews of links in the text (Slack's default: on for bots' text-only messages).
- **Unfurl Media · Optional**: Show previews of images and videos.
- **Link User Groups · Optional**: Turn @group names in the text into mentions. Off by default.
- **Send As (Name) · Optional**: Post under this name instead of the app's.
- **Icon Emoji · Optional**: Post with this emoji as the picture.
- **Icon URL · Optional**: Post with this image as the picture.
- **Only Visible To One Person · Optional**: Post in the channel so that only the person below sees it (it is not kept in history). Off by default. Shows when **Send To** isn’t **User**.
- **Visible To · Required**: The person. Pick one, or paste their user ID (U…). Shows when **Only Visible To One Person** is on.

### Send and Wait for Approval

- **Send To · Optional**: A channel, or a person (the app's direct message with them). Options: Channel, User. Default: Channel.
- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link. Shows when **Send To** isn’t **User**.
- **User · Required**: The person. Pick one, or paste their user ID (U…). Shows when **Send To** is **User**.
- **Message · Required**: What the person is asked to decide (Slack mrkdwn). Its first line is the title the run page shows.
- **Buttons · Optional**: Approve and Reject, or a single Approve button when the only useful answer is yes. Options: Approve and Reject, Approve only. Default: Approve and Reject.
- **Approve Button Label · Optional**: Default: Approve.
- **Reject Button Label · Optional**: Default: Reject. Shows when **Buttons** isn’t **Approve only**.
- **Auto-continue after (timeout) · Optional**: Resume automatically after this long if nobody answers (0 = wait indefinitely). Then status is "timed_out": branch on status == "approved". Default: 0.
- **Timeout Unit · Optional**: Options: Seconds, Minutes, Hours, Days. Default: Hours.
- **Public Base URL · Optional**: This installation's public address, for the buttons' links. Defaults to PUBLIC_API_URL. It must open for the person deciding: a link on localhost is one nobody can answer.
- **Reply in Thread · Optional**: The ts (or link) of the thread's first message, to reply in its thread.

### Update

- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link. Shows when **Send To** isn’t **User**.
- **Message · Required**: The message's ts (such as 1730450000.123456, from the step that posted it) or its link (⋯ → Copy link).
- **Message Type · Optional**: Plain Slack text (mrkdwn), Markdown, Block Kit blocks, or legacy attachments. Options: Text, Markdown, Blocks, Attachments (legacy). Default: Text.
- **Text · Optional**: The message (Slack's mrkdwn, or Markdown when Message Type is Markdown). With blocks or attachments it is the notification text.
- **Attachments · Required**: Legacy attachments, such as [{"color": "#36a64f", "title": "Order #1042", "text": "Shipped"}]. Shows when **Message Type** is **Attachments (legacy)**.
- **Blocks · Required**: Block Kit blocks: a list, or what Block Kit Builder copies ({"blocks": [...]}), up to 50. For example, [{"type": "section", "text": {"type": "mrkdwn", "text": "*Order #1042* shipped"}}]. Shows when **Message Type** is **Blocks**.
- **Also Send to Channel · Optional**: Show the thread reply in the channel too. Off by default.
- **Link User Groups · Optional**: Turn @group names in the text into mentions. Off by default.

### Delete and Get Permalink

- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link. Shows when **Send To** isn’t **User**.
- **Message · Required**: The message's ts (such as 1730450000.123456, from the step that posted it) or its link (⋯ → Copy link).

### Search

- **Search Query · Required**: What to find, with Slack's modifiers: in:#channel from:@person before:2026-11-01 has:link ….
- **Sort By · Optional**: Options: Best match, Time. Default: Best match.
- **Order · Optional**: Options: Newest or best first, Oldest or worst first. Default: Newest or best first.
- **Return All · Optional**: Read every message, page by page (at most 1000; past that the step fails rather than stop early). Off by default.
- **Limit · Optional**: How many messages to return (1–1000). Default: 50. Shows when **Return All** is off.

### Schedule

- **Send To · Optional**: A channel, or a person (the app's direct message with them). Options: Channel, User. Default: Channel.
- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link. Shows when **Send To** isn’t **User**.
- **User · Required**: The person. Pick one, or paste their user ID (U…). Shows when **Send To** is **User**.
- **Message Type · Optional**: Plain Slack text (mrkdwn), Markdown, Block Kit blocks, or legacy attachments. Options: Text, Markdown, Blocks, Attachments (legacy). Default: Text.
- **Text · Optional**: The message (Slack's mrkdwn, or Markdown when Message Type is Markdown). With blocks or attachments it is the notification text.
- **Attachments · Required**: Legacy attachments, such as [{"color": "#36a64f", "title": "Order #1042", "text": "Shipped"}]. Shows when **Message Type** is **Attachments (legacy)**.
- **Blocks · Required**: Block Kit blocks: a list, or what Block Kit Builder copies ({"blocks": [...]}), up to 50. For example, [{"type": "section", "text": {"type": "mrkdwn", "text": "*Order #1042* shipped"}}]. Shows when **Message Type** is **Blocks**.
- **Post At · Required**: When to post: an ISO 8601 date and time (2026-11-08T09:00:00Z) or Unix seconds, at most 120 days ahead.
- **Reply in Thread · Optional**: The ts (or link) of the thread's first message, to reply in its thread.
- **Also Send to Channel · Optional**: Show the thread reply in the channel too. Off by default.
- **Unfurl Links · Optional**: Show previews of links in the text (Slack's default: on for bots' text-only messages).
- **Unfurl Media · Optional**: Show previews of images and videos.
- **Link User Groups · Optional**: Turn @group names in the text into mentions. Off by default.

### Get Many Scheduled

- **Channel · Optional**: The channel. Pick one, or paste its ID (C…) or link.
- **Return All · Optional**: Read every message, page by page (at most 1000; past that the step fails rather than stop early). Off by default.
- **Limit · Optional**: How many messages to return (1–1000). Default: 50. Shows when **Return All** is off.

### Delete Scheduled

- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link. Shows when **Send To** isn’t **User**.
- **Scheduled Message ID · Required**: The scheduled_message_id the Schedule step returned.

### Slack › Channel

### Archive, Close, Get, Join, Leave and Unarchive

- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link.

### Create

- **Name · Required**: Up to 80 lowercase letters, digits, hyphens and underscores.
- **Visibility · Optional**: Options: Public, Private. Default: Public.

### Get Many

- **Types · Optional**: Which kinds of conversations to list. Options: Public channels, Private channels, Group messages, Direct messages.
- **Leave Out Archived · Optional**: On by default.
- **Return All · Optional**: Read every item, page by page (at most 1000; past that the step fails rather than stop early). Off by default.
- **Limit · Optional**: How many items to return (1–1000). Default: 100. Shows when **Return All** is off.

### History

- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link.
- **After · Optional**: Only messages after this ts (Unix seconds, such as 1730450000).
- **Before · Optional**: Only messages before this ts.
- **Include the Bounds · Optional**: Also return the messages at exactly After and Before. Off by default.
- **Return All · Optional**: Read every item, page by page (at most 1000; past that the step fails rather than stop early). Off by default.
- **Limit · Optional**: How many items to return (1–1000). Default: 100. Shows when **Return All** is off.

### Invite

- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link.
- **Users · Required**: User IDs (U…), separated by commas: up to 1,000 to invite; 1 to 8 for a direct or group message.

### Kick

- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link.
- **User · Required**: The person. Pick one, or paste their user ID (U…).

### Get Members

- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link.
- **Return All · Optional**: Read every item, page by page (at most 1000; past that the step fails rather than stop early). Off by default.
- **Limit · Optional**: How many items to return (1–1000). Default: 100. Shows when **Return All** is off.

### Open

- **Users · Required**: User IDs (U…), separated by commas: up to 1,000 to invite; 1 to 8 for a direct or group message.

### Rename

- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link.
- **Name · Required**: Up to 80 lowercase letters, digits, hyphens and underscores.

### Replies

- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link.
- **Thread · Required**: The message's ts (such as 1730450000.123456, from the step that posted it) or its link (⋯ → Copy link).
- **After · Optional**: Only messages after this ts (Unix seconds, such as 1730450000).
- **Before · Optional**: Only messages before this ts.
- **Include the Bounds · Optional**: Also return the messages at exactly After and Before. Off by default.
- **Return All · Optional**: Read every item, page by page (at most 1000; past that the step fails rather than stop early). Off by default.
- **Limit · Optional**: How many items to return (1–1000). Default: 100. Shows when **Return All** is off.

### Set Purpose

- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link.
- **Purpose · Required**: Up to 250 characters.

### Set Topic

- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link.
- **Topic · Required**: Up to 250 characters.

### Slack › File

### Upload

- **File · Required**: Upload a file, or switch to an expression to use one from an earlier step (such as {{steps.download.result}}). Up to 100 MB.
- **Channel · Optional**: Upload: the channel to share the file in (empty keeps it private to the app). Get Many: only files in this channel.
- **File Name · Optional**: Defaults to the file's own name.
- **Title · Optional**
- **Message · Optional**: Text posted with the file.
- **Reply in Thread · Optional**: The ts (or link) of a thread's first message, to share the file there.

### Get

- **File ID · Required**: The file's ID (F…).

### Get Many

- **Channel · Optional**: Upload: the channel to share the file in (empty keeps it private to the app). Get Many: only files in this channel.
- **Uploaded By · Optional**: The person. Pick one, or paste their user ID (U…).
- **Types · Optional**: Options: All, Posts, Snippets, Images, Google Docs, Zip files, PDFs. Default: All.
- **Return All · Optional**: Read every file, page by page (at most 1000; past that the step fails rather than stop early). Off by default.
- **Limit · Optional**: How many files to return (1–1000). Default: 50. Shows when **Return All** is off.

### Slack › Reaction

### Add and Remove

- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link.
- **Message · Required**: The message's ts (such as 1730450000.123456, from the step that posted it) or its link (⋯ → Copy link).
- **Emoji · Required**: The emoji's name, without colons (thumbsup, white_check_mark, or a custom emoji's name).

### Get

- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link.
- **Message · Required**: The message's ts (such as 1730450000.123456, from the step that posted it) or its link (⋯ → Copy link).

### Slack › Star

### Add and Delete

- **Item · Optional**: Options: Message, File, Channel. Default: Message.
- **Channel · Required**: The channel. Pick one, or paste its ID (C…) or link. Shows when **Item** isn’t **File**.
- **File ID · Required**: Shows when **Item** is **File**.
- **Message · Required**: The message's ts (such as 1730450000.123456, from the step that posted it) or its link (⋯ → Copy link). Shows when **Item** is **Message**.

### Get Many

- **Return All · Optional**: Read every star, page by page (at most 1000; past that the step fails rather than stop early). Off by default.
- **Limit · Optional**: How many stars to return (1–1000). Default: 50. Shows when **Return All** is off.

### Slack › User

### Get, Get Profile and Get Presence

- **User · Required**: The person. Pick one, or paste their user ID (U…).

### Get Many

- **Return All · Optional**: Read every user, page by page (at most 1000; past that the step fails rather than stop early). Off by default.
- **Limit · Optional**: How many users to return (1–1000). Default: 100. Shows when **Return All** is off.

### Find by Email

- **Email · Required**: The person's email address in Slack.

### Update Profile

- **User · Optional**: Empty: the person whose token the connection holds. Another person: only a workspace admin's token on a paid plan may.
- **First Name · Optional**
- **Last Name · Optional**
- **Display Name · Optional**
- **Status Text · Optional**: Up to 100 characters. Empty with an emoji below keeps only the emoji.
- **Status Emoji · Optional**: such as :palm_tree:.
- **Status Until · Optional**: When the status clears: ISO 8601 or Unix seconds. Empty: it stays.
- **Custom Fields · Optional**: The workspace's profile fields by id, such as {"Xf06054BBB": {"value": "Berlin", "alt": ""}}.

### Slack › User Group

### Create

- **Name · Optional**: Required to create.
- **Handle · Optional**: The @handle people mention, without the @.
- **Description · Optional**
- **Default Channels · Optional**: Channel IDs, separated by commas, that new members join.

### Disable and Enable

- **User Group · Required**: Pick a user group, or paste its ID (S…).

### Get Many

- **Include Members · Optional**: Off by default.
- **Include Disabled · Optional**: Off by default.
- **Return All · Optional**: Read every user group, page by page (at most 1000; past that the step fails rather than stop early). Off by default.
- **Limit · Optional**: How many user groups to return (1–1000). Default: 100. Shows when **Return All** is off.

### Get Users

- **User Group · Required**: Pick a user group, or paste its ID (S…).
- **Include Disabled · Optional**: Off by default.

### Update

- **User Group · Required**: Pick a user group, or paste its ID (S…).
- **Name · Optional**: Required to create.
- **Handle · Optional**: The @handle people mention, without the @.
- **Description · Optional**
- **Default Channels · Optional**: Channel IDs, separated by commas, that new members join.

### Update Users

- **User Group · Required**: Pick a user group, or paste its ID (S…).
- **Users · Required**: User IDs (U…), separated by commas.
- **Update · Optional**: Set the members to exactly these people, or add them to the members it has. Options: Set the members to these, Add these to the members. Default: Set the members to these.

Source: https://docs.gorunner.io/apps/slack
