Slack
Overview
Section titled “Overview”The Slack provider integrates your digital worker with Slack workspaces. It supports:
- Direct messages (DMs)
- Channel messages
- App mentions
- Interactive components (buttons, menus)
- Block Kit rich messaging
- Slash commands
- Thread replies
Prerequisites
Section titled “Prerequisites”- A Slack workspace
- Admin access to create a Slack app
-
Create a Slack configuration token pair
Go to api.slack.com/apps and create an app configuration token pair. Copy both values:
- Configuration access token (
xoxe.xoxp-...) - Configuration refresh token (
xoxe-1-...)
- Configuration access token (
-
Configure Provider
answers.json {"setup_answers": {"messaging-slack": {"slack_configuration_access_token": "xoxe.xoxp-xxx","slack_configuration_refresh_token": "xoxe-1-xxx"}}} -
Run setup
Terminal window gtc setup --answers answers.json ./my-bundle -
Click Add to Slack
Setup registers or updates the Slack app and exposes an Add to Slack action. Open the generated Slack authorization URL, choose the workspace, review the requested scopes, and approve the install.
When the OAuth redirect returns to setup, Greentic persists the Slack app id, client id, client secret, and runtime OAuth answers for the tenant. If the callback was not handled automatically, run
gtc setup --answers answers.json ./my-bundleagain after approving the install. -
Add the app in Slack
Open Slack and check that the app is installed in the workspace. For channel conversations, add the app to the channel where the worker should respond. You can do this from the channel’s integration settings or by mentioning/inviting the app in the channel.
-
Start or restart the runtime
Terminal window gtc start ./my-bundleStartup uses the stored
slack_app_idand configuration token pair to update the Slack app manifest with the current webhook URL. -
Test the channel
Send a direct message to the app or mention the app in the Slack channel you added it to. Channel events only arrive for channels where the app is a member and the installed scopes allow the event.
Configuration Options
Section titled “Configuration Options”| Option | Required | Description |
|---|---|---|
slack_configuration_access_token | Yes | Short-lived Slack configuration token used for app manifest updates |
slack_configuration_refresh_token | Yes | Refresh token used to rotate the configuration access token |
slack_app_id | Generated | Slack app id created or returned by setup |
slack_client_id | Generated | Slack OAuth client id returned by app registration |
client_secret | Generated secret | Slack OAuth client secret returned by app registration |
Network Access
Section titled “Network Access”Slack uses the Greentic runtime’s public HTTPS endpoint for all incoming callbacks. Expose the runtime through HTTPS on port 443; local development can use a tunnel that forwards the public URL to the local runtime port.
| Direction | Protocol and port | Purpose |
|---|---|---|
| Incoming | HTTPS 443 from Slack to Greentic | Events API callbacks, interactive component payloads, slash command payloads, and OAuth redirects |
| Outgoing | HTTPS 443 from Greentic to slack.com and api.slack.com | OAuth exchange, Web API sends, app registration, manifest updates, and configuration token rotation |
No Slack-specific TCP port needs to be opened on the Greentic host. The important inbound requirement is that Slack can reach the configured public base URL and the /v1/messaging/ingress/messaging-slack/{tenant}/{team} path over HTTPS.
Features
Section titled “Features”Text Messages
Section titled “Text Messages”- id: reply type: reply config: message: "Hello! How can I help you?"Markdown Formatting
Section titled “Markdown Formatting”Slack uses mrkdwn format:
- id: formatted type: reply config: message: | *Bold* _Italic_ `code` >Blockquote • Bullet pointBlock Kit Messages
Section titled “Block Kit Messages”Use Slack’s Block Kit for rich layouts:
- id: rich_message type: reply config: blocks: - type: section text: type: mrkdwn text: "*Welcome!*\nHow can I assist you today?" - type: divider - type: actions elements: - type: button text: type: plain_text text: "Get Help" action_id: "help_clicked" value: "help" - type: button text: type: plain_text text: "View Status" action_id: "status_clicked" value: "status"Interactive Buttons
Section titled “Interactive Buttons”- id: ask_action type: reply config: message: "What would you like to do?" blocks: - type: actions elements: - type: button text: type: plain_text text: "Create Ticket" style: primary action_id: "create_ticket" - type: button text: type: plain_text text: "Cancel" style: danger action_id: "cancel"Select Menus
Section titled “Select Menus”- id: select_option type: reply config: blocks: - type: section text: type: mrkdwn text: "Select a category:" accessory: type: static_select action_id: "category_select" options: - text: type: plain_text text: "Technical Support" value: "technical" - text: type: plain_text text: "Billing" value: "billing" - text: type: plain_text text: "General" value: "general"Thread Replies
Section titled “Thread Replies”Reply in a thread:
- id: thread_reply type: reply config: message: "This replies in the thread" thread_ts: "{{original_message.thread_ts}}"File Uploads
Section titled “File Uploads”Slack’s file APIs change over time. Use this only when the installed messaging-slack pack exposes file support for your version; otherwise send a link or use Slack’s current external upload flow.
- id: upload_file type: reply config: files: - url: "https://example.com/report.pdf" filename: "report.pdf" title: "Monthly Report"Ephemeral Messages
Section titled “Ephemeral Messages”Messages only visible to one user:
- id: ephemeral type: reply config: message: "Only you can see this" ephemeral: true user: "{{user_id}}"Handling Interactions
Section titled “Handling Interactions”Button Clicks
Section titled “Button Clicks”name: handle_interactionversion: "1.0"
nodes: - id: route_action type: branch config: conditions: - expression: "action_id == 'help_clicked'" to: show_help - expression: "action_id == 'create_ticket'" to: create_ticket default: unknown_action
- id: show_help type: reply config: message: "Here's how I can help..."
triggers: - type: block_action target: route_actionSelect Menu Changes
Section titled “Select Menu Changes”- id: handle_select type: branch config: conditions: - expression: "selected_value == 'technical'" to: technical_flow - expression: "selected_value == 'billing'" to: billing_flowSlash Commands
Section titled “Slash Commands”- Go to Slash Commands in your app settings
- Create a command (e.g.,
/support) - Set Request URL to your webhook
Handle in your flow:
name: slash_commandversion: "1.0"
nodes: - id: handle_command type: reply config: message: "Support bot at your service!" response_type: in_channel # or "ephemeral"
triggers: - type: slash_command command: "/support" target: handle_commandChannel Configuration
Section titled “Channel Configuration”Single Channel
Section titled “Single Channel”tenants: demo: teams: support: channels: slack: provider: messaging-slack config: channel_id: "C1234567890"Multiple Channels
Section titled “Multiple Channels”tenants: demo: teams: support: channels: slack-general: provider: messaging-slack config: channel_id: "C1234567890" slack-vip: provider: messaging-slack config: channel_id: "C0987654321"Troubleshooting
Section titled “Troubleshooting”App Not Receiving Messages
Section titled “App Not Receiving Messages”-
Verify Event Subscriptions:
- Check Request URL is correct
- Ensure events are enabled
- Verify bot is subscribed to correct events
-
Check Bot Permissions:
- Reinstall app after adding scopes
- Verify bot is in the channel
-
Test Webhook:
Terminal window curl https://your-domain.com/v1/messaging/ingress/messaging-slack/demo/default
“not_authed” Error
Section titled ““not_authed” Error”Your bot token is invalid or expired. Get a fresh token from OAuth & Permissions.
”channel_not_found” Error
Section titled “”channel_not_found” Error”- Verify channel ID is correct
- Ensure bot is added to the channel
- Check channel is not archived
Rate Limiting
Section titled “Rate Limiting”Slack rate limits vary by method. Handle gracefully:
- id: reply type: reply config: message: "Response" retry_on_rate_limit: true max_retries: 3Security
Section titled “Security”Greentic automatically validates:
- Request timestamp
- Signature using signing secret
- Token verification
Next Steps
Section titled “Next Steps”- Block Kit Builder - Design rich messages
- Teams Provider - Add Teams integration
- Flows Guide - Build complex workflows