> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zudo.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Slack

> Connect a Slack workspace so playbooks can post to a channel or DM the account's CSM.

Connect a Slack workspace and a [playbook](/automation/playbooks) can post to it: a channel, a DM to the account's CSM, or a channel named on the account itself. The message is built from blocks and filled in per account when the step runs.

## Connecting

Go to **Settings → Connections**, add a connection and pick **Slack**. Continuing takes you to Slack, where you choose the workspace and approve the permissions — Zudo never asks you for a token. Slack sends you back and the connection appears with your channel list already loaded.

Start and finish in the same browser. The link Zudo hands Slack is good for ten minutes and is tied to the person and organization who started it, so a link that has sat in a tab overnight, or one opened in a different organization, is refused and you start again from Connections.

Adding an app to a Slack workspace may need an admin, depending on how that workspace is set up.

### What Zudo asks for, and why

| Permission | Why |
| - | - |
| Send messages as Zudo | The whole feature |
| Send to public channels it has not joined | Otherwise posting to a channel fails until someone invites the app |
| View basic channel information | So you pick a channel from a list instead of typing its name |
| View people's email addresses | To match a Zudo user to a Slack one, for DMs |
| Start direct messages | To DM an account's CSM |

Zudo does not read messages. It only posts.

## Posting from a playbook

Add a **Post to Slack** step to a playbook. It has two parts: where it goes, and what it says.

### Where it goes

| Destination | What it does |
| - | - |
| **A channel** | Picked from your workspace's channels. Stored by ID, so renaming the channel in Slack does not break the playbook |
| **A DM to the account's CSM** | Matched by email. An account with no CSM, or a CSM who is not in that workspace, is skipped rather than failed |
| **The channel named on the account** | Reads a trait on the account, so a customer with a shared channel gets the message in theirs. The value can be a channel name or an ID; an account with nothing in it is skipped |

### What it says

The message is a list of blocks you stack in order:

| Block | What it is |
| - | - |
| **Paragraph** | A sentence or two. Bold with `*asterisks*` |
| **Facts** | A two-column grid of labels and values, which is where numbers read well |
| **Risks and opportunities** | The account's open [flags](/accounts/flags), with an icon each. You choose which kinds, how many at most, and whether to leave the block out when there are none |
| **Links** | Link buttons |
| **Divider** | A horizontal line |
| **Small print** | A small grey line, for saying which playbook sent it |

Every text field takes [inserted values](/automation/playbooks#inserting-values): type `{{` and pick one, and it is filled in per account when the step runs.

<Note>
  Values are read at the moment the step posts. A step that waits two weeks before posting sends the MRR as it is two
  weeks from now, not as it was when the account enrolled.
</Note>

## Testing it

The Slack connection has a **Send a test message** button, which posts to a channel you pick. That is the way to check a workspace is working without switching a playbook on and waiting for a check.

The connection also has a **Refresh channels** button. Zudo reads your channel list when you connect, so a channel created later will not be in the picker until you refresh.

## What happens when something goes wrong

A step that cannot post says why on its own counter in the playbook, and the reason is in the run's log under **Accounts**.

| What you will see | What it means |
| - | - |
| Skipped | Nothing was wrong with the run. The workspace is disconnected, the account has no CSM, the channel trait is empty, or the message came out empty for this account |
| Failed, `not_in_channel` | The channel is private and the app has not been added to it. Invite Zudo to the channel |
| Failed, rate limited | Slack limits how fast messages can go to one channel. A playbook matching many accounts at once can hit it; the step retries on the next check |

## What is not here yet

* Health tier drops, completed requests and alerts do not post to Slack on their own. Slack is a playbook destination, so anything that reaches it does so because a playbook sends it
* Zudo does not read or reply to Slack messages, and there is no Zudo app inside Slack
* One workspace per organization. Connecting a second Slack replaces nothing, but the Add Connection screen offers Slack only while none is connected
