Сценарий готовит действие, например скидку по сделке или оплату счёта, и присылает его ответственному в Telegram с кнопками «Согласовать» и «Отклонить». После нажатия сценарий продолжает работу. Ниже два способа: встроенная операция n8n и схема на callback-кнопках.
Что понадобится
- n8n на своём сервере с HTTPS и публичным адресом. Если n8n стоит за прокси, адрес должен быть указан в переменной
N8N_WEBHOOK_URLилиWEBHOOK_URL, подробнее в статье о вебхуках в n8n. - Telegram у сотрудника, который будет согласовывать.
- Для ответа прямо в чате: n8n версии 2.30 или новее.
Шаг 1. Создать бота
- Откройте в Telegram @BotFather и отправьте команду
/newbot. - Укажите имя бота, его увидят сотрудники. Затем задайте username: от 5 до 32 символов, латиница, цифры и подчёркивание, в конце
bot, напримерshop_approvals_bot. Username потом не поменять. - BotFather пришлёт токен. Храните его как пароль: с токеном любой может писать от имени бота.
Бот не может написать человеку первым. Попросите каждого, кто будет согласовывать, найти бота и нажать Start.
Шаг 2. Узнать ID чата
Пока к боту не подключён ни один триггер, откройте в браузере адрес:
https://api.telegram.org/botВАШ_ТОКЕН/getUpdates
В ответе найдите message.chat.id, это ID чата. В message.from.id лежит ID пользователя, он пригодится для ограничения доступа к кнопкам. Для группы добавьте в неё бота, напишите сообщение и повторите запрос.
Метод getUpdates не работает, если у бота уже настроен вебхук, например подключён Telegram Trigger.
Шаг 3. Добавить бота в n8n
В n8n откройте Credentials, создайте учётные данные типа Telegram API и вставьте токен в поле Access Token. Поле Base URL оставьте как есть.
Шаг 4. Отправить сообщение и дождаться ответа
Добавьте узел Telegram с настройками:
- Resource: Message
- Operation: Send and Wait for Response
- Chat ID: ID из шага 2
- Message: текст согласования
- Response Type: Approval
По умолчанию узел показывает одну кнопку. В Approval Options выберите Type of Approval → Approve and Disapprove и переименуйте кнопки в полях Approve Button Label и Disapprove Button Label, например «Согласовать» и «Отклонить».
Пример текста:
Скидка по сделке № {{ $json.dealId }}
Сумма: {{ $json.amount }} ₽, скидка {{ $json.discount }}%
Карточка: {{ $json.crmUrl }}
Узел отправит сообщение и поставит запуск на паузу. Решение придёт в поле:
{{ $json.data.approved }}
Значение true означает согласование, false отказ. Дальше поставьте узел If с условием по этому полю.
Узел отправляет одно сообщение за запуск и берёт данные первого элемента. Если на согласование уходит список, передайте его в узел Execute Sub-workflow в режиме Run once for each item с выключенной опцией Wait for Sub-Workflow Completion. Тогда каждый элемент получит своё сообщение и своё ожидание.
Шаг 5. Ограничить время ожидания
Без ограничения запуск ждёт ответа бессрочно и висит в списке запусков со статусом Waiting. В Options узла добавьте Limit Wait Time:
- After Time Interval, затем Amount и Unit (минуты, часы или дни);
- At Specified Time, если решение нужно к конкретному моменту.
Когда срок истекает, сценарий продолжается без решения. Поля data.approved в этом случае нет, узел передаёт дальше исходные данные. Поэтому разведите три исхода, например узлом Switch:
Согласовано: {{ $json.data && $json.data.approved === true }}
Отклонено: {{ $json.data && $json.data.approved === false }}
Срок истёк: {{ !$json.data }}
На истёкший срок обычно отправляют напоминание или передают вопрос руководителю.
Шаг 6. Кнопки прямо в чате
По умолчанию кнопка открывает в браузере страницу n8n, где сотрудник подтверждает решение. С версии 2.30 можно отвечать одним нажатием внутри Telegram. В Approval Options, в разделе Advanced Interactivity, включите Approve Within Chat.
Условия и настройки:
- n8n должен быть доступен из интернета по HTTPS на порту 443, 80, 88 или 8443. Вебхук бота n8n зарегистрирует сам.
- Restrict Who Can Approve: Telegram ID сотрудников через запятую. Если поле пустое, ответить может любой, кто видит сообщение.
- Unauthorized Reply: текст, который увидит посторонний при нажатии.
- After Decision: что сделать с сообщением после ответа. Вариант Show Outcome and Remove Buttons убирает кнопки и дописывает, кто принял решение.
В выходных данных появится, кто ответил: Telegram ID, username и имя. Если вебхук этого бота уже занят внешней системой, заведите для согласований отдельного бота.
Альтернатива: Telegram Trigger и callback-кнопки
Схема из двух сценариев подходит, если вариантов ответа больше двух, согласование может тянуться днями или n8n старше версии 2.30.
Первый сценарий отправляет сообщение. Узел Telegram, операция Send Message, в Reply Markup выберите Inline Keyboard и добавьте кнопки. В Callback Data каждой кнопки запишите действие и номер объекта:
approve:{{ $json.dealId }}
reject:{{ $json.dealId }}
Callback Data вмещает до 64 байт, поэтому передавайте только идентификатор.
Второй сценарий принимает нажатия:
- Telegram Trigger с событием Callback Query. В опции Restrict to User IDs укажите ID сотрудников.
- Разберите нажатие. Действие лежит в
{{ $json.callback_query.data.split(':')[0] }}, номер сделки в{{ $json.callback_query.data.split(':')[1] }}. - Ответьте Telegram: узел Telegram, ресурс Callback, операция Answer Query, в Query ID укажите
{{ $json.callback_query.id }}. Без этого ответа на кнопке будет крутиться индикатор загрузки. - Замените текст сообщения на итог, например «Согласовано», операцией Edit Message Text. Чат и сообщение берутся из
{{ $json.callback_query.message.chat.id }}и{{ $json.callback_query.message.message_id }}. - Выполните действие: обновите сделку в CRM или создайте платёж. Перед этим проверьте статус объекта, чтобы повторное нажатие не применило решение дважды.
Что не отправлять в сообщении
Серверы Telegram находятся за рубежом, и отправка туда персональных данных клиентов считается трансграничной передачей. Подробнее в статье о 152-ФЗ и автоматизации.
Не отправляйте:
- ФИО, телефоны, email и адреса клиентов;
- паспортные данные и реквизиты физических лиц;
- тексты переписки и расшифровки звонков;
- платежи физических лиц вместе с именем плательщика.
Безопасно отправлять номер сделки или заказа, сумму, тип действия и ссылку на карточку в CRM. Подробности сотрудник откроет по ссылке. Если подробности нужны прямо в сообщении, используйте российский мессенджер, например бота в MAX.
Частые ошибки
- Кнопка открывает страницу с ошибкой. Ссылка собрана из неверного адреса. Проверьте
N8N_WEBHOOK_URLилиWEBHOOK_URLи HTTPS. - Telegram Trigger не получает нажатия. У бота может быть только один вебхук, и тестовый режим перезаписывает рабочий. Для тестов заведите отдельного бота.
- Истёкший срок попал в ветку отказа. Проверяйте
approved === trueи отдельно обрабатывайте отсутствие ответа. Если во входных данных уже есть полеdata, переименуйте его до узла согласования. - Сообщения доходят с перебоями. Работа Telegram в России ограничивается. Для важных согласований держите запасной канал, например письмо или бота в MAX.
Все параметры операции описаны в документации n8n.
Частые вопросы
Можно ли нажимать кнопки прямо в чате, без перехода в браузер?
Да, начиная с n8n 2.30 у операции Send and Wait for Response есть опция Approve Within Chat. Для неё n8n должен быть доступен из интернета по HTTPS на порту 443, 80, 88 или 8443.
Что будет, если никто не ответит?
Без ограничения запуск ждёт ответа бессрочно. Включите Limit Wait Time, тогда по истечении срока сценарий продолжится без решения, и этот случай можно обработать отдельно.
Можно ли согласовывать в группе?
Можно, если бот добавлен в группу. Укажите в Restrict Who Can Approve ID сотрудников, которые вправе принимать решение. Иначе нажать кнопку сможет любой участник.