ВОССТАНОВЛЕНИЕ ДАННЫХ · CRM · 2026

Клиент в панике
из CRM пропала вся переписка
Ждать - тоже решение, но не моё

Агентство зарубежной недвижимости ведёт продажи в CRM. После массовой загрузки сделки остались пустыми - без переписки и со сбитыми датами. Но переписка не пропала. Она осталась в контактах клиентов, надо было догадаться искать её там и вытянуть из контакта в сделку, а даты вернуть из выгрузки, сделанной до загрузки. Ждать ответа поддержки я не стал. За утро составил план и проверил его на контрольной сделке, остальное заняло больше времени. К вечеру восстановил первую часть сделок, основную выгрузку скрипт проходил дольше, по одной сделке, и прошёл до конца. Импорт, с которого всё началось, отработал до конца, но 270 сделок в нём завершились с ошибкой. Их свели с контактами, история и даты встали на место.

CRM REST API Python Импорт и выгрузки
5 шагов
в плане восстановления, который я предложил утром, пока поддержка молчала
2 сделки
сначала две контрольные, итоговый вид ушёл заказчику на согласование, массовый прогон только после его согласия
2 признака
контакт удалялся, только если у него нет имени и он создан в день импорта
КОРОТКО · РОЛИК

Коротко,
в ролике

Для тех, кому некогда читать. Ролик короче текста и кое-где упрощает, точные цифры и даты - ниже.

КОРОТКИЙ РОЛИК · 1:08 · субтитры можно включить в плеере
01 · ЗАДАЧА

Обычная разметка сделок
с импортом в конце

Заявки агентства идут из рекламы и копятся в CRM. Чтобы видеть, откуда пришёл человек, в сделках появились два новых поля, "Источник" и "Канал", а к ним правила заказчика, как их заполнять.

Я сделал две выгрузки. В одной все сделки с начала года, в другой прошлогодние сделки с одним тегом. Проставил поля по правилам. Один раз признаки в сделке спорили друг с другом, и я сначала спросил, какое правило главнее. Дальше файл надо было загрузить обратно так, чтобы обновились старые сделки, а новые не появились.

Сфера
Зарубежная недвижимость
Система
CRM отдела продаж
Объём
Две выгрузки, несколько тысяч сделок
Моя роль
Аналитик в команде интегратора
Инструменты
API CRM · Python
выгрузки Excel · журнал прогонов
02 · ЧТО СЛУЧИЛОСЬ

Три теста без дублей,
потом пошла полная загрузка

Руководитель проекта попросил сначала залить строк десять и убедиться, что обновляются существующие сделки. Первый тест задублировал контакты. Я удалил десять пустых дублей, нашёл, как грузить без них, и прогнал ещё тесты. Всего их было три, последний без дублей. После этого я выборочно проверил десять контактов.

Полная загрузка прошла иначе. Импорт отработал до конца, 270 сделок в нём завершились с ошибкой, а после него руководителю проекта показалось, что сделки удалились.

Они были на месте. Только у сделок стояла дата импорта вместо своей, переписка с клиентом пропала из карточки сделки, а в базе появились контакты без имени. Для заказчика это выглядело так, будто пропали вся переписка и история сделок, и он был в панике. На кону немалые суммы: агентство продаёт зарубежную недвижимость.

Для отдела продаж это значит вот что. Сделка, заведённая до импорта, числится созданной в день импорта, отчёты по датам врут. А менеджер открывает сделку и не видит, о чём уже говорил с клиентом.

Я описал всё поддержке платформы в тот же вечер, вопрос ушёл на вторую линию.

03 · ГДЕ ИСКАТЬ

Переписка не пропала,
она осталась в контактах

Когда ответит вторая линия, никто не знал. Утром ответа не было, а сделки так и стояли пустыми. Ждать я не стал и посмотрел, что в системе уцелело.

Уцелело почти всё нужное. Главное - переписка никуда не делась. Она осталась на исходном контакте клиента, просто в карточку сделки больше не попадала. Значит, её можно вытянуть из контакта обратно в сделку. Даты хранила выгрузка, которую я сделал под задачу до импорта. Всё это делается своими силами, через API, без ручной правки тысяч карточек.

Утром я предложил план из пяти шагов. В скрипте он немного поменялся. Например, дату создания скрипт берёт не из событий контакта, как было в плане, а из выгрузки. Вот что он делал с каждой сделкой.

  1. 01

    Находит исходный контакт

    После импорта у сделки бывало два контакта и больше. Исходный создан раньше, номер у него в CRM меньше, его скрипт и берёт. Лишние вслепую не удаляет, а пишет в журнал.

  2. 02

    Возвращает дату

    Ставит сделке дату создания из выгрузки, сделанной до импорта.

  3. 03

    Забирает историю с контакта

    Переписку в мессенджерах, звонки, смену ответственного и полей, примечания менеджеров.

  4. 04

    Переносит её в сделку

    Примечаниями и в том порядке, в каком всё происходило.

  5. 05

    Не задваивает

    Перед записью сверяет с тем, что в сделке уже есть. Если связь оборвётся и скрипт придётся запустить заново, второй копии переписки в сделке не появится.

04 · ПРОВЕРКА

Сначала пара сделок,
потом остальные

Скрипт пишет в живую CRM, поэтому я запускал его ступенями. У него есть пробный режим, в нём он только записывает в журнал, что поменял бы. Сначала две контрольные сделки по-настоящему. Дата встала на место, переписка вернулась в карточку. Итоговый вид через интегратора ушёл заказчику на согласование, заказчика всё устроило, и только после этого я запустил массовый прогон.

Массовый прогон шёл по выгрузкам. Первую, поменьше, я восстановил к вечеру того же дня. Под основную доработал скрипт. Он шёл по одной сделке, с паузой между запросами. Если платформа просила подождать, сервер отвечал ошибкой или рвалась связь, скрипт ждал и делал до трёх попыток, а сбой на одной сделке не останавливал остальные. Каждая сделка уходила в журнал, счётчик показывал, сколько пройдено. Основную выгрузку скрипт прошёл до конца - после согласования заказчиком оставшиеся сделки я тоже восстановил.

Отдельно были 270 сделок, которые завершились с ошибкой ещё при импорте. Их свели с их контактами, и после этого история и даты встали на место.

Иллюстрация, данные условные. Карточка сделки в CRM. Сверху сразу после импорта, с датой импорта, пустым контактом и без переписки. Снизу после восстановления, с исходной датой и историей переписки, перенесённой с контакта
ИЛЛЮСТРАЦИЯ, ДАННЫЕ УСЛОВНЫЕ · КАРТОЧКА СДЕЛКИ СРАЗУ ПОСЛЕ ИМПОРТА И ПОСЛЕ ВОССТАНОВЛЕНИЯ
05 · ПУСТЫЕ КОНТАКТЫ

Убрать мусор
и не задеть живые контакты

Через три дня после импорта выяснилось, что к компаниям привязаны контакты без имени. Это были дубли с того же импорта. Удалить их пачкой просто. Но контакт без имени может оказаться настоящим клиентом, которого менеджер не успел подписать, а мне было важно не заварить новую кашу.

Поэтому до удаления я через руководителя проекта спросил, всегда ли у них заводят контакт с именем. Ответ был "обычно с именем". Для удаления "обычно" мало. Руководитель предложил второй признак, дату создания, и признаков стало два. По ним я удалил безымянные дубли с импорта из рабочей CRM заказчика.

ПРИЗНАК 1

Нет имени

Рабочие контакты в этой CRM обычно подписаны. Одного этого признака мало.

ПРИЗНАК 2

Создан в день импорта

Удалялся только контакт, у которого сошлись оба признака.

ИТОГ

Безымянных не осталось

Сделки с несколькими контактами на месте, и у всех контакты с именами. Это я проверил сам.

КОМПАНИИ

Сообщил сам

Часть пустых контактов была привязана к компаниям, и после удаления эти привязки исчезли.

06 · ИТОГ

Что вернул
и что проверил заказчик

Было
После восстановления

Сделки с датой импорта вместо своей

→

Дата создания из выгрузки, сделанной до импорта

Переписку с клиентом не видно в сделке

→

История контакта лежит в сделке примечаниями, по порядку событий

Пустые контакты у сделок и компаний

→

Контактов без имени нет, сделки с несколькими контактами на месте

Новые поля "Источник" и "Канал" пустые, до разметки

→

Заполнены там, где подошло правило заказчика. Где правило не подходило, поле осталось пустым

Так стало и в первой выгрузке, и в основной. 270 сделок, которые завершились с ошибкой ещё при импорте, свели с их контактами, и история и даты у них встали на место.

Одну проверку я оставил заказчику. Привязки к компаниям у удалённых контактов пропали, а как было до импорта, знал только он, поэтому компании я попросил посмотреть его. Заказчик проверил, замечаний не было.

07 · ПЕРЕД ИМПОРТОМ

Если впереди массовый импорт,
сделайте это заранее

01

Выгрузите всё до загрузки

Всё, что будете менять. В этой истории даты вернула именно такая выгрузка.

02

Смотрите тест со стороны контактов

Тест на десять строк проверяйте не только по сделкам. Дубли в первом тесте появились как раз в контактах.

03

Удаляйте по двум признакам

Сразу по обоим и только после пробного прогона.

04

Чините так, чтобы можно было повторить

Скрипт починки должен переживать повторный запуск. Иначе обрыв связи на середине даёт вторую копию данных.

08 · СТЕК

Из чего
собрано

CRM
Система заказчика · сделки, контакты, компании
API CRM
Сделки, контакты, лента событий, примечания
Python · requests
Скрипты восстановления и чистки, повторы при сбоях сети
openpyxl
Чтение выгрузок Excel
Выгрузка до импорта
Слепок исходных дат создания
Журнал · пробный режим
Каждая сделка в журнал, первый запуск без записи
СЛЕДУЮЩИЙ ШАГ

Обсудим
задачу

Данные в CRM перепутались после массовой загрузки или чьей-то правки? Напишите. Посмотрю, что уцелело в системе и в выгрузках, и скажу, что можно вернуть, не задев живые данные.

TELEGRAM @Edgar_Pucinsh EMAIL pucinsh@yandex.ru КЕЙС Восстановление сделок в CRM, 2026

Ещё по теме - Сопровождение CRM · Внедрение CRM для туркомпании · CRM и автоматизация в Петербурге