Відкрийте BotFather і перевірте, що токен актуальний і ви не робили нещодавно /revoke (відклик токена). Звірте /setcommands і потрібний scope (область: за замовчуванням/для груп/для PM) з тим, що прописано в коді. Якщо команди не збігаються за назвою/локаллю, автодоповнення й тригери не спрацюють. У більшості інцидентів достатньо оновити список команд і підставити правильний токен.
Коли токен і команди підтверджені, перевірте воронку на невеликому трафіку. Акуратна накрутка телеграм малими партіями допоможе заміряти реакцію на команди, швидкість відповіді бота й конверсію в цільову дію. Подавайте рівномірно 30–60 хвилин і порівняйте метрики до та після.
Визначте, звідки бот отримує події: webhook (вебхук) чи long polling (опитування), але не одночасно. Викличте getWebhookInfo і переконайтеся, що ваш URL відповідає 200 OK ≤ 10 секунд (без редиректів). Якщо є помилки — зніміть вебхук і тимчасово перевірте getUpdates — події мають приходити в консоль. Такий тест показує, чи проблема в мережі/сертифікаті, чи в логіці коду.
У групах із увімкненим Privacy Mode бот бачить лише команди виду /cmd і згадки @MyBot (це нормально). Перевірте, що боту надано права писати/читати там, де він «мовчить» (особливо канали/супергрупи). Введіть команду зі слешем і згадкою: /cmd@MyBot — так виключите конфлікт імен. Без прав і коректного контексту реакції не буде, навіть якщо код правильний.
Порівняйте токен у змінних середовища з токеном у BotFather — чи не роз’їхались середовища dev/stage/prod. Оновіть /setcommands і перевірте локаль описів: українська/англійська версії мають відповідати клієнту користувача. Переконайтеся, що scope (область) правильний: за замовчуванням, для груп або для приватних чатів. Такий синк прибирає «німоту» без жодної правки сервера.
Перевірте, що активний лише один канал отримання апдейтів — подвійний запуск дасть 409 Conflict. Перегляньте getWebhookInfo: чи не порожній last_error_message і чи приходить до вас POST із апдейтом. Якщо вебхук «висить», зніміть його (deleteWebhook?drop_pending_updates=true) і тимчасово ввімкніть polling. Так ви відокремите мережеві помилки від логічних.
Увімкніть детальний лог: update_id, chat_id, handler, час початку/завершення та статус. Відловлюйте непіймані винятки: падіння одного обробника «з’їдає» реакцію на команду. Зберігайте last_update_id і дотримуйтеся ідемпотентності (без повторної обробки) — це прибирає дублікати й «пропуски». Після фіксу повторно запустіть тестову команду й перевірте ланцюжок у логах.
Коли Privacy Mode увімкнено, бот не бачить звичайні повідомлення й очікує команду з явним зверненням. Використовуйте форму /cmd@MyBot або відповідь на його повідомлення (reply), щоб передати контекст. Якщо потрібно читати звичайні фрази — вимкніть /setprivacy у BotFather. Це безпечніше, ніж шукати «баг» у коді там, де все працює за правилами платформи.
У групах і каналах права різні, і без ролі адміністратора публікація може бути заборонена. Перевірте прапорці: надсилання повідомлень, посилань/медіа, закріплення/видалення повідомлень. Після зміни прав перезапустіть бота, щоб кеш чатів оновився. Відсутність прав — часта й найшвидша у виправленні причина «тиші».
Супергрупи мають антифлуд і «повільний режим» — візуально бот «мовчить» довше. Перевірте фільтри, обмеження частоти й права на посилання/медіа. Спробуйте ту саму команду в тестовій групі без обмежень, щоб виключити зовнішні фактори. Якщо в «пісочниці» все працює — коригуйте політику групи.
Код 403 у sendMessage зазвичай означає, що користувач заблокував бота або ніколи не писав йому першим. Попросіть почати діалог вручну (перше повідомлення) — це зніме заборону PM. Не ретрайте одне й те саме повідомлення — це виглядає як спам і витрачає ліміти. Логуйте такі випадки, щоб не намагатися писати в закриті особисті повідомлення знову.
Якщо бот часто відповідає поспіль, ви ризикуєте отримати 429 Too Many Requests. Увімкніть бекофф (паузи між повторами) і черги, зменшіть частоту. Позначте «вікна тиші» для масових розсилань, щоб не впертися в ліміти. Так ви збережете доставку й довіру.
Іноді команда «захована» у callback або зміненому повідомленні (edited_message), а обробника немає. Перевірте, що хендлери підписані на всі використовувані типи апдейтів: message, command, callback_query. Додайте заглушки й лог на неочікувані типи — бот перестане «падати мовчки». Це швидкий спосіб побачити справжню форму події.
Переконайтеся, що сертифікат виданий публічним CA, ланцюг повний (є проміжний сертифікат), CN відповідає домену, SNI увімкнено. Прострочений або неповний сертифікат Telegram не прийме — вебхук «онлайн», але апдейти не надходять. Перевірте дати та issuer і перезапустіть сервер після оновлення. Це 5 хвилин роботи й море зекономленого часу.
Ваш обробник повинен повертати 200 OK швидко (краще до 2 секунд, максимум 10) і без редиректів. Content-Type має відповідати відповіді, інакше Telegram видає «wrong response». Довгі операції винесіть у фон або чергу, щоб не блокувати відповідь. Так ви уникнете таймаутів і повторів.
Якщо бачите 409, значить одночасно активні webhook і polling. Зніміть вебхук: deleteWebhook?drop_pending_updates=true — і переконайтеся, що polling єдиний. Після виправлення поверніть setWebhook і перевірте getWebhookInfo — помилки мають зникнути. Тримайте один канал апдейтів у кожен момент часу.
Зберігайте last_update_id і зсувайте offset на +1, щоб не отримувати дублікати. Ставте timeout 25–30 секунд і перевіряйте, що апдейти йдуть без «дір». Якщо бачите пропуски — перевірте чергу, обробники й місце фіксації offset. Це база стабільної доставки.
Лише один процес повинен читати getUpdates, інакше отримаєте «гонки» та дублікати. Окремі воркери можуть обробляти, але не приймати апдейти. Зробіть явну «єдину точку входу» та ідемпотентність при обробці. Так ви виключите «хаос» на вході.
Перевірте таймаути HTTP-клієнта та проксі, додайте бекофф і ретраї для тимчасових збоїв. На NAT/фаєрволі переконайтеся, що вихідні з’єднання до api.telegram.org дозволені. Якщо мережа «рветься», перейдіть на вебхук і відстежуйте час відповіді. Мережа — часта причина «тиші» поза кодом.
400 Bad Request — помилка в параметрах/JSON: перевірте типи й поля. 401 Unauthorized — токен невірний/відкликаний: отримайте новий у BotFather і оновіть конфіги. 403 Forbidden — немає прав/користувач заблокував: запросіть права або попросіть користувача написати першим. 409 Conflict — запущено webhook і polling одночасно: зніміть webhook. 413 — занадто великий файл: стискайте/діліть. 429 — перевищено ліміт: вмикайте черги й бекофф.
Тримайте callback_data короткими, не кладіть туди великі JSON — зберігайте стан на сервері. Перевіряйте ліміти розмірів файлів для фото, відео, документів і аудіо. Слідкуйте за довжиною підписів і текстів, щоб не ловити «тихі» 400. Ці дрібниці регулярно «роняють» бота без явних помилок у коді.
Ставте Content-Type: application/json і валідовуйте серіалізацію. Екрануйте спецсимволи й ураховуйте Unicode/емодзі. Тестуйте крайні випадки (довгі підписи, RTL-текст), щоб не падати в проді. Це проста страховка від нічних інцидентів.
Нижче — короткі підказки, які закривають найчастіші кейси. Тримайте їх під рукою як карту навігації перед дебагом. Спочатку виключіть 409/401/403 і проблеми TLS — це «критично». Решта йде другим кроком.
Симптом Причина Перевірка/виправлення Команда не підсвічується Немає /setcommands або не той scope BotFather /setcommands, локаль, збіг із кодом Мовчить у групі Privacy Mode/немає прав /setprivacy, права адміна, /cmd@MyBot Webhook «висить» TLS/не 200 OK getWebhookInfo, логи сервера, виправити сертифікат/відповідь Подвійні апдейти offset не рухається/два воркери Зберігати last_update_id, єдиний приймач 409 Conflict Webhook + polling одночасно deleteWebhook?drop_pending_updates=true 429 Too Many Requests Перевищено ліміт Бекофф/черги, знизити частоту
Перед командами переконайтеся, що підставили справжній і ваш HTTPS-домен. У відповідях дивіться 200 OK і текст last_error_message у getWebhookInfo. Помилки TLS/timeout підкажуть напрямок виправлення. Після правки повторіть перевірку.
curl https://api.telegram.org/bot<TOKEN>/getWebhookInfo curl -F "url=https://example.com/hook" https://api.telegram.org/bot<TOKEN>/setWebhook curl "https://api.telegram.org/bot<TOKEN>/deleteWebhook?drop_pending_updates=true"Для швидкої локальної перевірки подій використовуйте getUpdates з timeout. Якщо бачите апдейти тут, а вебхук мовчить — винні мережа/TLS/обробник. Це добрий спосіб локалізувати проблему за кілька хвилин. Не тримайте polling і webhook одночасно.
curl "https://api.telegram.org/bot<TOKEN>/getUpdates?timeout=30"Перевірте токен і /setcommands, переконайтеся в коректній локалі та scope. Перевірте права в чатах і режим Privacy Mode відповідно до сценарію. Переконайтеся, що вебхук дає 200 OK і ланцюг TLS повний; увімкніть моніторинг і алерти. Зафіксуйте порядок дій для перемикання каналів (runbook) і перевірте його на тестовому середовищі.
Запишіть, який канал зараз активний, і вимкніть другий, щоб не отримати 409. Увімкніть розширений лог апдейтів і помилок та позначте час початку проблеми. Тимчасово перейдіть на polling, щоб не втрачати події, і паралельно виправляйте мережу/сертифікат/код. Після фіксу поверніться на вебхук і переконайтеся, що last_error_message порожній.
Найчастіше увімкнено Privacy Mode або боту не вистачає прав писати/читати. Використовуйте форму /cmd@MyBot або вимкніть приватний режим, якщо потрібно читати звичайні повідомлення. Дайте права адміністратора й повторіть тест. Якщо в тестовій групі все працює — проблема в налаштуваннях цільової групи.
409 — вимкніть один канал апдейтів; 429 — увімкніть черги й бекофф; 400 — перевірте JSON і довжини полів. Для 401 оновіть токен, для 403 перевірте права/блок у PM. Зніміть getWebhookInfo і логи — вони підкажуть напрямок. Рухайтеся за чек-листом зверху вниз.
Якщо getWebhookInfo показує TLS/timeout — виправляйте сертифікати й швидкість відповіді. Якщо polling отримує апдейти, а вебхук — ні, винні мережа/TLS/обробник. Перевірте SNI/CN, повний chain і час до 200 OK. Якщо й це в нормі — дивіться логи хендлерів.
Ні, для одного бота допускається лише один спосіб прийому апдейтів. Одночасний запуск призводить до 409 Conflict і дублювання подій. Тримайте «єдину точку входу» й фіксуйте порядок перемикань у runbook. Так ви уникнете «гонок» і дивних багів.