Миграция данных из сторонней CRM в Битрикс24
Переход с Salesforce, HubSpot, Pipedrive или самописной CRM в Битрикс24 — это не просто экспорт CSV и импорт. Каждая CRM имеет собственную модель данных, логику связей и специфику полей. Битрикс24 — тоже. Главная задача миграции: не потерять связи между сущностями и сохранить историческую ценность данных.
Структура данных Битрикс24
Прежде чем мигрировать, нужно понять, куда кладутся данные. Ключевые сущности Битрикс24:
| Сущность | Таблица БД | REST API |
|---|---|---|
| Контакты | b_crm_contact |
crm.contact.* |
| Компании | b_crm_company |
crm.company.* |
| Лиды | b_crm_lead |
crm.lead.* |
| Сделки | b_crm_deal |
crm.deal.* |
| Активности (звонки, письма) | b_crm_activity |
crm.activity.* |
| Пользовательские поля | b_uts_crm_* |
crm.*.userfield.* |
Связи: контакт привязан к компании через b_crm_company_contact, сделка — к контакту через b_crm_deal_contact.
Инструменты миграции
REST API Битрикс24 — официальный и наиболее надёжный метод. Поддерживает пакетные запросы (batch), что критично при переносе тысяч записей:
$batchCalls = [];
foreach ($contacts as $contact) {
$batchCalls['create_contact_' . $contact['id']] = [
'method' => 'crm.contact.add',
'params' => [
'fields' => [
'NAME' => $contact['first_name'],
'LAST_NAME' => $contact['last_name'],
'EMAIL' => [['VALUE' => $contact['email'], 'VALUE_TYPE' => 'WORK']],
'PHONE' => [['VALUE' => $contact['phone'], 'VALUE_TYPE' => 'WORK']],
'COMPANY_ID' => $companyMapping[$contact['company_id']] ?? null,
'UF_CRM_SOURCE_ID' => $contact['id'], // Сохраняем ID источника
],
],
];
}
// Отправляем пакет (до 50 запросов за раз)
$result = $b24->callBatch(array_slice($batchCalls, 0, 50));
Прямая запись в БД — для облачного Битрикс24 недоступна. Для коробочной версии — ускоряет массовый импорт, но требует ручной перестройки индексов и осторожности с триггерами.
Маппинг полей: самая трудоёмкая часть
Каждое поле источника нужно сопоставить с полем Битрикс24. Пример маппинга из HubSpot:
| HubSpot | Битрикс24 | Примечание |
|---|---|---|
firstname + lastname |
NAME + LAST_NAME |
Разделение |
email |
EMAIL[0].VALUE |
Тип: WORK |
phone |
PHONE[0].VALUE |
Нормализация |
company |
COMPANY_ID |
Создать компанию отдельно |
lifecyclestage |
STATUS_ID |
Маппинг стадий |
hs_lead_status |
Пользовательское поле | UF_CRM_HS_STATUS |
createdate |
DATE_CREATE |
Только через прямой SQL (коробка) |
Нестандартные поля HubSpot переносятся в пользовательские поля Битрикс24 (UF-поля). Их нужно создать заранее через crm.contact.userfield.add.
Последовательность создания сущностей
Порядок важен из-за ссылочной целостности:
- Компании (у контактов и сделок нет зависимостей выше)
- Контакты (привязка к компаниям)
- Сделки (привязка к контактам и компаниям)
- Активности — звонки, письма, задачи (привязка к сделкам/контактам)
-
Комментарии и история — через
crm.timeline.comment.add
После создания каждой сущности сохраняем маппинг: source_id → b24_id. Это нужно для привязки зависимых объектов.
$mappingFile = 'migration_map.json';
$mapping = json_decode(file_get_contents($mappingFile), true) ?: [];
$mapping['contacts'][$sourceContact['id']] = $b24ContactId;
file_put_contents($mappingFile, json_encode($mapping));
Обработка дубликатов
Сторонние CRM часто содержат дубли контактов (один человек под разными email). Перед миграцией — дедупликация в источнике. Стратегии:
- Жёсткая: один уникальный email = один контакт. Дубли объединяются.
-
Мягкая: переносим все записи, затем используем встроенный инструмент дедупликации Битрикс24 (
Контакты → Дубликаты).
Рекомендуется мягкая стратегия — сохраняет все данные, дедупликацию менеджеры делают в процессе работы.
История активностей: звонки и письма
Перенос истории коммуникаций — опциональная, но ценная часть. Звонки из источника → crm.activity.add с типом CALL:
$b24->call('crm.activity.add', [
'fields' => [
'OWNER_TYPE_ID' => 3, // 3 = контакт, 2 = сделка
'OWNER_ID' => $mapping['contacts'][$call['contact_id']],
'TYPE_ID' => 2, // Звонок
'SUBJECT' => 'Звонок от ' . date('d.m.Y', strtotime($call['created_at'])),
'DESCRIPTION' => $call['notes'],
'START_TIME' => $call['created_at'],
'END_TIME' => $call['ended_at'],
'DIRECTION' => $call['direction'] === 'inbound' ? 1 : 2,
'COMPLETED' => 'Y',
],
]);
Контроль качества миграции
После переноса — обязательная сверка:
# Источник
SELECT COUNT(*) FROM hubspot_contacts WHERE is_deleted = 0;
# → 12 847
# Битрикс24
SELECT COUNT(*) FROM b_crm_contact WHERE DELETED = 'N';
# → 12 839 ← 8 записей потеряно — расследуем
Расхождения логируются и анализируются: обычно это дубли или записи с невалидными данными (пустой email, некорректный телефон).
Сроки выполнения
| Объём данных | Срок |
|---|---|
| До 5 000 контактов + сделки без истории | 1–2 недели |
| 5 000–50 000 записей + базовые активности | 3–6 недель |
| 50 000+ записей + полная история коммуникаций | 2–4 месяца |
Успешная миграция — это когда менеджеры в Битрикс24 на следующий день видят полную историю отношений с клиентами, как будто всегда работали здесь.







