Интеграция CRM с сайтом — одна из тех задач, которую я делаю практически каждую неделю. И честно говоря, количество ошибок, которые допускают разработчики при такой интеграции, просто поражает. За 10+ лет работы я видел всё: от передачи паролей в GET-параметрах до падения сайтов из-за неправильно настроенных webhook'ов.
Зачем нужна интеграция CRM с сайтом
У меня был клиент — интернет-магазин стройматериалов. До интеграции с amoCRM их менеджеры тратили по 15 минут на обработку каждой заявки: копировали данные из почты, создавали карточку клиента вручную, искали товары в каталоге. После настройки автоматической передачи данных это время сократилось до 2 минут.
Основные преимущества интеграции:
- Автоматизация обработки лидов — заявки попадают в CRM мгновенно, без участия человека
- Снижение ошибок — нет риска потерять заявку или неправильно переписать телефон
- Ускорение реакции — менеджер видит лида в течение 30 секунд после отправки формы
- Полная история взаимодействий — все действия клиента на сайте фиксируются в CRM
- Аналитика и отчётность — можно отследить, какие страницы приводят к конверсии
На практике правильная интеграция увеличивает конверсию на 15-25%. И это не маркетинговые обещания, а реальная статистика по моим проектам.
Выбор способа интеграции
Существует несколько подходов к интеграции CRM с сайтом. Я обычно выбираю метод в зависимости от бюджета проекта и технических требований.
Готовые плагины и модули
Самый быстрый способ — использовать готовые решения. Для WordPress есть отличные плагины для интеграции с популярными CRM:
- WP Forms + Zapier — универсальное решение для любой CRM
- amoCRM WordPress Plugin — официальный плагин от amoCRM
- Bitrix24 Contact Form — для интеграции с Битрикс24
- HubSpot WordPress Plugin — мощная интеграция с HubSpot
Для Битрикс ситуация ещё лучше — в Marketplace есть готовые решения практически для всех популярных CRM. Я часто использую модуль "1C-Битрикс: Управление сайтом + CRM" — он даёт полную синхронизацию данных.
API-интеграция
Когда готовых решений недостаточно, я пишу кастомную интеграцию через API. Это дольше и дороже, но даёт полный контроль над процессом.
Большинство современных CRM предоставляют REST API. Вот с какими я работал чаще всего:
- amoCRM API v4 — очень хорошо документированное API, есть SDK для PHP
- Битрикс24 REST API — мощное, но иногда избыточное API
- RetailCRM API — простое и понятное, отлично подходит для интернет-магазинов
- Salesforce API — сложное, но очень функциональное
Пример простой интеграции с amoCRM через их API:
<?php
class AmoCRMIntegration {
private $subdomain;
private $access_token;
public function __construct($subdomain, $access_token) {
$this->subdomain = $subdomain;
$this->access_token = $access_token;
}
public function createLead($data) {
$url = "https://{$this->subdomain}.amocrm.ru/api/v4/leads";
$lead_data = [
'name' => $data['name'],
'price' => $data['price'] ?? 0,
'custom_fields_values' => [
[
'field_id' => 123456, // ID поля "Телефон"
'values' => [
['value' => $data['phone']]
]
],
[
'field_id' => 123457, // ID поля "Email"
'values' => [
['value' => $data['email']]
]
]
]
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([$lead_data]));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $this->access_token,
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code === 200) {
return json_decode($result, true);
}
throw new Exception("Ошибка создания лида: " . $result);
}
}
Webhook'и и обратная интеграция
Однонаправленная интеграция (только с сайта в CRM) — это только половина дела. Часто нужна и обратная связь: когда менеджер меняет статус сделки в CRM, это должно отражаться на сайте.
Здесь на помощь приходят webhook'и. CRM отправляет уведомления на специальный URL вашего сайта при изменении данных.
Техническая реализация интеграции
Теперь перейдём к конкретным шагам реализации. Я покажу, как я обычно делаю интеграцию на реальных проектах.
Подготовка инфраструктуры
Первым делом нужно подготовить техническую базу. На сервере должны быть установлены:
- PHP 8.1+ с включёнными модулями curl и json
- SSL-сертификат — большинство CRM требуют HTTPS для webhook'ов
- Очередь задач — для обработки запросов в фоне
- Логирование — обязательно логировать все запросы к CRM
Кстати, про SSL-сертификаты я подробно писал — без них интеграция с современными CRM просто не заработает.
Настройка форм на сайте
Я обычно дорабатываю стандартные формы, добавляя специальные поля для передачи в CRM. Вот пример формы обратной связи с дополнительными полями:
<form id="crm-form" method="post" action="/api/form-handler.php">
<input type="text" name="name" placeholder="Ваше имя" required>
<input type="tel" name="phone" placeholder="Телефон" required>
<input type="email" name="email" placeholder="Email">
<textarea name="message" placeholder="Сообщение"></textarea>
<!-- Скрытые поля для аналитики -->
<input type="hidden" name="utm_source" value="">
<input type="hidden" name="utm_medium" value="">
<input type="hidden" name="utm_campaign" value="">
<input type="hidden" name="page_url" value="">
<input type="hidden" name="referrer" value="">
<button type="submit">Отправить заявку</button>
</form>
<script>
// Заполняем UTM-метки и данные о странице
document.addEventListener('DOMContentLoaded', function() {
const form = document.getElementById('crm-form');
const urlParams = new URLSearchParams(window.location.search);
form.utm_source.value = urlParams.get('utm_source') || '';
form.utm_medium.value = urlParams.get('utm_medium') || '';
form.utm_campaign.value = urlParams.get('utm_campaign') || '';
form.page_url.value = window.location.href;
form.referrer.value = document.referrer;
});
</script>
Обработчик формы с интеграцией
Вот как выглядит серверный обработчик формы с отправкой данных в CRM и локальным сохранением:
<?php
// form-handler.php
session_start();
// Проверка CSRF-токена
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
http_response_code(403);
exit('CSRF token mismatch');
}
// Валидация данных
$name = filter_var($_POST['name'], FILTER_SANITIZE_STRING);
$phone = filter_var($_POST['phone'], FILTER_SANITIZE_STRING);
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
$message = filter_var($_POST['message'], FILTER_SANITIZE_STRING);
if (empty($name) || empty($phone)) {
http_response_code(400);
exit('Заполните обязательные поля');
}
// Сохраняем заявку в локальную БД
try {
$pdo = new PDO('mysql:host=localhost;dbname=site_db', $db_user, $db_pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("
INSERT INTO leads (name, phone, email, message, utm_source, utm_medium,
utm_campaign, page_url, referrer, created_at, status)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), 'new')
");
$stmt->execute([
$name, $phone, $email, $message,
$_POST['utm_source'], $_POST['utm_medium'], $_POST['utm_campaign'],
$_POST['page_url'], $_POST['referrer']
]);
$lead_id = $pdo->lastInsertId();
// Добавляем задачу в очередь для отправки в CRM
$queue_stmt = $pdo->prepare("
INSERT INTO crm_queue (lead_id, action, data, created_at)
VALUES (?, 'create_lead', ?, NOW())
");
$queue_data = json_encode([
'name' => $name,
'phone' => $phone,
'email' => $email,
'message' => $message,
'source' => $_POST['utm_source'],
'medium' => $_POST['utm_medium'],
'campaign' => $_POST['utm_campaign']
]);
$queue_stmt->execute([$lead_id, $queue_data]);
// Отправляем успешный ответ
echo json_encode(['status' => 'success', 'message' => 'Заявка отправлена']);
} catch (Exception $e) {
error_log("Form handler error: " . $e->getMessage());
http_response_code(500);
echo json_encode(['status' => 'error', 'message' => 'Произошла ошибка']);
}
Обработчик очереди CRM
Отдельный скрипт обрабатывает очередь задач для CRM. Я запускаю его через cron каждую минуту:
<?php
// crm-queue-processor.php
require_once 'AmoCRMIntegration.php';
$pdo = new PDO('mysql:host=localhost;dbname=site_db', $db_user, $db_pass);
$crm = new AmoCRMIntegration($crm_subdomain, $crm_access_token);
// Получаем необработанные задачи
$stmt = $pdo->prepare("
SELECT * FROM crm_queue
WHERE status = 'pending'
ORDER BY created_at ASC
LIMIT 10
");
$stmt->execute();
$tasks = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($tasks as $task) {
try {
$data = json_decode($task['data'], true);
if ($task['action'] === 'create_lead') {
$result = $crm->createLead($data);
// Обновляем статус задачи
$update_stmt = $pdo->prepare("
UPDATE crm_queue
SET status = 'completed', processed_at = NOW(),
crm_response = ?
WHERE id = ?
");
$update_stmt->execute([json_encode($result), $task['id']]);
// Обновляем статус лида
$lead_stmt = $pdo->prepare("
UPDATE leads
SET status = 'sent_to_crm', crm_lead_id = ?
WHERE id = ?
");
$lead_stmt->execute([$result['id'] ?? null, $task['lead_id']]);
}
} catch (Exception $e) {
// Логируем ошибку и помечаем задачу как проблемную
error_log("CRM queue error: " . $e->getMessage());
$error_stmt = $pdo->prepare("
UPDATE crm_queue
SET status = 'error', error_message = ?, attempts = attempts + 1
WHERE id = ?
");
$error_stmt->execute([$e->getMessage(), $task['id']]);
}
}
Настройка webhook'ов для обратной синхронизации
Обратная синхронизация — это когда изменения в CRM автоматически отражаются на сайте. Например, когда менеджер переводит лида в статус "Клиент", на сайте должна обновиться информация о пользователе.
У меня был проект интернет-магазина, где нужно было синхронизировать статусы заказов между сайтом и CRM. Когда менеджер отмечал заказ как "Отправлен" в CRM, клиент автоматически получал SMS с трек-номером.
Создание endpoint'а для webhook'ов
Первым делом создаём специальный URL, который будет принимать уведомления от CRM:
<?php
// webhook-handler.php
header('Content-Type: application/json');
// Проверяем, что запрос пришёл от CRM (по IP или секретному ключу)
$allowed_ips = ['185.28.196.0/22', '185.28.197.0/22']; // IP amoCRM
$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'];
if (!isIPAllowed($client_ip, $allowed_ips)) {
http_response_code(403);
exit('Access denied');
}
// Получаем данные webhook'а
$webhook_data = file_get_contents('php://input');
$data = json_decode($webhook_data, true);
if (!$data) {
http_response_code(400);
exit('Invalid JSON');
}
// Логируем webhook для отладки
error_log("Webhook received: " . $webhook_data);
try {
$pdo = new PDO('mysql:host=localhost;dbname=site_db', $db_user, $db_pass);
foreach ($data['leads']['update'] as $lead) {
$crm_lead_id = $lead['id'];
$status_id = $lead['status_id'];
// Находим локальный лид по CRM ID
$stmt = $pdo->prepare("
SELECT * FROM leads WHERE crm_lead_id = ?
");
$stmt->execute([$crm_lead_id]);
$local_lead = $stmt->fetch(PDO::FETCH_ASSOC);
if ($local_lead) {
// Обновляем статус локального лида
$update_stmt = $pdo->prepare("
UPDATE leads SET crm_status_id = ?, updated_at = NOW()
WHERE id = ?
");
$update_stmt->execute([$status_id, $local_lead['id']]);
// Выполняем дополнительные действия в зависимости от статуса
handleStatusChange($local_lead, $status_id);
}
}
echo json_encode(['status' => 'ok']);
} catch (Exception $e) {
error_log("Webhook error: " . $e->getMessage());
http_response_code(500);
echo json_encode(['status' => 'error']);
}
function handleStatusChange($lead, $status_id) {
switch ($status_id) {
case 142: // Статус "Клиент"
// Создаём аккаунт пользователя на сайте
createUserAccount($lead);
break;
case 143: // Статус "Отказ"
// Добавляем в чёрный список для ретаргетинга
addToBlacklist($lead['email']);
break;
}
}
function isIPAllowed($ip, $allowed_ranges) {
foreach ($allowed_ranges as $range) {
if (strpos($range, '/') !== false) {
list($subnet, $mask) = explode('/', $range);
if ((ip2long($ip) & ~((1 << (32 - $mask)) - 1)) == ip2long($subnet)) {
return true;
}
} else {
if ($ip === $range) {
return true;
}
}
}
return false;
}
Настройка webhook'ов в CRM
В amoCRM webhook'и настраиваются через настройки интеграции. Указываете URL вашего обработчика и выбираете события, на которые хотите реагировать:
- leads — изменения в сделках
- contacts — изменения в контактах
- companies — изменения в компаниях
- tasks — изменения в задачах
Важный момент: webhook'и могут приходить с задержкой или дублироваться. Я всегда добавляю защиту от дублирования через уникальные идентификаторы событий.
Безопасность интеграции
Интеграция с CRM открывает дополнительные векторы атак на ваш сайт. За годы работы я видел несколько серьёзных инцидентов, связанных с небезопасной интеграцией.
Защита API-ключей
Первое правило — никогда не храните API-ключи в коде или файлах конфигурации, которые попадают в Git. Я использую переменные окружения:
<?php
// Правильно
$crm_token = $_ENV['AMOCRM_ACCESS_TOKEN'];
$crm_secret = $_ENV['AMOCRM_CLIENT_SECRET'];
// Неправильно - никогда так не делайте!
$crm_token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjA...';
На сервере создаю файл `.env` с ограниченными правами доступа (600):
# .env
AMOCRM_ACCESS_TOKEN=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjA...
AMOCRM_CLIENT_SECRET=your_client_secret
AMOCRM_SUBDOMAIN=your_subdomain
Валидация входящих данных
Все данные, приходящие от CRM через webhook'и, нужно тщательно валидировать. У меня был случай, когда злоумышленники подделали webhook с SQL-инъекцией в поле "Имя клиента".
<?php
function validateWebhookData($data) {
// Проверяем структуру данных
if (!isset($data['leads']) || !is_array($data['leads'])) {
throw new InvalidArgumentException('Invalid webhook structure');
}
foreach ($data['leads']['update'] as $lead) {
// Валидируем ID лида
if (!isset($lead['id']) || !is_numeric($lead['id'])) {
throw new InvalidArgumentException('Invalid lead ID');
}
// Проверяем статус
if (!isset($lead['status_id']) || !is_numeric($lead['status_id'])) {
throw new InvalidArgumentException('Invalid status ID');
}
// Дополнительные проверки...
}
return true;
}
Rate limiting
CRM могут отправлять множество webhook'ов за короткое время, что может привести к перегрузке сервера. Я всегда настраиваю ограничение частоты запросов:
# nginx.conf
location /webhook-handler.php {
limit_req zone=webhook burst=10 nodelay;
# Разрешаем только POST запросы
if ($request_method !~ ^(POST)$ ) {
return 405;
}
fastcgi_pass php-fpm;
include fastcgi_params;
}
# Определяем зону ограничений (в http блоке)
limit_req_zone $binary_remote_addr zone=webhook:10m rate=30r/m;
Оптимизация производительности интеграции
Неправильно настроенная интеграция может серьёзно замедлить сайт. Я видел случаи, когда отправка формы занимала 15+ секунд из-за медленного API CRM.
Кеширование ответов API
Некоторые данные из CRM можно кешировать. Например, список статусов сделок или настройки воронки изменяются редко:
<?php
class CachedCRMClient {
private $cache_ttl = 3600; // 1 час
private $redis;
public function __construct($redis_connection) {
$this->redis = $redis_connection;
}
public function getLeadStatuses() {
$cache_key = 'crm:lead_statuses';
$cached = $this->redis->get($cache_key);
if ($cached !== false) {
return json_decode($cached, true);
}
// Загружаем из CRM API
$statuses = $this->crmApi->getStatuses();
// Сохраняем в кеш
$this->redis->setex($cache_key, $this->cache_ttl, json_encode($statuses));
return $statuses;
}
}
Батчевая обработка
Если нужно передать в CRM много данных (например, при импорте клиентской базы), используйте батчевую обработку:
<?php
public function createLeadsBatch($leads_data) {
$batch_size = 50; // amoCRM позволяет до 50 записей за раз
$batches = array_chunk($leads_data, $batch_size);
foreach ($batches as $batch) {
$url = "https://{$this->subdomain}.amocrm.ru/api/v4/leads";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($batch));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $this->access_token,
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
// Делаем паузу между батчами, чтобы не превысить rate limit
sleep(1);
}
}
Мониторинг производительности
Я всегда настраиваю мониторинг времени выполнения запросов к CRM API. Это помогает вовремя заметить проблемы:
<?php
public function makeApiRequest($url, $data) {
$start_time = microtime(true);
// Выполняем запрос...
$result = $this->executeCurlRequest($url, $data);
$execution_time = microtime(true) - $start_time;
// Логируем медленные запросы
if ($execution_time > 2.0) {
error_log(sprintf(
"Slow CRM API request: %s took %.2f seconds",
$url,
$execution_time
));
}
// Отправляем метрики в систему мониторинга
$this->metrics->timing('crm.api.request_time', $execution_time * 1000);
return $result;
}
Тестирование и отладка интеграции
Тестирование интеграции с CRM — отдельная наука. Нужно проверить множество сценариев: успешная отправка, ошибки API, недоступность CRM, дублирование данных.
Создание тестовой среды
Я всегда создаю отдельную тестовую воронку в CRM для разработки. Это позволяет тестировать интеграцию, не засоряя рабочие данные:
- Тестовая воронка с отдельными статусами
- Тестовые поля для проверки передачи данных
- Отдельный webhook URL для тестового окружения
- Ограниченные права API — только на тестовую воронку
Автоматические тесты
Пример PHPUnit теста для проверки создания лида:
<?php
class CRMIntegrationTest extends PHPUnit\Framework\TestCase {
private $crm;
protected function setUp(): void {
$this->crm = new AmoCRMIntegration(
$_ENV['TEST_CRM_SUBDOMAIN'],
$_ENV['TEST_CRM_TOKEN']
);
}
public function testCreateLead() {
$test_data = [
'name' => 'Тестовый лид ' . time(),
'phone' => '+7900' . rand(1000000, 9999999),
'email' => 'test' . time() . '@example.com',
'source' => 'phpunit_test'
];
$result = $this->crm->createLead($test_data);
$this->assertNotEmpty($result['id']);
$this->assertEquals($test_data['name'], $result['name']);
// Проверяем, что лид действительно создался в CRM
$lead = $this->crm->getLead($result['id']);
$this->assertNotNull($lead);
}
public function testCreateLeadWithInvalidData() {
$this->expectException(Exception::class);
$invalid_data = [
'name' => '', // Пустое имя
'phone' => 'invalid_phone',
'email' => 'invalid_email'
];
$this->crm->createLead($invalid_data);
}
}
Логирование для отладки
Подробное логирование — основа успешной отладки. Я логирую все этапы интеграции:
<?php
class CRMLogger {
private $log_file;
public function __construct($log_file = '/var/log/crm-integration.log') {
$this->log_file = $log_file;
}
public function logRequest($method, $url, $data, $response, $execution_time) {
$log_entry = [
'timestamp' => date('Y-m-d H:i:s'),
'method' => $method,
'url' => $url,
'request_data' => $data,
'response' => $response,
'execution_time' => $execution_time,
'memory_usage' => memory_get_usage(true)
];
file_put_contents(
$this->log_file,
json_encode($log_entry) . "\n",
FILE_APPEND | LOCK_EX
);
}
public function logError($error_message, $context = []) {
$log_entry = [
'timestamp' => date('Y-m-d H:i:s'),
'level' => 'ERROR',
'message' => $error_message,
'context' => $context,
'backtrace' => debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5)
];
file_put_contents(
$this->log_file,
json_encode($log_entry) . "\n",
FILE_APPEND | LOCK_EX
);
}
}
Частые ошибки и их решение
За годы работы я собрал коллекцию самых частых ошибок при интеграции с CRM. Поделюсь самыми критичными.
Проблемы с аутентификацией
Ошибка: "Unauthorized" или "Invalid token"
Чаще всего это происходит из-за истёкшего access_token. В большинстве CRM токены имеют ограниченный срок жизни. Нужно настроить автоматическое обновление:
<?php
public function refreshToken() {
$url = "https://{$this->subdomain}.amocrm.ru/oauth2/access_token";
$data = [
'client_id' => $this->client_id,
'client_secret' => $this->client_secret,
'grant_type' => 'refresh_token',
'refresh_token' => $this->refresh_token
];
$response = $this->makePostRequest($url, $data);
if (isset($response['access_token'])) {
$this->access_token = $response['access_token'];
$this->refresh_token = $response['refresh_token'];
// Сохраняем новые токены
$this->saveTokens();
return true;
}
return false;
}
Дублирование лидов
Частая проблема — создание дублей при повторной отправке формы. Решается проверкой существующих лидов перед созданием:
<?php
public function findExistingLead($phone, $email) {
$url = "https://{$this->subdomain}.amocrm.ru/api/v4/leads";
// Поиск по телефону
if ($phone) {
$params = [
'filter' => [
'custom_fields_values' => [
[
'field_id' => 123456, // ID поля "Телефон"
'values' => [$phone]
]
]
]
];
$response = $this->makeGetRequest($url, $params);
if (!empty($response['_embedded']['leads'])) {
return $response['_embedded']['leads'][0];
}
}
return null;
}
public function createOrUpdateLead($data) {
$existing_lead = $this->findExistingLead($data['phone'], $data['email']);
if ($existing_lead) {
// Обновляем существующий лид
return $this->updateLead($existing_lead['id'], $data);
} else {
// Создаём новый лид
return $this->createLead($data);
}
}
Проблемы с кодировкой
Особенно актуально при работе с русскими CRM. Всегда используйте UTF-8:
<?php
// Перед отправкой в CRM
$data = [
'name' => mb_convert_encoding($name, 'UTF-8', 'auto'),
'message' => mb_convert_encoding($message, 'UTF-8', 'auto')
];
// В заголовках curl
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json; charset=utf-8',
'Authorization: Bearer ' . $token
]);
Мониторинг и поддержка интеграции
Интеграция с CRM требует постоянного мониторинга. API может измениться, токены истечь, сервер CRM может быть недоступен.
Система уведомлений
Я настраиваю автоматические уведомления о проблемах с интеграцией. Простой скрипт проверяет количество ошибок в очереди:
<?php
// monitoring.php
$pdo = new PDO('mysql:host=localhost;dbname=site_db', $db_user, $db_pass);
// Проверяем количество ошибок за последний час
$stmt = $pdo->prepare("
SELECT COUNT(*) as error_count
FROM crm_queue
WHERE status = 'error'
AND created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)
");
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if ($result['error_count'] > 10) {
// Отправляем уведомление в Telegram
$message = "⚠️ Проблема с CRM интеграцией!\n";
$message .= "Ошибок за час: " . $result['error_count'];
sendTelegramAlert($message);
}
// Проверяем накопление задач в очереди
$queue_stmt = $pdo->prepare("
SELECT COUNT(*) as pending_count
FROM crm_queue
WHERE status = 'pending'
");
$queue_stmt->execute();
$queue_result = $queue_stmt->fetch(PDO::FETCH_ASSOC);
if ($queue_result['pending_count'] > 100) {
$message = "📊 Очередь CRM переполнена!\n";
$message .= "Необработанных задач: " . $queue_result['pending_count'];
sendTelegramAlert($message);
}
Backup и восстановление
Обязательно делайте резервные копии всех данных интеграции. У меня был случай, когда из-за ошибки в CRM потерялись все лиды за неделю, но удалось восстановить их из локальной базы.
Кстати, про общие принципы исправления ошибок на сайте я писал отдельную статью — многое оттуда применимо и к интеграциям.
Правильная интеграция CRM с сайтом — это инвестиция в будущее бизнеса. Да, на первый взгляд кажется сложно, но результат того стоит. Главное — не пытаться сделать всё сразу. Начните с простой передачи лидов, а потом постепенно добавляйте функциональность.
И помните: лучше потратить время на правильную архитектуру в начале, чем переделывать всё с нуля через год. Если нужна помощь с интеграцией — обращайтесь, всегда рад помочь с такими задачами через мою службу поддержки Битрикс или доработку сайта.
Нужна помощь с интеграцией CRM и сайта?
Наши эксперты помогут настроить эффективную интеграцию CRM с вашим сайтом под ключ.