Самая частая жалоба на вебхук-интеграции с Битрикс24: «всё работало, а потом перестало». Причина почти всегда одна — обработчик стал отвечать медленнее 5 секунд, Битрикс24 перестал его вызывать, и никто этого не заметил, потому что логов не было. Мы проектируем отказоустойчивые интеграции уже более 10 лет — наши решения выдерживают пиковые нагрузки чёрной пятницы и обрабатывают до 1000 событий в минуту. Если вам нужна интеграция, которая не упадёт в самый ответственный момент — свяжитесь с нами для консультации.
Архитектура интеграции: исходящие и входящие вебхуки
Вебхуки в Битрикс24 работают в двух направлениях. Исходящий вебхук — Битрикс24 вызывает ваш URL при событии. Подписка настраивается в разделе «Разработчикам» или через event.bind в REST API. Битрикс24 делает POST-запрос с Content-Type: application/x-www-form-urlencoded. Входящий вебхук — ваша система вызывает Битрикс24 через фиксированный URL с токеном. Удобно для простых односторонних интеграций без OAuth. Для двусторонней интеграции мы обычно используем оба типа: входящий для отправки данных в Битрикс24, исходящий — для получения событий.
Как подписаться на события через API?
Программная подписка надёжнее ручной настройки в интерфейсе — не зависит от действий администратора и легче масштабируется. Пример подписки через REST API:
// Подписка через REST API (от имени OAuth-приложения) $b24->call('event.bind', [ 'event' => 'ONCRMDEALUPDATE', 'handler' => 'https://your-system.com/webhooks/bitrix24', 'auth_type' => 0, ]); Для отписки используйте event.unbind. Получить список активных подписок можно через event.get.
Обработка событий: немедленный ответ и идемпотентность
Структура входящего запроса
Тело POST-запроса от Битрикс24 содержит событие, handler_id, токены и сами данные. Важно: data[FIELDS] содержит только изменённые поля, а не полный объект. Для получения актуального состояния сделки нужен отдельный вызов crm.deal.get.
auth[application_token] — токен для верификации источника запроса. Для коробочного Битрикс24 проверяем его совпадение с токеном приложения.
Очередь — обязательный паттерн
Ключевое требование: обработчик должен вернуть HTTP 200 в течение 5 секунд. Всё, что дольше — таймаут. Мы используем очередь (например, Laravel Queue). Вот минимальная реализация:
// routes/api.php (Laravel) Route::post('/webhooks/bitrix24', function (Request $request) { // Валидация токена — быстро if (!validateBitrixToken($request->input('auth.application_token'))) { return response('Forbidden', 403); } // Кладём в очередь — быстро ProcessBitrixEvent::dispatch($request->all()); // Немедленно отвечаем return response('OK', 200); }); // app/Jobs/ProcessBitrixEvent.php class ProcessBitrixEvent implements ShouldQueue { public $tries = 3; public $backoff = [60, 300, 900]; // 1 мин, 5 мин, 15 мин public function handle(): void { $event = $this->payload['event']; $dealId = $this->payload['data']['FIELDS']['ID']; // Теперь получаем полный объект $deal = $this->b24->call('crm.deal.get', ['id' => $dealId]); // ... обработка } } Почему важна идемпотентность обработчика?
Одно событие может прийти дважды: Битрикс24 повторяет вызов при сетевых проблемах, а массовые операции генерируют ONCRMDEALUPDATE на каждое поле. Обработчик должен быть идемпотентным. Пример дедупликации через Redis:
// Дедупликация через event_handler_id + временная метка $eventKey = md5($event . $dealId . $request->input('ts')); if ($redis->set("processed:{$eventKey}", 1, ['NX', 'EX' => 3600])) { ProcessBitrixEvent::dispatch($payload); // Если ключ уже есть — дубль, игнорируем } Битрикс24 ожидает HTTP 200 в течение 5 секунд. — документация REST API
Как избежать петель синхронизации?
Классическая проблема: внешняя система получает событие ONCRMDEALUPDATE, обновляет данные в своей БД, затем отправляет обновление обратно в Битрикс24 — это снова генерирует ONCRMDEALUPDATE, и цикл повторяется бесконечно. Мы применяем три решения:
Флаг в сделке
Устанавливаем кастомное поле UF_CRM_SYNC_LOCK=Y перед записью из внешней системы, проверяем его в обработчике — если Y, пропускаем и сбрасываем.
Хэш данных
Сравниваем хэш входящих данных с последним обработанным — если совпадает, пропускаем.
Временная метка
Если событие о нашем же обновлении (время ≤ 2 сек с момента нашей записи) — игнорируем.
Мониторинг доставки и ограничения событий
Журнал событий и алерты
Битрикс24 не ведёт журнал доставки вебхуков для внешних получателей. Нужно вести его самостоятельно. Мы создаём таблицу:
CREATE TABLE webhook_events ( id SERIAL PRIMARY KEY, event_type VARCHAR(64), entity_id INTEGER, received_at TIMESTAMP DEFAULT NOW(), processed_at TIMESTAMP, status VARCHAR(16) DEFAULT 'pending', error_message TEXT ); Алерт: если за 10 минут в рабочее время не приходит ни одного события ONCRMDEALUPDATE, скорее всего, Битрикс24 перестал вызывать обработчик. Получите консультацию по настройке мониторинга у наших инженеров — мы поможем настроить алерты и дашборды.
Особенности событий
| Событие | Особенности |
|---|---|
ONCRMDEALUPDATE |
Вызывается при каждом изменении любого поля |
ONCRMDEALADD |
Не срабатывает при импорте через API с DISABLE_PORTAL_ACTIVITY=Y |
ONVOXIMPLANTCALLEND |
Данные записи звонка доступны с задержкой 5–30 сек |
ONTASKUPDATE |
Не включает изменения чеклистов |
ONIMBOTMESSAGEADD |
Только для ботов, зарегистрированных через imbot.register |
Коробочный Битрикс24: расширение событий
На коробке доступны события PHP-уровня, которых нет в REST API. Например, можно перехватить событие до сохранения сделки и изменить данные:
\Bitrix\Main\EventManager::getInstance()->addEventHandler( 'crm', 'OnBeforeCrmDealAdd', [MyHandler::class, 'onBeforeDealAdd'] ); Можно создавать свои события из модуля: $event = new \Bitrix\Main\Event(...).
Этапы разработки и стоимость
Пошаговый план интеграции
- Проектирование: определяем список событий, схему данных, архитектуру обработчика.
- Endpoint и очередь: реализуем HTTP-обработчик, Job, дедупликацию.
- Бизнес-логика: обработка каждого типа события, вызов внешних систем.
- Защита от петель: флаги синхронизации, idempotency.
- Мониторинг: журнал событий, алерты, дашборд.
- Тестирование: эмуляция событий, нагрузочные тесты.
| Этап | Содержание | Срок |
|---|---|---|
| Проектирование | Список событий, схема данных, архитектура обработчика | 2–3 дня |
| Endpoint и очередь | HTTP-обработчик, Job, дедупликация | 3–5 дней |
| Бизнес-логика | Обработка каждого типа события, вызов внешних систем | 1–3 недели |
| Защита от петель | Флаги синхронизации, idempotency | 2–3 дня |
| Мониторинг | Журнал событий, алерты, дашборд | 2–3 дня |
| Тестирование | Эмуляция событий, нагрузочные тесты | 3–5 дней |
Суммарно: от 3 до 7 недель в зависимости от количества событий и сложности бизнес-логики. Стоимость разработки такой интеграции — от $1.5k–5k в зависимости от объёма и сложности. Экономия от автоматизации — до 80% времени на обработке заявок — окупает интеграцию в течение 3–6 месяцев.
Мы предлагаем полный комплект: документация по архитектуре, код endpoint-ов, настройка очередей и мониторинга, инструкция по развёртыванию, обучение вашей команды, поддержка после запуска. Гарантия стабильной работы подтверждена сертификатами и десятилетним опытом в Битрикс24 — мы выполнили более 50 интеграций.
Закажите оценку вашего проекта — наши инженеры проанализируют вашу архитектуру за один день и предложат оптимальное решение. Свяжитесь с нами, чтобы обсудить детали.







