Интеграции

Как подключить WhatsApp к CRM через API и вебхуки

Обновлено 6 мин чтения

Подключить WhatsApp к CRM можно и без готового модуля в маркетплейсе. Нужны две вещи: CRM умеет отправлять вебхуки и принимать запросы по API, а wapi.kz умеет то же самое со стороны WhatsApp. Между ними ставится небольшой обработчик.

Схема одна для amoCRM, Bitrix24, 1С и самописных систем. Ниже — оба направления, поиск контакта по телефону, авторство сообщений, где держать обработчик и что честно не получится. Детали по конкретным системам — на страницах amoCRM, Bitrix24 и 1С.

Общая схема

НаправлениеЧто запускаетЧто делает обработчикЗапрос
CRM → WhatsAppСмена этапа сделки, робот или вебхук CRMБерёт телефон и данные сделки, собирает текстPOST /messages/send в wapi.kz
WhatsApp → CRMВебхук wapi.kz message или message.outИщет контакт по телефону, пишет примечание или создаёт лидAPI вашей CRM

Обработчик нужен, потому что CRM не знает формата нашего API, а мы — формата вашей CRM. Обычно это несколько десятков строк кода или сценарий из пары блоков в n8n или Make.

Из CRM в WhatsApp

Типичные случаи: заказ подтверждён — клиенту уходит сообщение; сделка перешла на этап «Счёт выставлен» — клиент получает PDF; запись создана — приходит подтверждение.

Как это устроено:

  1. В CRM настраиваете событие: робот или исходящий вебхук на этапе воронки. В amoCRM это действие «Webhook» в цифровой воронке, в Bitrix24 — робот «Webhook» в автоматизации или исходящий вебхук на события сделок. Точные названия сверяйте с документацией вашей CRM.
  2. CRM отправляет запрос на адрес обработчика. Часто в нём только id сделки — тогда обработчик сам запрашивает у CRM телефон и данные по её API.
  3. Обработчик приводит телефон к формату API и вызывает POST /messages/send. Параметры отправки — в документации.

Телефоны в CRM хранятся как попало: «+7 (701) 123-45-67», «8 701 123 4567», «7011234567». API нужен номер цифрами с кодом страны, а «8» в начале для API — не код Казахстана, сообщение уйдёт не туда. Нормализуйте:

JavaScript
function normalizePhone(raw) {
  let d = String(raw || "").replace(/\D/g, "");                  // только цифры
  if (d.length === 11 && d.startsWith("8")) d = "7" + d.slice(1); // 8 701… → 7 701…
  if (d.length === 10) d = "7" + d;                                // 701… → 7701…
  return d.length >= 11 && d.length <= 15 ? d : null;              // иначе — не номер
}

Если не уверены, что у клиента есть WhatsApp, проверьте номер через POST /contacts/check до первой отправки — до 200 проверок в сутки на номер. Меньше ошибок доставки — выше индекс доверия номера.

Из WhatsApp в CRM

Чтобы переписка из WhatsApp попадала в CRM, обработчик принимает вебхуки. Клиент пишет на ваш номер — событие message приходит на обработчик. Дальше:

  1. Проверить секрет в адресе (?token=…) — подписи у вебхука нет.
  2. Сразу ответить 200: на ответ есть 10 секунд, а запросы к CRM бывают медленными.
  3. Взять телефон из payload.from (77011234567@c.us). Группы (@g.us) обычно пропускают.
  4. Найти контакт в CRM по телефону. Надёжнее сравнивать по последним 10 цифрам: так совпадут и «+7 701…», и «8 701…».
  5. Нашли — добавить примечание в сделку или комментарий в таймлайн. Не нашли — создать лид.

Не создавайте лид на каждое сообщение: клиент пишет «Здравствуйте», «Сколько стоит?», «Есть в наличии?» — это один лид и три примечания.

JavaScript
app.post("/wapi/hook", express.json(), async (req, res) => {
  if (req.query.token !== process.env.WAPI_HOOK_TOKEN) return res.sendStatus(403);
  res.sendStatus(200);                               // ответили сразу, дальше — CRM
  const e = req.body;
  if (!["message", "message.out"].includes(e.event)) return;
  const chat = e.payload.from;                        // чат всегда в from — и у message, и у message.out
  if (!chat || !chat.endsWith("@c.us")) return;      // только личные чаты
  const phone = chat.split("@")[0];
  const author = e.event === "message" ? "Клиент" : "Менеджер (с телефона)";
  const text = e.payload.hasMedia ? `${e.payload.body || ""} [вложение: GET /messages/${e.wapi.message_id} → media.url]` : e.payload.body;
  try {
    const contact = await crm.findContactByPhone(phone.slice(-10)); // ваш запрос к API CRM
    if (contact) await crm.addNote(contact, `${author}: ${text}`);
    else if (e.event === "message") await crm.createLead({ phone, text });
  } catch (err) {
    console.error("crm:", err.message);              // повтора не будет — логируйте
  }
});

crm.findContactByPhone, crm.addNote и crm.createLead — ваши функции поверх API CRM. В amoCRM это REST API v4 (/api/v4/leads, примечания /api/v4/leads/{id}/notes), в Bitrix24 — методы crm.lead.add и crm.timeline.comment.add через входящий вебхук. Детали полей сверяйте с документацией CRM.

Вебхуки не отправляются повторно. Если обработчик был недоступен, догрузите пропущенное из журнала: GET /messages?since=… — подробнее в гайде про историю сообщений.

Авторство: кто написал

Номер остаётся на телефоне, поэтому в одном чате пишут и CRM, и менеджер, и клиент. Чтобы в карточке было понятно, кто что сказал:

Кто написалКак узнатьЧто писать в CRM
КлиентВебхук message, в журнале source: "contact"«Клиент: …»
Менеджер с телефона или WhatsApp WebВебхук message.out, source: "phone"«Менеджер: …»
Ваша интеграцияsource: "api", вебхука нетЗапишите сами в момент отправки
ИИ-агентsource: "mcp"«Агент: …»

Сообщения, отправленные через API, отдельным вебхуком не приходят — вы и так знаете о них из ответа на запрос. Поэтому примечание «Отправлено клиенту: …» обработчик пишет в CRM сразу после POST /messages/send. Значения поля — в разделе source.

Ключ номера для подрядчика

Если интеграцию делает подрядчик, не отдавайте ему ключ аккаунта. Выпустите ключ номера в карточке номера: он работает только с одним номером, не видит баланс и данные аккаунта, отзывается отдельно — до 5 ключей на номер. Закончили работу — отозвали ключ, остальное не трогаете. Подробнее — ключ на каждый номер и раздел авторизации.

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

Где держать обработчик

  • Свой сервер или облачная функция. Полный контроль и любая логика. Нужен публичный адрес по https, перенаправления мы не выполняем.
  • n8n без кода. Узел Webhook принимает событие, HTTP Request отправляет запрос в CRM или в wapi.kz.
  • Make без кода. Модули Webhooks → Custom webhook и HTTP → Make a request.
  • Google Таблицы как мини-CRM. Веб-приложение Apps Script отвечает перенаправлением, поэтому вебхук лучше принимать через n8n или Make и писать в таблицу оттуда.
  • 1С. Входящие — через HTTP-сервисы опубликованной базы или промежуточный скрипт, отправка — встроенными HTTPСоединение и HTTPЗапрос.

Что честно не получится

  • Переписка не появится в окне чатов CRM как встроенный канал. Окна чатов в CRM работают через отдельные приложения-коннекторы, у нас их нет. Сообщения попадут в карточку примечаниями или комментариями.
  • Операторского чата у нас нет. Менеджеры отвечают с телефона или из WhatsApp Web. Можно сделать в CRM кнопку или робота, который отправит ответ через API.
  • Готовых модулей в маркетплейсах CRM нет. Только API и вебхуки.
  • Файлы не приходят в самом вебхуке. В событии — признак hasMedia: true, а файл сохраняется у нас и через несколько секунд доступен по ссылке media.url в GET /messages/{id}. Чтобы он попал в карточку CRM, заберите его по этой ссылке и загрузите в CRM.
  • Отправки в группы через API нет — только личные чаты.

Настроим за вас

Если не хотите разбираться сами, оставьте заявку в кабинете: настроим интеграцию WhatsApp с CRM или вашим сервисом. Типовой случай занимает около часа. Вопросы — в поддержку в Telegram. Сначала зарегистрируйтесь и подключите номер — интеграция начинается с него.

Частые вопросы

Есть ли готовый виджет wapi.kz для amoCRM или Bitrix24?

Нет. Интеграция делается через вебхуки CRM и наш API — своим обработчиком, в n8n или Make. Можем настроить по заявке.

Можно ли отвечать клиенту прямо из карточки сделки?

Да, если сделать в CRM кнопку или робота, который вызывает POST /messages/send. Клиент получит обычное сообщение с вашего номера, а в CRM ответ будет примечанием.

Сколько номеров можно подключить к одной CRM?

По умолчанию до 10 номеров на аккаунт, больше — по заявке. У каждого номера свой вебхук, а поле wapi.number_id в событии показывает, на какой номер пришло сообщение. Подробнее — несколько номеров WhatsApp.

Что будет с интеграцией, если закончится баланс?

Номер встанет на паузу: отправка вернёт number_paused, входящие через сервис приходить перестанут. Мы предупреждаем за 3 дня, после пополнения номер включится сам. Номер стоит 9 900 ₸ в месяц, подробнее — на странице цен.

Нужен ли для интеграции ватсап с CRM официальный WhatsApp Business API?

Нет. Наш способ подключает ваш обычный номер как связанное устройство, без шаблонов и платы за сообщения. Чем он отличается от официального WhatsApp Business API — в сравнении.

Подключите WhatsApp к своим системам

9 900 ₸ в месяц за номер, без платы за сообщения. Сервер в Казахстане, оплата Kaspi или счётом на ТОО/ИП. Подключение — около 5 минут.