Заявка с формы лежит в почте, а менеджеры живут в Slack - и отвечают через час, потому что лида просто не видят. Операционный директор Марина один раз подключила Slack через OAuth2 «как в гайде»: уведомления шли от её личного профиля в #sales, коллеги путались. Потом пересобрала на Bot Token, забыла пригласить бота - три дня смотрела на `not_in_channel`. Ниже один узкий сценарий: заявка из n8n попадает в канал #leads с кнопкой в CRM за минуты, без ночных пингов и без утечки `xoxb-` в git.
В B2B-команде Slack - рабочий чат. Webhook в n8n - входная дверь: форма или CRM шлёт JSON, workflow пересылает в канал. API Slack здесь - способ сказать «напиши в #leads». App, invite и тест - около 5 минут, если не путать OAuth2 пользователя с токеном бота.
Создайте Slack App, Bot Token и пригласите бота в #leads

Боль: при первом тесте n8n отвечает `not_in_channel` или `missing_scope`, хотя токен скопирован верно. На практике ломается не workflow, а права приложения и членство бота в канале.
- Откройте api.slack.com/apps → Create New App → From scratch. Назовите, например, LeadsBot.
- OAuth & Permissions → Bot Token Scopes: минимум `chat:write`. Опционально `channels:read`, если хотите выбирать канал из списка в UI n8n.
- Install to Workspace → скопируйте Bot User OAuth Token - строка начинается с `xoxb-`. Это ключ бота, не ваш личный аккаунт.
- В Slack создайте или откройте канал #leads (или #sales) → введите `/invite @LeadsBot` → убедитесь, что бот в списке участников.
- В настройках приложения отключите Token Rotation, если он включён: иначе токен протухнет через ~12 часов и n8n перестанет слать алерты.
Типичная ошибка: бот не может сам войти в канал - его нужно пригласить вручную. Это ограничение Slack API, не баг n8n. После добавления scope обязательно переустановите приложение в workspace и обновите токен в credential. Рекомендуем не делайте копию `xoxb-` в параметрах ноды - только credential. Советуем избегайте OAuth2 user для командного #leads: так вы не столкнётесь с «сообщения от CEO».
| Способ отправки | Кнопка CRM в Block Kit | От чьего имени пишет | Когда брать |
|---|---|---|---|
| Bot Token (`xoxb-`) | Да, через `chat.postMessage` + blocks | От приложения LeadsBot | Заявки с полями и кнопкой в CRM |
| Incoming Webhook | Нет rich actions, только текст | Зависит от настройки webhook | Простой текстовый пинг без кнопок |
| OAuth2 user в n8n | Да, но сообщение от пользователя | От CEO или того, кто логинился | Не для sales-алертов в командный канал |
Неочевидный момент: официальная документация n8n для Slack рекомендует OAuth2, но для алерта о заявке достаточно Access Token с `xoxb-` - и это как раз убирает ситуацию «сообщения идут от моего имени», с которой столкнулась Марина.
Подключите credential в n8n и поймайте заявку Webhook-ом

Боль: заявки не доходят до sales, потому что trigger смотрит не туда или JSON не совпадает с полями в Slack-ноде. Решение - один стабильный вход и явная схема полей.
- Credentials → Add → Slack → тип Access Token → вставьте `xoxb-` → Save. Не вставляйте токен в параметры ноды.
- Новый workflow → Webhook node → Method POST → Path, например, `lead-alert` → Response Mode «When last node finishes».
- Тестовое тело JSON: `{«name»:»Тест»,»phone»:»+79001234567″,»lead_url»:»https://crm.example/leads/1″,»lead_id»:»1″}`.
- Workflow Settings → Timezone `Europe/Moscow` (или ваш регион) - это важно для тихих часов ниже.
- Альтернатива Webhook: Google Sheets Trigger на новую строку с теми же полями - логика Slack-ноды не меняется.
CRM или Tilda шлёт POST на URL webhook n8n. Для отладки - curl до подключения боевой формы.
Настройте ноду Slack: канал, Block Kit, имя и телефон

Боль: API отвечает `ok: true`, а в канале только сухой Notification Text без кнопки. В community n8n (2025-2026) это массовый кейс: blocks вставили массивом, а не объектом `{«blocks»:[…]}`, или Message Type остался Text.
Добавьте ноду Slack после trigger:
- Resource: Message → Operation: Send
- Credential: ваш Access Token
- Channel: `#leads` (имя с решёткой или ID канала)
- Message Type: Block
- Notification Text (fallback): `Новая заявка: {{ $json.name }}`
В поле Blocks JSON - обёртка целиком, не голый массив:
Blocks JSON (обёртка целиком):
{ «blocks»: [ { «type»: «header», «text»: { «type»: «plain_text», «text»: «Новая заявка» } }, { «type»: «section», «fields»: [ { «type»: «mrkdwn», «text»: «*Имя:*n{{ $json.name }}» }, { «type»: «mrkdwn», «text»: «*Телефон:*n{{ $json.phone }}» } ] } ] }
Slack допускает до 50 blocks в одном сообщении - для лида хватит 3-4. Типичная ошибка: скопировать blocks из Block Kit Builder без внешних фигурных скобок `{«blocks»:…}` - нода примет JSON, но Slack покажет только fallback-текст.
Добавьте кнопку «Открыть в CRM» со ссылкой на лид
Боль: менеджер видит имя и телефон, но ищет лид в CRM вручную - теряются секунды на горячем входящем. Кнопка-ссылка в Block Kit решает это без отдельного бота-обработчика.
Допишите в массив `blocks` секцию `actions` с кнопкой type `button`, style `primary`, `url` на `{{ $json.lead_url }}`:
Кнопка CRM в blocks:
{ «type»: «actions», «elements»: [ { «type»: «button», «text»: { «type»: «plain_text», «text»: «Открыть в CRM» }, «url»: «{{ $json.lead_url }}», «style»: «primary» } ] }
Это ссылка, не callback-кнопка: клик открывает карточку лида. Имя и телефон в канале продаж - осознанный выбор; email в заголовке канала лучше не дублировать.
Схема workflow:
Webhook (заявка) → IF тихие часы → Slack Send (#leads, Block Kit) → отметка `notified=yes` в Sheets/БД
Поставьте тихие часы и защиту от дублей при retry
Боль: ночью канал #leads пищит от каждой заявки, а после ошибки CRM n8n шлёт второй такой же алерт. Два разных риска - решаются IF и dedup.
Тихие часы. Между trigger и Slack добавьте IF с expression (workflow timezone уже задан):
IF тихие часы: {{ $now.hour >= 22 || $now.hour < 8 }}
Ветка true - Stop или отложенная очередь (Wait до 08:00). Ветка false - Send в Slack. `$now` в n8n уважает timezone workflow - не используйте `new Date()` в Code node для этого правила.
Дедупликация. Перед Slack: IF `lead_id` ещё не помечен как `notified`. После успешной отправки - Update row в Sheets или запись в БД. Тогда Error Retry n8n не создаст второе сообщение в канале при повторном запуске с тем же id.
Пройдите чек-лист: тестовая заявка, кнопка, ноль секретов в git
Success criteria - вы на финише, если: Итог - вы получите рабочий алерт в #leads и сможете запустить workflow на боевой форме без переделки. Проверьте пять пунктов ниже:
- Тестовый POST на webhook за меньше минуты даёт сообщение в #leads с именем, телефоном и кликабельной кнопкой CRM.
- Сообщение идёт от LeadsBot (приложение), не от личного аккаунта сотрудника.
- После 22:00 по timezone workflow алерт не уходит в канал (или уходит в отложенную ветку).
- Повторный запрос с тем же `lead_id` не дублирует пост в Slack.
- В экспорте workflow и в git нет строки `xoxb-` - только credential в n8n.
Чек-лист теста:
- curl POST на webhook с тестовым JSON → сообщение в #leads.
- Клик по «Открыть в CRM» → открывается `lead_url`.
- Повтор curl с тем же `lead_id` → второго сообщения нет.
- Смоделируйте час 23:00 (временно смените timezone или expression) → канал молчит.
- grep репозитория на `xoxb-` → 0 совпадений.
Для Telegram вместо Slack - отдельный гайд в блоге. B45 узкий: заявка пришла - команда увидела за секунды. Разбор под вашу воронку - на calmopsai.com.
Материал проверен: эксперт Елена Ковалева (главный эксперт по SEO/GEO).
Достоверность данных: scopes, `chat.postMessage`, формат blocks и timezone `$now` сверены с документацией n8n и Slack API на 2026-08-02; типовые ошибки `not_in_channel` и игнор blocks - по обсуждениям community n8n 2025-2026.
Частые вопросы
Incoming Webhook или Bot Token - что выбрать для заявки?
Для заявки с кнопкой в CRM берите Bot Token (`xoxb-`) и ноду Slack Message Send. Incoming Webhook в n8n умеет только простую отправку текста без полноценного Block Kit с actions. Webhook URL проще на старте, но вы упрётесь в plain text без кнопки.
Чем Slack лучше Telegram для B2B-алертов о лидах?
Если продажи уже в Slack, алерт в #leads попадает в тот же контекст сделок. Telegram силён в личных ботах; для корпоративного канала Slack часто ближе. Для Telegram - отдельный гайд в блоге.
Почему blocks игнорируются, хотя API пишет ok?
Проверьте Message Type = Block и JSON с корневым ключом `blocks`. Массив blocks без обёртки - частая причина: в канале только Notification Text. Второй частый промах - OAuth2 от пользователя вместо bot token: сообщение уходит, но layout ведёт себя иначе.
Как починить `not_in_channel` без переписывания workflow?
В канале #leads выполните `/invite @ИмяБота`. Для приватного канала приглашение обязательно. После смены scopes переустановите app и обновите token в credential n8n.
Как не дублировать алерт при Error Retry n8n?
Храните `lead_id` и флаг `notified` в Sheets или БД. Перед Slack проверяйте, что флаг пустой; после успешной отправки ставьте `notified=yes`. Так повторный запуск workflow не создаст второй пост при временной ошибке CRM.
Нужен ли scope кроме `chat:write`?
Для отправки в известный канал по имени достаточно `chat:write`. `channels:read` добавляют, если хотите подсказки списка каналов в UI. Без нужного scope получите `missing_scope` - добавьте право, reinstall app, обновите токен.
Можно ли слать алерты без хранения токена в n8n Cloud?
Токен всё равно живёт в encrypted Credentials n8n - не в коде workflow. Не экспортируйте workflow с plaintext credential и добавьте `.env` / secrets в CI. В git не должно быть `xoxb-` ни в JSON, ни в README.
