Перейти к содержимому

← Все статьи блога

Как отправить Slack-уведомление о заявке из n8n: канал, Bot Token, шаблон?

Автор: Алексей Доронин

Заявка с формы лежит в почте, а менеджеры живут в 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

slack-uvedomlenie-o-zayavke-iz-n8n-inline-01 Как отправить Slack-уведомление о заявке из n8n: канал, Bot Token, шаблон?

Боль: при первом тесте n8n отвечает `not_in_channel` или `missing_scope`, хотя токен скопирован верно. На практике ломается не workflow, а права приложения и членство бота в канале.

  1. Откройте api.slack.com/apps → Create New App → From scratch. Назовите, например, LeadsBot.
  2. OAuth & Permissions → Bot Token Scopes: минимум `chat:write`. Опционально `channels:read`, если хотите выбирать канал из списка в UI n8n.
  3. Install to Workspace → скопируйте Bot User OAuth Token - строка начинается с `xoxb-`. Это ключ бота, не ваш личный аккаунт.
  4. В Slack создайте или откройте канал #leads (или #sales) → введите `/invite @LeadsBot` → убедитесь, что бот в списке участников.
  5. В настройках приложения отключите 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-ом

slack-uvedomlenie-o-zayavke-iz-n8n-inline-02 Как отправить Slack-уведомление о заявке из n8n: канал, Bot Token, шаблон?

Боль: заявки не доходят до sales, потому что trigger смотрит не туда или JSON не совпадает с полями в Slack-ноде. Решение - один стабильный вход и явная схема полей.

  1. Credentials → Add → Slack → тип Access Token → вставьте `xoxb-` → Save. Не вставляйте токен в параметры ноды.
  2. Новый workflow → Webhook node → Method POST → Path, например, `lead-alert` → Response Mode «When last node finishes».
  3. Тестовое тело JSON: `{«name»:»Тест»,»phone»:»+79001234567″,»lead_url»:»https://crm.example/leads/1″,»lead_id»:»1″}`.
  4. Workflow Settings → Timezone `Europe/Moscow` (или ваш регион) - это важно для тихих часов ниже.
  5. Альтернатива Webhook: Google Sheets Trigger на новую строку с теми же полями - логика Slack-ноды не меняется.

CRM или Tilda шлёт POST на URL webhook n8n. Для отладки - curl до подключения боевой формы.

Настройте ноду Slack: канал, Block Kit, имя и телефон

slack-uvedomlenie-o-zayavke-iz-n8n-inline-03 Как отправить Slack-уведомление о заявке из n8n: канал, Bot Token, шаблон?

Боль: 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.

Чек-лист теста:

  1. curl POST на webhook с тестовым JSON → сообщение в #leads.
  2. Клик по «Открыть в CRM» → открывается `lead_url`.
  3. Повтор curl с тем же `lead_id` → второго сообщения нет.
  4. Смоделируйте час 23:00 (временно смените timezone или expression) → канал молчит.
  5. 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.

Telegram