Форма на сайте и Telegram: путь заявки, сбои и журнал отправок

Форму на сайте и Telegram соединяют не «кнопкой», а двумя звеньями: страницей, которая принимает обращение, и программой, которая после отправки делает запрос к Bot API. Между ними — самое хрупкое место: клиент уже нажал «Отправить», а сообщение в чат ещё не попало. Разберём схему из шести шагов, ограничения Telegram и журнал отправок, из которого видно, что именно не дошло.

Коротко

  • Интеграция — это два звена: форма на сайте и обработчик на сервере, который отправляет сообщение в чат через Bot API. Если обработчик не сохраняет заявку до отправки, обычный сбой сети превращается в потерю клиента.
  • Лимиты Telegram из официальной справки: не больше одного сообщения в секунду в один чат, не больше 20 сообщений в минуту в группу и около 30 в секунду на весь бот — при превышении приходит ошибка 429.
  • Недоставленные обновления Telegram хранит не дольше 24 часов, поэтому «подождём, пока поднимется сервис» работает только в пределах суток.
  • Журнал отправок обязателен: время, поля заявки, статус, номер попытки, код и текст ошибки. Без него нельзя ни доказать, что заявка была, ни отличить сбой доставки от сбоя самой формы.
  • Повторять отправку нужно с растущей паузой и ограниченным числом попыток: повтор «каждую секунду» усиливает нагрузку на сервис, который уже не справляется.

Что соединяет интеграция сайта с Telegram

Интеграция сайта с Telegram — это связка из двух частей: страница с формой и обработчик на сервере. Клиент заполняет поля и нажимает «Отправить», страница передаёт данные обработчику, а тот формирует запрос к Bot API методом sendMessage и указывает, в какой чат положить сообщение. Сам Telegram о вашем сайте ничего не знает: он принимает готовый текст и доставляет его туда, где сидят ответственные.

Отсюда главное правило: мессенджер — последняя миля, а не хранилище заявок. К моменту отправки в чат заявка должна уже существовать отдельно, в журнале или базе. Тогда любой сбой читается как «пока не доставлено», а не как «клиент не приходил». Если же обращение живёт только в переписке, разбор потерь превращается в догадки — об этом мы писали в материале почему заявки теряются в Telegram.

Стоит разделить две задачи, которые часто смешивают. Доставить сообщение о заявке людям — здесь нужен только исходящий HTTPS-запрос. Принимать сообщения от клиентов ботом и отвечать — это уже другой сценарий: ему нужны webhook, домен и сертификат.

Два способа собрать связку

Первый способ — готовый сервис: конструктор форм или модуль, где в настройках указывают токен бота и нужный чат, а отправку сервис берёт на себя. Второй — свой обработчик: скрипт на сайте или отдельный сервис, который принимает данные формы, проверяет их, пишет в журнал и сам вызывает Bot API.

Готовый сервис запускается за час и не требует программиста. Плата — зависимость: журнал живёт у подрядчика, формат сообщения ограничен шаблоном, а вместе с сервисом пропадает и история. Свой обработчик даёт контроль над журналом, видом сообщения и поведением при ошибке. Критерий простой: меньше десятка заявок в день — хватит готового сервиса, если он показывает историю отправок. Если по заявке считается выручка, свой обработчик окупается на первом же разборе инцидента.

Путь заявки: шесть шагов

Путь заявки: от формы до подтвержденияШесть шагов от отправки формы до подтверждения клиенту; четвёртый шаг — доставка в Telegram — отмечен как место потери1Форма на сайтеклиент отправил2Проверка полейпустые не проходят3Запись в журналномер и время4Отправка в ботзапрос к Bot APIсеть или лимит — заявкинет5Сообщение в чатеувидел ответственный6Подтверждениеклиент видит номерКрасным — место, где заявка теряется: до чата она не дошла.
Рисунок можно прокрутить вбок →
Схема процесса: шесть шагов от формы до подтверждения клиенту. Цифр здесь нет — рисунок показывает порядок и место, где связка чаще всего рвётся, если у обработчика не сохраняется заявка и не настроены повторы.

Четвёртый шаг — точка, где заканчивается ваша система и начинается чужая. До него заявка существует в ваших файлах, после — только как сообщение в чужом интерфейсе. Ошибка здесь не видна ни клиенту, ни менеджеру: клиент получил «спасибо, заявка принята», менеджер ничего не увидел. Поэтому подтверждение показывайте после ответа Bot API, а не после нажатия кнопки: в ответе есть поле ok, а при ошибке — description с причиной.

Лимиты, из-за которых заявки не доходят

Telegram прямо описывает ограничения в справке для разработчиков: в один чат не стоит отправлять больше одного сообщения в секунду, в группе бот не может отправить больше 20 сообщений в минуту, а на весь бот приходится около 30 сообщений в секунду. При превышении приходит ошибка 429, и в ответе бывает параметр с задержкой, после которой попытку имеет смысл повторить.

Сколько сообщений в минуту выдерживает TelegramСравнение лимитов Bot API: 20 сообщений в минуту в одну группу против примерно 1800 в минуту на весь бот0500100015002000сообщений в минуту по данным справки Telegramв одну группу20на весь бот≈1800
Рисунок можно прокрутить вбок →
Лимиты из справки Telegram: не больше 20 сообщений в минуту в группу и около 30 сообщений в секунду на весь бот. Число 1800 — наш пересчёт в минуту (30 × 60), а не отдельный лимит; лимит в один чат — одно сообщение в секунду, на рисунке его нет, потому что шкала в минутах.

Для потока заявок этих лимитов хватает с запасом: 20 сообщений в минуту — это 1200 в час. Ловушка в другом: одно обращение часто отправляют трижды — менеджеру, в общий чат отдела, руководителю. Три копии уменьшают пропускную способность группы втрое, а в пик — после рассылки или вечером — лимит выбирается мгновенно, и копии отваливаются с ошибкой 429. Надёжнее слать одну копию в один чат, а остальным показывать заявку из своей системы.

Платные рассылки здесь не нужны. Если поток выше 30 сообщений в секунду, Telegram предлагает платные рассылки — до 1000 в секунду, но для включения нужно 100 000 Stars на балансе бота и 100 000 активных пользователей в месяц. Для приёма заявок это не нужно: упирается всё не в лимит, а в журнал и ответственного.

Журнал отправок: минимальный набор полей

Журнал — единственный способ доказать, что заявка была, и одновременно ответ на вопрос «что именно сломалось»: форма, обработчик или доставка в чат. Держать его можно в базе, в таблице или в файле, важно не место, а набор полей.

  • Номер заявки и время отправки формы — по ним ищут обращение и считают срок ответа.
  • Все поля, которые ввёл клиент, включая комментарий целиком: в чат уходит сокращённый вариант.
  • Адрес страницы, с которой пришла заявка, и источник перехода — без этого не понять, какая форма работает.
  • Статус: принята, отправлена, доставлена, ошибка. Три состояния вместо двух нужны, чтобы отличать «ушло» от «дошло».
  • Код ответа и текст ошибки от Bot API, номер попытки и время следующей.
  • Идентификатор сообщения в чате, если он вернулся в ответе — тогда по заявке можно найти конкретное сообщение.

Отдельно заведите ключ отправки — свой номер заявки, который не меняется при повторах. Он нужен затем, чтобы повтор после таймаута не создал второе сообщение: таймаут не означает «не дошло», запрос мог дойти, а ответ потеряться. В Bot API для похожей задачи есть update_id — по нему отсеивают повторно присланные обновления при работе через webhook. И держите в голове срок: недоставленные обновления Telegram хранит не дольше 24 часов, так что вычитать накопившееся за неделю простоя не получится.

Что делать при сбое

Порядок разбора сбоя стоит зафиксировать заранее, иначе в момент инцидента все ищут виноватого вместо причины. Ниже — типовые отказы связки «сайт — Telegram» и что с каждым делать.

Типовые отказы: как они выглядят снаружи и что делать обработчику.
Что ломаетсяКак это выглядитЧто делать
Сеть или таймаут при запросеКлиент видит «отправлено», в чате пустоПовторить с паузой, записать попытку
Ошибка 429 — превышен лимитВ пик часть сообщений не дошлаВыждать задержку из ответа, слать одну копию
Бот удалён из группыВсе отправки падают с ошибкой доступаПроверять членство бота, есть резервный чат
Текст длиннее допустимогоСообщение не уходит, ошибка про длинуРезать комментарий, полный текст — в журнале
Двойное нажатие кнопкиВ чате две одинаковые заявкиКлюч отправки и блокировка кнопки
Повторы без ограниченияСервис отвечает всё медленнееНе больше 4–5 попыток, дальше резервный канал

Повторы — отдельная дисциплина, и в ней легко сделать хуже. Amazon в AWS Builders' Library описывает три инструмента: таймаут на каждый удалённый вызов, ограниченное число повторов и паузу, растущую после каждой попытки, с добавкой случайного разброса, чтобы клиенты не повторяли синхронно. Там же предупреждение про каскад: если повторы включены на каждом из пяти уровней стека по три раза, нагрузка на нижний уровень вырастает в 243 раза. Для нашей связки вывод простой — повторять отправку должен один участник, обработчик формы, а не три звена по очереди.

И обязательный второй канал. Если отправка не удалась за отведённое число попыток, заявка уходит письмом на дежурный адрес, а в чат — строка «заявка № такой-то не доставлена». Сбой виден до того, как клиент позвонит. Проверять второй канал стоит заранее: раз в месяц — тестовая заявка при выключенном основном.

Пять проверок перед запуском

  1. Отправьте тестовую заявку с телефона в мобильной сети, а не только с рабочего компьютера: половина проблем видна лишь на реальном устройстве.
  2. Отключите на минуту доступ в интернет у обработчика и убедитесь, что заявка сохранилась, а после восстановления дошла сама.
  3. Отправьте 30 заявок подряд: в чат должно прийти 30 сообщений, в журнале — 30 записей без дублей.
  4. Заблокируйте бота в тестовом чате и проверьте, что сработали резервный канал и предупреждение.
  5. Прочитайте, что именно приходит в сообщении: номер заявки, контакт, суть, время и страница. Без номера разбор инцидента превращается в переписку «а помнишь, вчера звонили».

Что остаётся человеку

Интеграция убирает ручное копирование: заявка появляется в чате сама, с номером и полным текстом. Она не отменяет ответа человеку, не выбирает, что отвечать, и не решает, брать ли заказ. Автоматизация отвечает за доставку и след, человек — за решение и за разговор. Где проходит эта граница и почему её нельзя размывать, мы разбирали в материале про уровни автономии ИИ-агента.

Без журнала и повторов

  • Заявка живёт только сообщением в чате
  • Сбой сети не виден никому
  • Дубли после двойного нажатия
  • В пик часть заявок отваливается с 429
  • О потере узнают от клиента

С журналом и повторами

  • У каждой заявки номер и время
  • Недоставленные видны в списке статусов
  • Дубль отсекается ключом отправки
  • Отправка идёт по одной копии с паузой
  • Сбой виден до звонка клиента
Одна и та же форма: слева — что видно, если связку собрали на скорую руку, справа — что добавляют журнал, повторы и второй канал.

С чего начать

Начать стоит с одного: выписать поля заявки, которые нужны людям в чате, и завести журнал, где они сохраняются до отправки. Дальше — повтор, резервный канал и ежедневная проверка, что бот всё ещё в группе. По одному, с замером: сколько заявок в сутки, сколько не доставлено, сколько времени до первого ответа. Неделя такого замера показывает, нужен ли свой обработчик.

Если хотите проверить свою связку — посмотрите, что мы делаем с заявками и интеграциями. Похожие задачи разобраны в кейсах, порядок работ описан в разделе подход, а обсудить конкретную схему можно через контакты. Ещё один разбор по теме — что должно быть внутри Telegram-бота для заявок.

Разберём вашу форму и чат: покажем, где теряются заявки и что исправить в первую очередь.

Получить диагностику

Источники

  1. Telegram — Bots FAQ (официальная справка по ограничениям отправки) — справка Telegram для разработчиков ботов: в одном чате не рекомендуется отправлять больше одного сообщения в секунду (короткие всплески допускаются, дальше приходят ошибки 429); в группе бот не может отправить больше 20 сообщений в минуту; для массовых уведомлений — около 30 сообщений в секунду, при превышении начинаются ошибки 429. Там же описаны платные рассылки: до 1000 сообщений в секунду при балансе от 100 000 Stars и от 100 000 активных пользователей в месяц, по 0,1 Stars за сообщение сверх бесплатных 30 в секунду. Это правила платформы, а не измерение конкретного потока заявок; пересчёт 30 сообщений в секунду в 1800 в минуту — наша арифметика
  2. Telegram Bot API — справочник методов и объектов — документация Bot API: все запросы идут по HTTPS на api.telegram.org/bot<token>/METHOD_NAME; ответ содержит булево поле ok, при ошибке — error_code и текстовое description, а также необязательные parameters для автоматической обработки ошибки. Входящие обновления хранятся на сервере, пока бот их не получит, но не дольше 24 часов; update_id позволяет игнорировать повторно присланные обновления и восстанавливать порядок при работе через webhook
  3. 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 настроен, но обновления не приходят»; к отправке заявок с сайта в чат они не относятся — там нужен только исходящий запрос
  4. AWS Builders' Library — Timeouts, retries, and backoff with jitter — практика Amazon для удалённых вызовов: таймаут на каждый вызов, ограниченное число повторов, экспоненциальная пауза между попытками и случайный разброс (jitter), чтобы клиенты не повторяли одновременно; идемпотентность API как условие безопасного повтора. Пример каскада из текста: при трёх повторах на каждом из пяти уровней стека нагрузка на нижний уровень вырастает в 243 раза (3^5). Это опыт крупной распределённой системы, а не норматив для небольшого сайта, но порядок величин показывает, почему повторяет одно звено, а не все подряд

Читайте также

Что мы делаем

Заявка

Обсудим вашу задачу

Опишите процесс, который отнимает время, — вернёмся с планом автоматизации и оценкой.

Заявка получена

Мы свяжемся с вами с вопросами для диагностики. Обычно отвечаем в течение рабочего дня.

Не удалось отправить

Что-то пошло не так. Напишите нам в Telegram или на i@islenkov.ru.