> ## Documentation Index
> Fetch the complete documentation index at: https://phidatainc-studio-tools-doc.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Connect to Slack

> Put Dash in your Slack as a teammate.

Dash answers data questions in Slack and posts results back into channels. Each thread becomes its own session so follow-ups carry forward, and the Leader can post insights and scheduled results to channels you wire up.

The full setup, including the Slack app manifest and the complete scope list, lives in the Dash repo: [SLACK\_CONNECT.md](https://github.com/agno-agi/dash/blob/main/docs/SLACK_CONNECT.md).

## Prerequisites

* Dash running locally ([setup](/tutorials/dash/setup)) or [deployed](/tutorials/dash/deploy-to-railway)
* A Slack workspace where you can install apps
* [ngrok](https://ngrok.com/download) (local development only)

## Step 1: Give Slack a URL it can reach

Slack delivers events (DMs, mentions, channel messages) by POSTing to a URL. That URL has to be reachable from Slack's servers.

For local development, ngrok creates a public tunnel to a local port:

```bash theme={null}
ngrok http 8000
```

Copy the `https://...ngrok-free.app` URL. For production, use your deployed Railway URL.

<Note>
  Free ngrok URLs rotate on every restart. If you stop and restart ngrok, you'll need to update the URL in your Slack app's Event Subscriptions page.
</Note>

## Step 2: Register the Slack app from a manifest

A Slack app is configured by a JSON manifest that declares its identity, scopes, and the events it should receive. A manifest keeps scopes explicit and reproducible.

The manifest requests the scopes Dash needs to read the workspace (search, channel and group history, IMs, user lookups) and to post replies. No admin scopes. The full list is in the manifest. **Review it before installing.**

Copy the manifest from [SLACK\_CONNECT.md](https://github.com/agno-agi/dash/blob/main/docs/SLACK_CONNECT.md), paste into Slack's **Create New App → From a manifest** flow, and replace the placeholder URL with your URL from Step 1.

## Step 3: Install Dash into your workspace

Installing the app creates the bot identity in your workspace and issues the credentials Dash uses to authenticate every event and call. Two values to copy after install:

| What                     | Where in Slack                      | Becomes                    |
| ------------------------ | ----------------------------------- | -------------------------- |
| **Bot User OAuth Token** | Install App page                    | `SLACK_TOKEN` (`xoxb-...`) |
| **Signing Secret**       | Basic Information → App Credentials | `SLACK_SIGNING_SECRET`     |

The signing secret is what Slack uses to sign every incoming event. Dash verifies the signature on every request, which is how it knows the event actually came from Slack and not someone spoofing your endpoint.

## Step 4: Wire credentials and restart

Add both values to `.env`:

```bash theme={null}
# .env
SLACK_TOKEN="xoxb-..."
SLACK_SIGNING_SECRET="..."
```

Restart:

```bash theme={null}
docker compose up -d
```

## Verify

Open your Dash app at [api.slack.com/apps](https://api.slack.com/apps) → **Event Subscriptions**. The Request URL should show **Verified** with a green check. If it shows "Your URL didn't respond", click **Retry** and confirm before saving.

Then talk to Dash:

| Surface     | Try                                                     |
| ----------- | ------------------------------------------------------- |
| **DM**      | Open a direct message to Dash and ask `what's our MRR?` |
| **Channel** | `@Dash which plan has the highest churn rate?`          |
| **Thread**  | Reply in a thread. Dash continues with full context.    |

## Troubleshooting

The most common failure is **"Your URL didn't respond"** during Slack's verification challenge. That happens when Dash isn't running at the moment Slack POSTs the challenge. Restart Dash, then retry from your Slack app's **Event Subscriptions** page.

If your **ngrok URL has changed** (free URLs rotate on restart), update the Request URL in **Event Subscriptions** and click **Retry**.

If Dash doesn't respond to mentions, check `docker compose logs -f dash-api` for signature verification errors. These usually mean the `SLACK_SIGNING_SECRET` in `.env` doesn't match the one in your Slack app's Basic Information page.

For everything else, see [SLACK\_CONNECT.md](https://github.com/agno-agi/dash/blob/main/docs/SLACK_CONNECT.md).

## How it works

Dash uses [Agno's Slack interface](/agent-os/interfaces/slack/introduction). Each Slack thread timestamp becomes an AgentOS session ID, so threads stay isolated and follow-ups in the same thread don't need to re-mention `@Dash`.

Setting `SLACK_TOKEN` also gives the Leader `SlackTools`, so Dash can post insights and scheduled results to channels you configure without depending on someone asking first.

## Next

[Deploy to Railway →](/tutorials/dash/deploy-to-railway)
