У вас сайт на Битрикс и CRM на Битрикс24 — но они живут отдельно? Форма на сайте отправляет заявку на почту, менеджер вручную создаёт лид в CRM, потом забывает обновить статус. Знакомо? Интеграция через REST API и вебхуки решает это: заявка с сайта автоматически создаёт лид, смена статуса сделки обновляет данные на сайте. Показываем как.
Два способа интеграции
| Способ | Когда использовать | Сложность |
|---|---|---|
| Входящий вебхук | Сайт отправляет данные в CRM | Простая |
| Исходящий вебхук | CRM отправляет данные на сайт | Средняя |
| Приложение (OAuth) | Полная интеграция, маркетплейс | Высокая |
Для большинства задач хватает вебхуков. OAuth нужен, если вы делаете публичное приложение для маркетплейса Битрикс24.
Создание входящего вебхука
Входящий вебхук — это URL, по которому ваш сайт может вызывать REST API Битрикс24.
- Битрикс24 → Приложения → Разработчикам → Другое → Входящий вебхук
- Задайте название (например, «Сайт — лиды»)
- Выберите права доступа:
crm,user - Скопируйте URL вида:
https://your-domain.bitrix24.ru/rest/1/abc123xyz/
Этот URL — ваш ключ доступа. Храните его в безопасности, не коммитьте в git.
Создание лида из формы на сайте
PHP-класс для работы с Битрикс24 REST API:
// /local/php_interface/classes/Bitrix24Api.php
namespace App;
class Bitrix24Api
{
private string $webhookUrl;
public function __construct(string $webhookUrl)
{
$this->webhookUrl = rtrim($webhookUrl, '/');
}
public function call(string $method, array $params = []): array
{
$url = $this->webhookUrl . '/' . $method . '.json';
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($params),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => true,
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
throw new \RuntimeException("Bitrix24 API error: HTTP $httpCode");
}
$data = json_decode($response, true);
if (isset($data['error'])) {
throw new \RuntimeException("Bitrix24 API: {$data['error_description']}");
}
return $data;
}
public function createLead(array $fields): int
{
$result = $this->call('crm.lead.add', [
'fields' => $fields,
]);
return (int)$result['result'];
}
public function createDeal(array $fields): int
{
$result = $this->call('crm.deal.add', [
'fields' => $fields,
]);
return (int)$result['result'];
}
public function getDeal(int $id): array
{
$result = $this->call('crm.deal.get', ['id' => $id]);
return $result['result'];
}
public function updateDeal(int $id, array $fields): bool
{
$result = $this->call('crm.deal.update', [
'id' => $id,
'fields' => $fields,
]);
return $result['result'];
}
}
Использование при обработке формы:
// Обработчик формы на сайте
use App\Bitrix24Api;
$api = new Bitrix24Api(getenv('BITRIX24_WEBHOOK_URL'));
try {
$leadId = $api->createLead([
'TITLE' => 'Заявка с сайта: ' . $_POST['name'],
'NAME' => $_POST['name'],
'PHONE' => [['VALUE' => $_POST['phone'], 'VALUE_TYPE' => 'WORK']],
'EMAIL' => [['VALUE' => $_POST['email'], 'VALUE_TYPE' => 'WORK']],
'COMMENTS' => $_POST['message'],
'SOURCE_ID' => 'WEB',
'UTM_SOURCE' => $_COOKIE['utm_source'] ?? '',
'UTM_MEDIUM' => $_COOKIE['utm_medium'] ?? '',
'UTM_CAMPAIGN' => $_COOKIE['utm_campaign'] ?? '',
]);
echo "Лид создан: #$leadId";
} catch (\Throwable $e) {
// Логируем ошибку, но пользователю показываем успех
// (заявка сохранена в базе сайта, лид создастся при повторной попытке)
error_log('Bitrix24 error: ' . $e->getMessage());
}
Интеграция с формами Битрикс
Если сайт на 1С-Битрикс, подписываемся на событие отправки формы через init.php:
// /local/php_interface/init.php
use Bitrix\Main\EventManager;
EventManager::getInstance()->addEventHandler(
'form',
'onAfterResultAdd',
'sendLeadToBitrix24'
);
function sendLeadToBitrix24($WEB_FORM_ID, $RESULT_ID)
{
if ($WEB_FORM_ID != 3) return; // ID формы обратной связи
$rsAnswer = CFormAnswer::GetList(
$RESULT_ID,
$by = 's_id',
$order = 'asc',
[],
$is_filtered
);
$fields = [];
while ($arAnswer = $rsAnswer->Fetch()) {
$fields[$arAnswer['FIELD_SID']] = $arAnswer['USER_TEXT'] ?: $arAnswer['ANSWER_TEXT'];
}
$api = new \App\Bitrix24Api(getenv('BITRIX24_WEBHOOK_URL'));
try {
$api->createLead([
'TITLE' => 'Заявка #' . $RESULT_ID,
'NAME' => $fields['FIO'] ?? '',
'PHONE' => [['VALUE' => $fields['PHONE'] ?? '']],
'EMAIL' => [['VALUE' => $fields['EMAIL'] ?? '']],
'COMMENTS' => $fields['MESSAGE'] ?? '',
'SOURCE_ID' => 'WEB',
]);
} catch (\Throwable $e) {
\Bitrix\Main\Diag\Debug::writeToFile($e->getMessage(), '', '/local/logs/b24.log');
}
}
Передаём данные заказа с товарами в Битрикс24
Частый сценарий: на сайте оформлен заказ с несколькими товарами — нужно создать сделку в CRM с полным составом заказа: наименования, количество, цены. Для этого используем связку crm.deal.add + crm.deal.productrows.set.
function sendOrderToBitrix24(array $order, Bitrix24Api $api): void
{
// 1. Проверяем, есть ли контакт с таким телефоном
$existing = $api->call('crm.contact.list', [
'filter' => ['PHONE' => $order['phone']],
'select' => ['ID'],
]);
if (!empty($existing['result'])) {
$contactId = (int)$existing['result'][0]['ID'];
} else {
// Создаём новый контакт
$contactId = (int)$api->call('crm.contact.add', [
'fields' => [
'NAME' => $order['name'],
'PHONE' => [['VALUE' => $order['phone'], 'VALUE_TYPE' => 'MOBILE']],
'EMAIL' => [['VALUE' => $order['email'], 'VALUE_TYPE' => 'WORK']],
],
])['result'];
}
// 2. Создаём сделку
$dealId = $api->createDeal([
'TITLE' => 'Заказ #' . $order['id'] . ' с сайта',
'CONTACT_ID' => $contactId,
'OPPORTUNITY' => $order['total'],
'CURRENCY_ID' => 'RUB',
'SOURCE_ID' => 'WEB',
'COMMENTS' => 'Адрес: ' . ($order['address'] ?? ''),
]);
// 3. Добавляем товарные позиции к сделке
$products = [];
foreach ($order['items'] as $item) {
$products[] = [
'PRODUCT_NAME' => $item['name'],
'PRICE' => $item['price'],
'QUANTITY' => $item['quantity'],
'MEASURE_NAME' => 'шт',
];
}
$api->call('crm.deal.productrows.set', [
'id' => $dealId,
'rows' => $products,
]);
}
Вызов после оформления заказа:
$api = new Bitrix24Api(getenv('BITRIX24_WEBHOOK_URL'));
sendOrderToBitrix24([
'id' => 1042,
'name' => 'Иван Петров',
'phone' => '+79001234567',
'email' => 'ivan@example.com',
'address' => 'Москва, ул. Ленина 10',
'total' => 15000,
'items' => [
['name' => 'Футболка', 'price' => 2500, 'quantity' => 2],
['name' => 'Кепка', 'price' => 1500, 'quantity' => 1],
['name' => 'Доставка', 'price' => 500, 'quantity' => 1],
],
], $api);
Результат в Битрикс24: сделка с контактом, суммой 15 000 ₽ и тремя товарными позициями. Менеджер видит полный состав заказа в CRM сразу после оформления.
Подключение к WooCommerce
Если сайт на WordPress + WooCommerce, вешаем отправку на хук нового заказа:
// functions.php или отдельный плагин
add_action('woocommerce_new_order', function ($orderId) {
$wcOrder = wc_get_order($orderId);
if (!$wcOrder) return;
$items = [];
foreach ($wcOrder->get_items() as $item) {
$items[] = [
'name' => $item->get_name(),
'price' => (float)$item->get_total() / $item->get_quantity(),
'quantity' => $item->get_quantity(),
];
}
// Доставка как отдельная позиция
$shipping = (float)$wcOrder->get_shipping_total();
if ($shipping > 0) {
$items[] = ['name' => 'Доставка', 'price' => $shipping, 'quantity' => 1];
}
$api = new \App\Bitrix24Api(getenv('BITRIX24_WEBHOOK_URL'));
sendOrderToBitrix24([
'id' => $orderId,
'name' => $wcOrder->get_billing_first_name() . ' ' . $wcOrder->get_billing_last_name(),
'phone' => $wcOrder->get_billing_phone(),
'email' => $wcOrder->get_billing_email(),
'address' => $wcOrder->get_billing_address_1(),
'total' => (float)$wcOrder->get_total(),
'items' => $items,
], $api);
});
Подключение к Тильде
На Тильде данные формы/корзины можно отправить на ваш серверный скрипт через Webhook URL в настройках формы. Тильда передаст POST-запрос с полями заказа — вы их разберёте и отправите в Битрикс24 тем же способом.
Исходящий вебхук — CRM уведомляет сайт
Сценарий: менеджер перевёл сделку в статус «Оплачено» — на сайте автоматически открывается доступ к контенту.
Создаём исходящий вебхук в Битрикс24:
- Приложения → Разработчикам → Другое → Исходящий вебхук
- Событие:
ONCRMDEALADDилиONCRMDEALUPDATE - URL обработчика:
https://your-site.ru/api/bitrix24-webhook.php - Скопируйте токен аутентификации
Обработчик на сайте:
// /api/bitrix24-webhook.php
// Проверка токена
$authToken = getenv('BITRIX24_OUTGOING_TOKEN');
if ($_POST['auth']['application_token'] !== $authToken) {
http_response_code(403);
die('Forbidden');
}
$event = $_POST['event'] ?? '';
$dealId = (int)($_POST['data']['FIELDS']['ID'] ?? 0);
if (!$dealId) {
http_response_code(400);
die('No deal ID');
}
// Получаем данные сделки через REST API
$api = new \App\Bitrix24Api(getenv('BITRIX24_WEBHOOK_URL'));
$deal = $api->getDeal($dealId);
switch ($event) {
case 'ONCRMDEALUPDATE':
handleDealUpdate($deal);
break;
case 'ONCRMDEALADD':
handleDealCreate($deal);
break;
}
function handleDealUpdate(array $deal): void
{
$stageId = $deal['STAGE_ID'];
// Сделка оплачена — активируем доступ
if ($stageId === 'WON') {
$email = ''; // Получаем email контакта
if ($deal['CONTACT_ID']) {
$api = new \App\Bitrix24Api(getenv('BITRIX24_WEBHOOK_URL'));
$contact = $api->call('crm.contact.get', ['id' => $deal['CONTACT_ID']]);
$email = $contact['result']['EMAIL'][0]['VALUE'] ?? '';
}
if ($email) {
// Активируем доступ в базе сайта
activateUserAccess($email, $deal['ID']);
}
}
// Сделка отменена — деактивируем доступ
if ($stageId === 'LOSE') {
deactivateAccess($deal['ID']);
}
}
http_response_code(200);
echo json_encode(['status' => 'ok']);
JavaScript: создание лида из фронтенда
Для SPA или виджетов можно вызывать Битрикс24 API из JavaScript. Но не напрямую (нельзя раскрывать вебхук-токен) — через прокси на сервере:
// Фронтенд — отправка формы
async function submitForm(formData) {
try {
const response = await fetch('/api/lead/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
name: formData.get('name'),
phone: formData.get('phone'),
email: formData.get('email'),
message: formData.get('message'),
}),
});
const result = await response.json();
if (result.success) {
showNotification('Заявка отправлена!');
} else {
showNotification('Ошибка. Попробуйте позже.');
}
} catch (error) {
console.error('Form submission error:', error);
}
}
document.querySelector('#contact-form').addEventListener('submit', (e) => {
e.preventDefault();
submitForm(new FormData(e.target));
});
Батчевые запросы
Если нужно создать несколько сущностей за раз — используйте batch:
// Создаём контакт + сделку одним запросом
$result = $api->call('batch', [
'halt' => 0,
'cmd' => [
'contact' => 'crm.contact.add?' . http_build_query([
'fields' => [
'NAME' => 'Иван',
'LAST_NAME' => 'Петров',
'PHONE' => [['VALUE' => '+79001234567']],
],
]),
'deal' => 'crm.deal.add?' . http_build_query([
'fields' => [
'TITLE' => 'Разработка сайта',
'CONTACT_ID' => '$result[contact]', // ID из предыдущей команды
'OPPORTUNITY' => 150000,
'CURRENCY_ID' => 'RUB',
],
]),
],
]);
$contactId = $result['result']['result']['contact'];
$dealId = $result['result']['result']['deal'];
Обработка ошибок и retry
Битрикс24 ограничивает количество запросов — не более 2 в секунду для вебхуков. При превышении лимита вернётся ошибка QUERY_LIMIT_EXCEEDED:
public function callWithRetry(string $method, array $params = [], int $maxRetries = 3): array
{
$attempt = 0;
while ($attempt < $maxRetries) {
try {
return $this->call($method, $params);
} catch (\RuntimeException $e) {
if (str_contains($e->getMessage(), 'QUERY_LIMIT_EXCEEDED')) {
$attempt++;
sleep(1); // Ждём секунду и повторяем
continue;
}
throw $e;
}
}
throw new \RuntimeException("Bitrix24 API: превышено количество попыток");
}
Что можно делать через REST API
| Метод | Описание |
|---|---|
crm.lead.add |
Создать лид |
crm.deal.add |
Создать сделку |
crm.contact.add |
Создать контакт |
crm.deal.update |
Обновить сделку |
crm.deal.list |
Список сделок с фильтром |
crm.lead.productrows.set |
Добавить товары к лиду |
crm.timeline.comment.add |
Добавить комментарий в таймлайн |
task.item.add |
Создать задачу |
im.notify |
Отправить уведомление в чат |
Не хотите разбираться сами?
Настрою интеграцию вашего сайта с Битрикс24 под ключ: заявки с форм, заказы из корзины, лиды с UTM-метками — всё автоматически попадает в CRM. Работаю с сайтами на WordPress, Тильде, 1С-Битрикс и самописных решениях.
Что входит:
- Настройка вебхука и прав доступа в Битрикс24
- Серверный скрипт для передачи данных
- Проверка дублей контактов
- Тестирование на реальных заявках
- Инструкция для вашей команды
Обычно занимает 1 – 3 дня. Написать в Telegram — расскажите, какой у вас сайт и CRM, оценю задачу бесплатно.

