Webhook + AmoCRM + Telegram: автоматизируем обработку опросов
Ответ из опроса должен мгновенно превращаться в задачу, лида или уведомление. Показываем три рабочих сценария на Webhook без кода.
Опрос без интеграции – это файл Excel в почте. Опрос с интеграцией – это автоматизированный процесс: лид в CRM, задача оператору, алёрт в Telegram-канал. Разбираем три рабочих сценария, которые включаются за 10 минут.
Что такое Webhook в аскио
При каждом сданном ответе аскио отправляет HTTP POST на ваш URL с JSON-ом вида:
{
"surveyId": "nps-feedback-v3",
"responseId": "r_2k9a8b7c",
"submittedAt": "2026-04-22T10:30:00Z",
"answers": {
"score": 9,
"comment": "Очень понравилось, особенно граф-редактор",
"email": "user@example.com"
},
"variables": {
"userId": "user-42",
"plan": "pro"
},
"respondent": {
"userAgent": "Mozilla/5.0 ...",
"language": "ru",
"country": "RU"
}
}
Дальше – на ваше усмотрение. Передать в CRM, в чат, в свою БД, в n8n / Make / Zapier для дальнейшего ветвления.
Сценарий 1: NPS-критики автоматически идут в AmoCRM
Задача: клиент поставил 0–6 → создаём лида в AmoCRM, тегаем «retention-risk», вешаем задачу менеджеру в течение 2 часов.
Шаги:
- В аскио в редакторе опроса откройте «Интеграции» → добавьте Webhook.
- URL:
https://your-bridge.example.com/askyo-to-amo– это ваш эндпоинт. Можно поднять на n8n / make.com или написать AWS Lambda на 30 строк. - В аскио поставьте фильтр: «отправлять только если answer.score ≤ 6». Это делается в одном клике, без кода.
- На стороне моста:
// Псевдокод – реальная реализация на n8n / Lambda / любом стеке
async function handle(req, res) {
const { answers, respondent } = req.body;
// Создаём лида в AmoCRM
const lead = await amo.leads.create({
name: `NPS ${answers.score} – риск ухода`,
custom_fields_values: [
{ field_id: AMO_FIELD_NPS, values: [{ value: answers.score }] },
{ field_id: AMO_FIELD_COMMENT, values: [{ value: answers.comment }] },
{ field_id: AMO_FIELD_EMAIL, values: [{ value: answers.email }] },
],
_embedded: { tags: [{ name: 'retention-risk' }] },
});
// Задача менеджеру: связаться в течение 2 часов
await amo.tasks.create({
entity_id: lead.id,
entity_type: 'leads',
text: `Связаться с критиком NPS (${answers.score}). Комментарий: ${answers.comment}`,
complete_till: Math.floor(Date.now() / 1000) + 2 * 3600,
});
res.status(200).send('ok');
}
Готово. Каждый раз, когда критик отправляет ответ, в AmoCRM появляется лид и задача. Менеджер видит её в общем потоке.
Сценарий 2: важные ответы в Telegram-чат команды
Задача: все ответы от платящих клиентов (plan == 'pro') –
сразу в групповой Telegram продакт-команды, чтобы видели в реалтайме.
Шаги:
- В Telegram создайте бота через @BotFather. Получите токен.
- Добавьте бота в групповой чат, узнайте
chat_id(черезhttps://api.telegram.org/bot<TOKEN>/getUpdatesпосле любого сообщения в чат). - В аскио добавьте Webhook с фильтром
variables.plan == 'pro'. - Используйте готовый шаблон «Telegram via Webhook» – вписываете только токен и chat_id, текст шаблонизируется автоматически:
🔔 Pro-клиент ответил на «NPS-feedback»
⭐️ Оценка: {{ answers.score }}/10
💬 Комментарий: {{ answers.comment }}
👤 userId: {{ variables.userId }}
🌐 Страна: {{ respondent.country }}
🔗 Открыть в аскио: https://app.askyo.ru/r/{{ responseId }}
Никакого кода – шаблон в визуальном редакторе. За 5 минут.
Сценарий 3: ответы в Google Sheets для маркетинга
Старая школа, но работает: маркетологи любят видеть данные в табличке.
Шаги:
- В Google Sheets создайте таблицу, добавьте Apps Script:
function doPost(e) {
const sheet = SpreadsheetApp.getActiveSheet();
const data = JSON.parse(e.postData.contents);
sheet.appendRow([
new Date(data.submittedAt),
data.responseId,
data.answers.score,
data.answers.comment,
data.answers.email,
data.variables.utmSource ?? '',
]);
return ContentService.createTextOutput('ok');
}
- Deploy → Web app → Anyone can access.
- Скопируйте URL вебхука.
- В аскио: Интеграции → Webhook → вставляете URL. Всё.
Каждый ответ – новая строка в Google Sheets. Никаких CSV-выгрузок руками.
Что делать с failed-доставкой
Webhooks ненадёжны. Сеть, таймауты, ваш сервер упал. аскио:
- Делает 3 retry с экспоненциальным backoff (5с, 30с, 5 мин).
- Хранит все попытки в журнале с кодом ответа и временем.
- На 4-й неудачной – письмо в почту owner-а опроса и пометка
ответа как
webhook_failed. - При успехе позднее – статус сам перепишется.
Для критичных интеграций (платежи, биллинг) лучше использовать polling через API – мы такое тоже умеем, но это уже отдельная статья.
Чек-лист безопасности
Webhook принимает данные с открытого интернета. Защищаемся:
- HMAC-подпись. аскио подписывает каждый запрос заголовком
X-Askyo-Signature: sha256=.... Проверяйте его на стороне моста. - Allow-list IP. Все запросы идут из нашей подсети 185.x.x.x/24 (фиксирован, опубликован в security.txt).
- Idempotency. Используйте
responseIdкак ключ дедупликации – retry могут привести к двум доставкам, не плодите дубли. - Rate limit. При шторме ответов (тысячи в минуту) ставьте очередь между Webhook и CRM – AmoCRM имеет свой rate limit.
Когда Webhook не нужен
Если интеграция простая и нужна раз в день, а не в реалтайме – используйте экспорт CSV / Google Sheets / API-pull. Webhook оправдан, когда:
- нужна быстрая реакция (минуты),
- ответ ветвится по логике («только критики»),
- есть downstream-сервис с собственной логикой обработки.
Иначе можно обойтись без них и спать спокойно.
Готовый шаблон под n8n мы выложили в public GitHub-репозитории – форкайте и адаптируйте под свой стек.