Форма на сайте и Telegram: путь заявки, сбои и журнал отправок
Форму на сайте и Telegram соединяют не «кнопкой», а двумя звеньями: страницей, которая принимает обращение, и программой, которая после отправки делает запрос к Bot API. Между ними — самое хрупкое место: клиент уже нажал «Отправить», а сообщение в чат ещё не попало. Разберём схему из шести шагов, ограничения Telegram и журнал отправок, из которого видно, что именно не дошло.
Коротко
- Интеграция — это два звена: форма на сайте и обработчик на сервере, который отправляет сообщение в чат через Bot API. Если обработчик не сохраняет заявку до отправки, обычный сбой сети превращается в потерю клиента.
- Лимиты Telegram из официальной справки: не больше одного сообщения в секунду в один чат, не больше 20 сообщений в минуту в группу и около 30 в секунду на весь бот — при превышении приходит ошибка 429.
- Недоставленные обновления Telegram хранит не дольше 24 часов, поэтому «подождём, пока поднимется сервис» работает только в пределах суток.
- Журнал отправок обязателен: время, поля заявки, статус, номер попытки, код и текст ошибки. Без него нельзя ни доказать, что заявка была, ни отличить сбой доставки от сбоя самой формы.
- Повторять отправку нужно с растущей паузой и ограниченным числом попыток: повтор «каждую секунду» усиливает нагрузку на сервис, который уже не справляется.
Что соединяет интеграция сайта с Telegram
Интеграция сайта с Telegram — это связка из двух частей: страница с формой и обработчик на сервере. Клиент заполняет поля и нажимает «Отправить», страница передаёт данные обработчику, а тот формирует запрос к Bot API методом sendMessage и указывает, в какой чат положить сообщение. Сам Telegram о вашем сайте ничего не знает: он принимает готовый текст и доставляет его туда, где сидят ответственные.
Отсюда главное правило: мессенджер — последняя миля, а не хранилище заявок. К моменту отправки в чат заявка должна уже существовать отдельно, в журнале или базе. Тогда любой сбой читается как «пока не доставлено», а не как «клиент не приходил». Если же обращение живёт только в переписке, разбор потерь превращается в догадки — об этом мы писали в материале почему заявки теряются в Telegram.
Стоит разделить две задачи, которые часто смешивают. Доставить сообщение о заявке людям — здесь нужен только исходящий HTTPS-запрос. Принимать сообщения от клиентов ботом и отвечать — это уже другой сценарий: ему нужны webhook, домен и сертификат.
Два способа собрать связку
Первый способ — готовый сервис: конструктор форм или модуль, где в настройках указывают токен бота и нужный чат, а отправку сервис берёт на себя. Второй — свой обработчик: скрипт на сайте или отдельный сервис, который принимает данные формы, проверяет их, пишет в журнал и сам вызывает Bot API.
Готовый сервис запускается за час и не требует программиста. Плата — зависимость: журнал живёт у подрядчика, формат сообщения ограничен шаблоном, а вместе с сервисом пропадает и история. Свой обработчик даёт контроль над журналом, видом сообщения и поведением при ошибке. Критерий простой: меньше десятка заявок в день — хватит готового сервиса, если он показывает историю отправок. Если по заявке считается выручка, свой обработчик окупается на первом же разборе инцидента.
Путь заявки: шесть шагов
Четвёртый шаг — точка, где заканчивается ваша система и начинается чужая. До него заявка существует в ваших файлах, после — только как сообщение в чужом интерфейсе. Ошибка здесь не видна ни клиенту, ни менеджеру: клиент получил «спасибо, заявка принята», менеджер ничего не увидел. Поэтому подтверждение показывайте после ответа Bot API, а не после нажатия кнопки: в ответе есть поле ok, а при ошибке — description с причиной.
Лимиты, из-за которых заявки не доходят
Telegram прямо описывает ограничения в справке для разработчиков: в один чат не стоит отправлять больше одного сообщения в секунду, в группе бот не может отправить больше 20 сообщений в минуту, а на весь бот приходится около 30 сообщений в секунду. При превышении приходит ошибка 429, и в ответе бывает параметр с задержкой, после которой попытку имеет смысл повторить.
Для потока заявок этих лимитов хватает с запасом: 20 сообщений в минуту — это 1200 в час. Ловушка в другом: одно обращение часто отправляют трижды — менеджеру, в общий чат отдела, руководителю. Три копии уменьшают пропускную способность группы втрое, а в пик — после рассылки или вечером — лимит выбирается мгновенно, и копии отваливаются с ошибкой 429. Надёжнее слать одну копию в один чат, а остальным показывать заявку из своей системы.
Журнал отправок: минимальный набор полей
Журнал — единственный способ доказать, что заявка была, и одновременно ответ на вопрос «что именно сломалось»: форма, обработчик или доставка в чат. Держать его можно в базе, в таблице или в файле, важно не место, а набор полей.
- Номер заявки и время отправки формы — по ним ищут обращение и считают срок ответа.
- Все поля, которые ввёл клиент, включая комментарий целиком: в чат уходит сокращённый вариант.
- Адрес страницы, с которой пришла заявка, и источник перехода — без этого не понять, какая форма работает.
- Статус: принята, отправлена, доставлена, ошибка. Три состояния вместо двух нужны, чтобы отличать «ушло» от «дошло».
- Код ответа и текст ошибки от Bot API, номер попытки и время следующей.
- Идентификатор сообщения в чате, если он вернулся в ответе — тогда по заявке можно найти конкретное сообщение.
Отдельно заведите ключ отправки — свой номер заявки, который не меняется при повторах. Он нужен затем, чтобы повтор после таймаута не создал второе сообщение: таймаут не означает «не дошло», запрос мог дойти, а ответ потеряться. В Bot API для похожей задачи есть update_id — по нему отсеивают повторно присланные обновления при работе через webhook. И держите в голове срок: недоставленные обновления Telegram хранит не дольше 24 часов, так что вычитать накопившееся за неделю простоя не получится.
Что делать при сбое
Порядок разбора сбоя стоит зафиксировать заранее, иначе в момент инцидента все ищут виноватого вместо причины. Ниже — типовые отказы связки «сайт — Telegram» и что с каждым делать.
| Что ломается | Как это выглядит | Что делать |
|---|---|---|
| Сеть или таймаут при запросе | Клиент видит «отправлено», в чате пусто | Повторить с паузой, записать попытку |
| Ошибка 429 — превышен лимит | В пик часть сообщений не дошла | Выждать задержку из ответа, слать одну копию |
| Бот удалён из группы | Все отправки падают с ошибкой доступа | Проверять членство бота, есть резервный чат |
| Текст длиннее допустимого | Сообщение не уходит, ошибка про длину | Резать комментарий, полный текст — в журнале |
| Двойное нажатие кнопки | В чате две одинаковые заявки | Ключ отправки и блокировка кнопки |
| Повторы без ограничения | Сервис отвечает всё медленнее | Не больше 4–5 попыток, дальше резервный канал |
Повторы — отдельная дисциплина, и в ней легко сделать хуже. Amazon в AWS Builders' Library описывает три инструмента: таймаут на каждый удалённый вызов, ограниченное число повторов и паузу, растущую после каждой попытки, с добавкой случайного разброса, чтобы клиенты не повторяли синхронно. Там же предупреждение про каскад: если повторы включены на каждом из пяти уровней стека по три раза, нагрузка на нижний уровень вырастает в 243 раза. Для нашей связки вывод простой — повторять отправку должен один участник, обработчик формы, а не три звена по очереди.
И обязательный второй канал. Если отправка не удалась за отведённое число попыток, заявка уходит письмом на дежурный адрес, а в чат — строка «заявка № такой-то не доставлена». Сбой виден до того, как клиент позвонит. Проверять второй канал стоит заранее: раз в месяц — тестовая заявка при выключенном основном.
Пять проверок перед запуском
- Отправьте тестовую заявку с телефона в мобильной сети, а не только с рабочего компьютера: половина проблем видна лишь на реальном устройстве.
- Отключите на минуту доступ в интернет у обработчика и убедитесь, что заявка сохранилась, а после восстановления дошла сама.
- Отправьте 30 заявок подряд: в чат должно прийти 30 сообщений, в журнале — 30 записей без дублей.
- Заблокируйте бота в тестовом чате и проверьте, что сработали резервный канал и предупреждение.
- Прочитайте, что именно приходит в сообщении: номер заявки, контакт, суть, время и страница. Без номера разбор инцидента превращается в переписку «а помнишь, вчера звонили».
Что остаётся человеку
Интеграция убирает ручное копирование: заявка появляется в чате сама, с номером и полным текстом. Она не отменяет ответа человеку, не выбирает, что отвечать, и не решает, брать ли заказ. Автоматизация отвечает за доставку и след, человек — за решение и за разговор. Где проходит эта граница и почему её нельзя размывать, мы разбирали в материале про уровни автономии ИИ-агента.
Без журнала и повторов
- Заявка живёт только сообщением в чате
- Сбой сети не виден никому
- Дубли после двойного нажатия
- В пик часть заявок отваливается с 429
- О потере узнают от клиента
С журналом и повторами
- У каждой заявки номер и время
- Недоставленные видны в списке статусов
- Дубль отсекается ключом отправки
- Отправка идёт по одной копии с паузой
- Сбой виден до звонка клиента
С чего начать
Начать стоит с одного: выписать поля заявки, которые нужны людям в чате, и завести журнал, где они сохраняются до отправки. Дальше — повтор, резервный канал и ежедневная проверка, что бот всё ещё в группе. По одному, с замером: сколько заявок в сутки, сколько не доставлено, сколько времени до первого ответа. Неделя такого замера показывает, нужен ли свой обработчик.
Если хотите проверить свою связку — посмотрите, что мы делаем с заявками и интеграциями. Похожие задачи разобраны в кейсах, порядок работ описан в разделе подход, а обсудить конкретную схему можно через контакты. Ещё один разбор по теме — что должно быть внутри Telegram-бота для заявок.
Разберём вашу форму и чат: покажем, где теряются заявки и что исправить в первую очередь.
Получить диагностикуИсточники
- Telegram — Bots FAQ (официальная справка по ограничениям отправки) — справка Telegram для разработчиков ботов: в одном чате не рекомендуется отправлять больше одного сообщения в секунду (короткие всплески допускаются, дальше приходят ошибки 429); в группе бот не может отправить больше 20 сообщений в минуту; для массовых уведомлений — около 30 сообщений в секунду, при превышении начинаются ошибки 429. Там же описаны платные рассылки: до 1000 сообщений в секунду при балансе от 100 000 Stars и от 100 000 активных пользователей в месяц, по 0,1 Stars за сообщение сверх бесплатных 30 в секунду. Это правила платформы, а не измерение конкретного потока заявок; пересчёт 30 сообщений в секунду в 1800 в минуту — наша арифметика
- Telegram Bot API — справочник методов и объектов — документация Bot API: все запросы идут по HTTPS на api.telegram.org/bot<token>/METHOD_NAME; ответ содержит булево поле ok, при ошибке — error_code и текстовое description, а также необязательные parameters для автоматической обработки ошибки. Входящие обновления хранятся на сервере, пока бот их не получит, но не дольше 24 часов; update_id позволяет игнорировать повторно присланные обновления и восстанавливать порядок при работе через webhook
- Telegram — Marvin's Marvellous Guide to All Things Webhook — официальный гайд по webhook: сервер должен принимать POST с подсетей 149.154.160.0/20 и 91.108.4.0/22 на порты 443, 80, 88 или 8443; поддерживается IPv4, IPv6 для webhook не поддерживается; нужен TLS 1.2 и выше, редиректы не поддерживаются, CN или SAN сертификата должен совпадать с доменом. Эти условия объясняют типовую причину «webhook настроен, но обновления не приходят»; к отправке заявок с сайта в чат они не относятся — там нужен только исходящий запрос
- AWS Builders' Library — Timeouts, retries, and backoff with jitter — практика Amazon для удалённых вызовов: таймаут на каждый вызов, ограниченное число повторов, экспоненциальная пауза между попытками и случайный разброс (jitter), чтобы клиенты не повторяли одновременно; идемпотентность API как условие безопасного повтора. Пример каскада из текста: при трёх повторах на каждом из пяти уровней стека нагрузка на нижний уровень вырастает в 243 раза (3^5). Это опыт крупной распределённой системы, а не норматив для небольшого сайта, но порядок величин показывает, почему повторяет одно звено, а не все подряд