Integrating a Live Chat with Bitrix24 CRM
A live chat without a CRM is simply a communication tool. With a CRM, it becomes a lead source, contact history, and a deal pipeline. The gap between chat and CRM costs money: a manager closes a conversation, the data is saved nowhere, and a week later the client calls again and has to start from scratch. Integration eliminates this.
Integration Architecture
There are several ways to connect a live chat to Bitrix24 CRM, and the choice depends on the chat platform:
Native integrations. Some chat platforms (JivoSite, LiveChat, Callibri) have ready-made connectors for Bitrix24 — available via the Bitrix24 marketplace or directly within the chat's settings. This is the fastest path, but with limited customization options.
Bitrix24 Open Channels. A mechanism that allows an external chat channel to be connected to Bitrix24 CRM. Messages from the chat appear in the Open Channels interface, the operator responds from Bitrix24, and the reply is delivered to the client in the on-site chat. Requires webhook implementation in both directions.
Bitrix24 REST API + chat webhook. The chat sends a webhook upon conversation close; the handler creates a lead/contact/deal via crm.lead.add or crm.contact.add.
Integration via Open Channels
Open Channels is the most deeply integrated option. It requires building a custom connector.
Step 1. Register the connector in Bitrix24:
// Register the external channel via REST API
$result = callBitrix24Rest('imopenlines.connector.register', [
'ID' => 'my_chat_connector',
'NAME' => 'Website Live Chat',
'ICON_FILE' => 'https://yoursite.ru/icon.png',
'ENDPOINT' => 'https://yoursite.ru/local/api/chat-send.php',
'HANDLER' => 'https://yoursite.ru/local/api/chat-handler.php',
]);
Step 2. Forward a message from the chat to Bitrix24:
// When a client sends a message in the on-site chat
function sendMessageToBitrix24(string $userId, string $message, string $userName): void
{
callBitrix24Rest('imopenlines.message.add', [
'CONNECTOR' => 'my_chat_connector',
'LINE' => OPENLINE_ID,
'MESSAGES' => [[
'user' => [
'id' => 'chat-user-' . $userId,
'name' => $userName,
'avatar' => '',
],
'message' => ['text' => $message],
'timestamp' => time(),
]],
]);
}
Step 3. Receive the operator's reply from Bitrix24:
Bitrix24 calls ENDPOINT when the operator responds:
// /local/api/chat-send.php
$payload = json_decode(file_get_contents('php://input'), true);
$chatUserId = $payload['data']['USER']['ID']; // 'chat-user-{id}'
$message = $payload['data']['MESSAGES'][0]['text'];
// Forward the reply to the on-site chat via your chat service API
ChatService::sendToUser(extractUserId($chatUserId), $message);
http_response_code(200);
echo json_encode(['RESULT' => 'OK']);
Creating a Lead via REST API on Conversation Close
If Open Channels is overkill, simply creating a lead when the chat closes is sufficient:
function createLeadFromChat(array $visitorData, string $transcript): int
{
$response = callBitrix24Rest('crm.lead.add', [
'fields' => [
'TITLE' => 'Chat: ' . ($visitorData['name'] ?: $visitorData['email'] ?: 'Guest'),
'NAME' => $visitorData['name'] ?? '',
'EMAIL' => [['VALUE' => $visitorData['email'] ?? '', 'VALUE_TYPE' => 'WORK']],
'PHONE' => [['VALUE' => $visitorData['phone'] ?? '', 'VALUE_TYPE' => 'WORK']],
'COMMENTS' => htmlspecialchars($transcript),
'SOURCE_ID' => 'WEB',
'STATUS_ID' => 'NEW',
'ASSIGNED_BY_ID' => getResponsibleManagerId(),
],
'params' => ['REGISTER_SONET_EVENT' => 'N'],
]);
return (int)($response['result'] ?? 0);
}
Deduplication: Avoiding Duplicate Contacts
Before creating a lead, check whether a contact with the given email or phone number already exists:
function findExistingContact(string $email, string $phone): ?int
{
// Search by email
if ($email) {
$result = callBitrix24Rest('crm.contact.list', [
'filter' => ['EMAIL' => $email],
'select' => ['ID'],
]);
if (!empty($result['result'][0]['ID'])) return (int)$result['result'][0]['ID'];
}
// Search by phone
if ($phone) {
$result = callBitrix24Rest('crm.contact.list', [
'filter' => ['PHONE' => $phone],
'select' => ['ID'],
]);
if (!empty($result['result'][0]['ID'])) return (int)$result['result'][0]['ID'];
}
return null;
}
// If an existing contact is found — create a deal, not a lead
$contactId = findExistingContact($email, $phone);
if ($contactId) {
callBitrix24Rest('crm.deal.add', [
'fields' => [
'TITLE' => 'Chat inquiry',
'CONTACT_ID' => $contactId,
'COMMENTS' => $transcript,
'SOURCE_ID' => 'WEB',
],
]);
} else {
createLeadFromChat($visitorData, $transcript);
}
Assigning a Responsible Manager
To automatically assign a responsible manager to a lead/deal from chat, use source-based logic:
function getResponsibleManagerId(): int
{
// Round-robin rotation, time-of-day assignment,
// or a fixed manager for chat leads
$managers = [15, 23, 41]; // Bitrix24 user IDs
return $managers[array_rand($managers)];
}
Notifying the Assigned Manager
After creating the lead, send a notification in Bitrix24:
callBitrix24Rest('im.notify.system.add', [
'USER_ID' => $responsibleId,
'MESSAGE' => 'New chat inquiry. Lead #' . $leadId . ' created.',
]);
Scope of Work
- Selecting the integration architecture (Open Channels or Webhook → lead)
- Developing the webhook handler on the Bitrix side
- Contact deduplication logic
- Assigning responsible managers, notifications
- Testing all scenarios: new client, returning client, incomplete contact data
Timelines: webhook integration with lead creation — 2–3 days. Full integration via Open Channels — 2–3 weeks.







