Duck Float
Усі статті
01.03.20267 хв читання

Вебхуки для підтримки: як зʼєднати тикети з вашими системами

Підтримка рідко живе в ізоляції. Коли створюється тикет, ви можете захотіти повідомити команду в чат, оновити CRM, порахувати метрику чи запустити внутрішній процес. Робити це вручну — марнування часу й джерело помилок: хтось забуде перевірити нову скриньку, хтось скопіює дані з опискою, хтось згадає про тикет лише за два дні.

Саме тут у гру вступають вебхуки: механізм, який дозволяє вашій системі дізнаватися про події підтримки автоматично, у момент, коли вони стаються. У цій статті — що таке вебхук, які події варто слухати, як виглядає типовий payload, як написати простий обробник і як зробити його надійним, навіть якщо ви ще ніколи не писали інтеграцій.

Що таке вебхук простими словами

Вебхук — це «дзвінок навпаки». Замість того щоб ваша система постійно питала «а що там нового?» (це називається polling), система підтримки сама надсилає HTTP-запит на вказаний вами URL щоразу, коли стається подія.

Уявіть різницю між дзвінком у двері й постійним визиранням у вічко: перше — це вебхук, друге — опитування. Ви один раз даєте адресу свого обробника — і далі просто отримуєте сповіщення, коли щось справді сталося. Це і швидше, і надійніше, і значно дешевше за постійні запити «чи є щось нове» раз на кілька секунд.

Технічно вебхук — це звичайний POST-запит на ваш ендпоінт. Не потрібні спеціальні бібліотеки чи протоколи: достатньо сервера, що вміє приймати HTTP-запити і повертати статус-код. Такий підхід підходить будь-якій команді — від одного розробника з невеликим скриптом до великого бекенду з чергами й мікросервісами, бо складність обробника завжди можна нарощувати поступово.

Які події варто слухати

Не кожна подія підтримки заслуговує на окрему автоматизацію, але деякі варто слухати майже завжди:

  • Створено тикет — щоб одразу сповістити команду в робочому чаті або завести запис у CRM. Це найчастіший тригер: перше звернення нового клієнта часто важливіше за все інше.
  • Нове повідомлення — щоб реагувати на відповідь клієнта в реальному часі, наприклад підняти пріоритет, якщо клієнт написав повторно без відповіді оператора.
  • Змінено статус — щоб рахувати метрики (скільки тикетів закрито за день), закривати повʼязані внутрішні задачі або знімати позначку «потребує уваги».
  • Призначено оператора — щоб синхронізувати навантаження з внутрішнім таск-трекером або нагадати оператору в особистому чаті.
  • Додано тег — щоб маршрутизувати тикет далі: наприклад, тег «білінг» може автоматично сповіщати окрему команду.

Вибирайте події виходячи з того, яке рішення ви приймете у відповідь. Якщо на подію немає дії — можливо, її й не варто слухати. Підписатися одразу на всі типи подій спокусливо, але на практиці це лише збільшує навантаження на ваш обробник і кількість коду, який ніколи не виконує корисної роботи.

Як виглядає payload

Зазвичай вебхук приходить як POST-запит із JSON-тілом: тип події, ідентифікатор тикета, джерело (Telegram, віджет, API) і корисні дані — текст повідомлення, статус, теги. Ось ілюстративний приклад того, як може виглядати таке тіло для події зміни статусу:

{
  "event": "ticket.status_changed",
  "ticket_id": "8f21a4",
  "source": "widget",
  "occurred_at": "2026-03-01T10:15:00Z",
  "data": {
    "previous_status": "open",
    "new_status": "resolved"
  }
}

Це саме приклад структури, а не гарантована специфікація конкретного постачальника — назви полів можуть відрізнятися. Головне, що ви завжди отримуєте достатньо контексту, щоб зрозуміти, що сталося, з яким тикетом і звідки він прийшов, без додаткового запиту до API.

Ваш обробник читає це тіло й вирішує, що робити. Найважливіше правило на боці обробника — швидко відповісти кодом 200. Якщо ваша логіка складна (звернення до кількох сервісів, повільні запити до бази), важку роботу краще винести в чергу, а не тримати відправника вебхука на лінії в очікуванні відповіді.

Приклад простого обробника

Обробник вебхука не мусить бути складним. У найпростішому вигляді це два кроки: прийняти й підтвердити подію, а потім — окремо — обробити її.

function handleWebhook(request):
    event = parseJson(request.body)
    if not isValidSignature(request):
        return 401
    enqueue(event)
    return 200

function processQueue():
    for event in queue:
        if event.type == "ticket.created":
            notifyTeamChat(event)
        else if event.type == "ticket.status_changed":
            updateCrmRecord(event)
        else if event.type == "message.new":
            maybeEscalate(event)

Розділення на «прийняти» і «обробити» — не примха, а страховка. Якщо ваш notifyTeamChat чи updateCrmRecord впаде або сповільниться, це не вплине на швидкість відповіді на сам вебхук, і відправник не почне повторювати запит через таймаут.

Поради щодо надійності

Кілька простих правил рятують від більшості проблем із вебхуками на практиці:

  • Робіть обробник ідемпотентним. Той самий вебхук може прийти двічі — через збій мережі чи повторну спробу відправника. Повторна обробка не повинна ламати дані: перевіряйте, чи вже застосована ця подія, за її ідентифікатором.
  • Перевіряйте підпис, якщо він є, щоб приймати лише справжні події, а не підробки від зловмисника, який вгадав ваш URL.
  • Не блокуйте відповідь. Прийняли, поставили в чергу, відповіли 200 — а вже потім робите основну роботу. Довга відповідь часто інтерпретується як помилка й провокує зайві повтори.
  • Логуйте кожну подію, щоб мати змогу відтворити, що і коли прийшло, якщо щось пішло не так через тиждень.
  • Майте план на збій. Якщо ваш обробник впав і не відповів, добра система підтримки повторить спробу пізніше — але ваш код має бути готовий обробити «запізнілу» подію коректно.

Жодна з цих порад не вимагає складної інфраструктури — навіть невелика черга в памʼяті чи проста таблиця «оброблені події» вирішує 90% типових проблем. Якщо ви лише починаєте, не обовʼязково будувати ідеальну систему одразу: почніть з логування і простої перевірки за ідентифікатором події, а чергу й підпис додасте, коли інтеграція справді почне жити в проді.

Типові сценарії використання

На практиці вебхуки найчастіше застосовують для кількох повторюваних задач:

  • Сповіщення команди. Новий тикет одразу зʼявляється в робочому чаті — ніхто не пропустить перше звернення клієнта.
  • Синхронізація з внутрішніми інструментами. Статус тикета оновлює запис у вашій системі обліку клієнтів без ручного копіювання.
  • Автоматичні дії за тегом. Тег «терміново» може створювати задачу у внутрішньому трекері або сповіщати відповідального напряму.
  • Аналітика в реальному часі. Замість щоденного експорту даних ви накопичуєте події одразу, коли вони стаються.

Це той самий принцип, що лежить в основі ширшої ідеї — автоматизувати підтримку, не втрачаючи довіри клієнтів: автоматизація працює найкраще, коли вона реагує на реальні події, а не підмінює живу відповідь оператора.

Почніть з однієї-двох подій, які реально розвʼязують проблему вашої команди — наприклад, сповіщення про новий тикет, — а решту додавайте поступово, коли побачите, що черговий ручний процес знову й знову зʼїдає час.

Вебхуки й API — дві сторони інтеграції

Вебхуки відповідають на питання «як дізнатися, що щось сталося», а API — «як самому щось зробити»: створити тикет, дописати повідомлення, змінити статус. Разом вони дають повний контроль над інтеграцією підтримки у ваші процеси: вебхук повідомляє про подію, а у відповідь ви через API вносите зміни або запитуєте додаткові деталі.

Якщо вебхуки — це вхідний потік подій, то API — вихідний потік дій. Більшість повноцінних інтеграцій використовують обидва напрямки одночасно. Про другу сторону — стаття про API підтримки.

Як це реалізовано в Duck Float

У Duck Float є вебхуки та журнал подій: ваша система дізнається про кожну зміну тикета — від створення до нового повідомлення й зміни статусу до призначення оператора чи додавання тега — і може реагувати автоматично. Разом із публічним API це дозволяє вбудувати підтримку в будь-який ваш процес, без ручного перенесення даних між системами.

А всередині кожне звернення — незалежно від того, прийшло воно з Telegram-бота, чат-віджета на сайті чи через API, — однаково стає тикетом з історією, статусом і тегами. AI готує чернетку відповіді мовою клієнта, оператор лише підтверджує її клавішею Tab або редагує — нічого не йде клієнту без перегляду людиною. На час бети Duck Float безкоштовний. Хочете підключити вебхуки до своїх процесів або просто подивитися, як це працює, — напишіть нам через віджет на цьому сайті.

Спробуйте Duck Float у своїй команді

Безкоштовно на час бети. Підключення займає кілька хвилин.

Створити акаунт