Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
140 lines
4.8 KiB
Markdown
140 lines
4.8 KiB
Markdown
# Forward Slack messages into Zulip
|
|
|
|
Forward messages sent to your Slack workspace's public channels into Zulip!
|
|
|
|
This integration lets you choose how to organize your Slack messages in Zulip.
|
|
You can:
|
|
|
|
- Send messages from each Slack channel into a **matching Zulip channel**.
|
|
- Send messages from each Slack channel into a **matching Zulip topic**.
|
|
- Send all Slack messages into a **single Zulip topic**.
|
|
|
|
If you'd like to forward messages in both directions (Slack to Zulip and Zulip
|
|
to Slack), please see [separate instructions][6] for how to set this up.
|
|
|
|
If you are looking to quickly move your Slack integrations to Zulip, check out
|
|
[Zulip's Slack-compatible incoming webhook][1].
|
|
|
|
!!! warn ""
|
|
|
|
Using [Slack's legacy Outgoing Webhook service][5] is no longer
|
|
recommended. Follow these instructions to switch to the new
|
|
[Slack Events API][3].
|
|
|
|
{start_tabs}
|
|
|
|
1. {!create-an-incoming-webhook.md!}
|
|
|
|
1. {!generate-webhook-url-basic.md!}
|
|
|
|
To send messages from each Slack channel into a **matching Zulip channel**,
|
|
open the **Where to send notifications** dropdown and select **Matching
|
|
Zulip channel**.
|
|
|
|
To send messages from each Slack channel into a **matching Zulip topic**,
|
|
open the **Topics to use** dropdown, and select **Topics named after Slack
|
|
channels**.
|
|
|
|
To send all Slack messages into a **single Zulip topic**, open the **Topics
|
|
to use** dropdown, and select **Send all notifications to a single topic**.
|
|
|
|
1. *(optional)* If you're setting up a [Slack bridge][6] to forward Zulip messages
|
|
into your Slack workspace, replace the value of the `?api_key=` parameter in
|
|
the **integration URL** you generated with the API key of the **Generic bot**
|
|
you're using for the Slack bridge.
|
|
|
|
1. Create a new [Slack app][4], and open it. Navigate to the **OAuth
|
|
& Permissions** menu, and scroll down to the **Scopes** section.
|
|
|
|
1. Make sure **Bot Token Scopes** includes `channels:history`, `channels:read`,
|
|
and `users:read`. If you're setting up a [bidirectional bridge][6], make sure
|
|
to also include the `chat:write` scope.
|
|
|
|
!!! tip ""
|
|
|
|
See the [required bot token scopes](#required-bot-token-scopes)
|
|
section for details about these scopes.
|
|
|
|
1. Scroll to the **OAuth Tokens** section in the same menu, and click **Install
|
|
to Workspace**. Grant the app permission to access your workspace
|
|
by clicking **Allow** when prompted.
|
|
|
|
1. You will immediately see a **Bot User OAuth Token**. Copy it and add it
|
|
to the end of your **integration URL** as `&slack_app_token=BOT_OAUTH_TOKEN`.
|
|
|
|
1. Go to the **Event Subscriptions** menu, toggle **Enable Events**, and enter
|
|
your updated **integration URL** in the **Request URL** field.
|
|
|
|
1. In the same menu, scroll down to the **Subscribe to bot events**
|
|
section, and click on **Add Bot User Event**. Select the
|
|
`message.channels` event.
|
|
|
|
1. Add the bot as an app to the Slack channels you'd like to receive
|
|
notifications from.
|
|
|
|
{end_tabs}
|
|
|
|
{!congrats.md!}
|
|
|
|

|
|
|
|
### Required bot token scopes
|
|
|
|
- `channels:history` is required by Slack's Event API's
|
|
[message.channels](https://api.slack.com/events/message.channels) event. This
|
|
is used to send new messages from Slack to Zulip.
|
|
|
|
- `channels:read` is required for Slack's
|
|
[conversations.info](https://api.slack.com/methods/conversations.info)
|
|
endpoint. This is used to get the name of the Slack channel a message came
|
|
from.
|
|
|
|
- For a [bidirectional bridge][6] setup, the `chat:write` is also required for
|
|
Slack's
|
|
[chat.postMessage](https://docs.slack.dev/reference/methods/chat.postMessage/)
|
|
method. This is used to send new messages from Zulip to Slack.
|
|
|
|
- `users:read` is required to call
|
|
Slack's [users.info](https://api.slack.com/methods/users.info) endpoint. This
|
|
is used to get the name of the Slack message's sender.
|
|
|
|
### Caveats
|
|
|
|
- Mentions in messages are not converted to Zulip mentions.
|
|
|
|
- Notifications will be delayed by a few seconds.
|
|
|
|
- Some emojis exported from Slack will display as `:emojiname:`, if
|
|
the emoji name is not present in the emoji database used by Zulip.
|
|
|
|
- Threads will appear in the main topic instead of in separate topics.
|
|
|
|
The following data is not included:
|
|
|
|
- Custom emoji
|
|
|
|
- Message attachments
|
|
|
|
- Message edit history
|
|
|
|
- Message reactions
|
|
|
|
### Related documentation
|
|
|
|
- [Forward messages Slack <-> Zulip][6] (both directions)
|
|
|
|
- [Slack Events API documentation][3]
|
|
|
|
- [Slack Apps][4]
|
|
|
|
- [Zulip's Slack-compatible incoming webhook][1]
|
|
|
|
{!webhooks-url-specification.md!}
|
|
|
|
[1]: /integrations/slack_incoming
|
|
[2]: /help/create-a-channel
|
|
[3]: https://api.slack.com/apis/events-api
|
|
[4]: https://api.slack.com/apps
|
|
[5]: https://api.slack.com/legacy/custom-integrations/outgoing-webhooks
|
|
[6]: https://github.com/zulip/python-zulip-api/blob/main/zulip/integrations/bridge_with_slack/README.md
|