Агентство зарубежной недвижимости ведёт продажи в CRM. После массовой загрузки сделки остались пустыми - без переписки и со сбитыми датами. Но переписка не пропала. Она осталась в контактах клиентов, надо было догадаться искать её там и вытянуть из контакта в сделку, а даты вернуть из выгрузки, сделанной до загрузки. Ждать ответа поддержки я не стал. За утро составил план и проверил его на контрольной сделке, остальное заняло больше времени. К вечеру восстановил первую часть сделок, основную выгрузку скрипт проходил дольше, по одной сделке, и прошёл до конца. Импорт, с которого всё началось, отработал до конца, но 270 сделок в нём завершились с ошибкой. Их свели с контактами, история и даты встали на место.
Для тех, кому некогда читать. Ролик короче текста и кое-где упрощает, точные цифры и даты - ниже.
Заявки агентства идут из рекламы и копятся в CRM. Чтобы видеть, откуда пришёл человек, в сделках появились два новых поля, "Источник" и "Канал", а к ним правила заказчика, как их заполнять.
Я сделал две выгрузки. В одной все сделки с начала года, в другой прошлогодние сделки с одним тегом. Проставил поля по правилам. Один раз признаки в сделке спорили друг с другом, и я сначала спросил, какое правило главнее. Дальше файл надо было загрузить обратно так, чтобы обновились старые сделки, а новые не появились.
Руководитель проекта попросил сначала залить строк десять и убедиться, что обновляются существующие сделки. Первый тест задублировал контакты. Я удалил десять пустых дублей, нашёл, как грузить без них, и прогнал ещё тесты. Всего их было три, последний без дублей. После этого я выборочно проверил десять контактов.
Полная загрузка прошла иначе. Импорт отработал до конца, 270 сделок в нём завершились с ошибкой, а после него руководителю проекта показалось, что сделки удалились.
Они были на месте. Только у сделок стояла дата импорта вместо своей, переписка с клиентом пропала из карточки сделки, а в базе появились контакты без имени. Для заказчика это выглядело так, будто пропали вся переписка и история сделок, и он был в панике. На кону немалые суммы: агентство продаёт зарубежную недвижимость.
Для отдела продаж это значит вот что. Сделка, заведённая до импорта, числится созданной в день импорта, отчёты по датам врут. А менеджер открывает сделку и не видит, о чём уже говорил с клиентом.
Я описал всё поддержке платформы в тот же вечер, вопрос ушёл на вторую линию.
Когда ответит вторая линия, никто не знал. Утром ответа не было, а сделки так и стояли пустыми. Ждать я не стал и посмотрел, что в системе уцелело.
Уцелело почти всё нужное. Главное - переписка никуда не делась. Она осталась на исходном контакте клиента, просто в карточку сделки больше не попадала. Значит, её можно вытянуть из контакта обратно в сделку. Даты хранила выгрузка, которую я сделал под задачу до импорта. Всё это делается своими силами, через API, без ручной правки тысяч карточек.
Утром я предложил план из пяти шагов. В скрипте он немного поменялся. Например, дату создания скрипт берёт не из событий контакта, как было в плане, а из выгрузки. Вот что он делал с каждой сделкой.
Находит исходный контакт
После импорта у сделки бывало два контакта и больше. Исходный создан раньше, номер у него в CRM меньше, его скрипт и берёт. Лишние вслепую не удаляет, а пишет в журнал.
Возвращает дату
Ставит сделке дату создания из выгрузки, сделанной до импорта.
Забирает историю с контакта
Переписку в мессенджерах, звонки, смену ответственного и полей, примечания менеджеров.
Переносит её в сделку
Примечаниями и в том порядке, в каком всё происходило.
Не задваивает
Перед записью сверяет с тем, что в сделке уже есть. Если связь оборвётся и скрипт придётся запустить заново, второй копии переписки в сделке не появится.
Скрипт пишет в живую CRM, поэтому я запускал его ступенями. У него есть пробный режим, в нём он только записывает в журнал, что поменял бы. Сначала две контрольные сделки по-настоящему. Дата встала на место, переписка вернулась в карточку. Итоговый вид через интегратора ушёл заказчику на согласование, заказчика всё устроило, и только после этого я запустил массовый прогон.
Массовый прогон шёл по выгрузкам. Первую, поменьше, я восстановил к вечеру того же дня. Под основную доработал скрипт. Он шёл по одной сделке, с паузой между запросами. Если платформа просила подождать, сервер отвечал ошибкой или рвалась связь, скрипт ждал и делал до трёх попыток, а сбой на одной сделке не останавливал остальные. Каждая сделка уходила в журнал, счётчик показывал, сколько пройдено. Основную выгрузку скрипт прошёл до конца - после согласования заказчиком оставшиеся сделки я тоже восстановил.
Отдельно были 270 сделок, которые завершились с ошибкой ещё при импорте. Их свели с их контактами, и после этого история и даты встали на место.
Через три дня после импорта выяснилось, что к компаниям привязаны контакты без имени. Это были дубли с того же импорта. Удалить их пачкой просто. Но контакт без имени может оказаться настоящим клиентом, которого менеджер не успел подписать, а мне было важно не заварить новую кашу.
Поэтому до удаления я через руководителя проекта спросил, всегда ли у них заводят контакт с именем. Ответ был "обычно с именем". Для удаления "обычно" мало. Руководитель предложил второй признак, дату создания, и признаков стало два. По ним я удалил безымянные дубли с импорта из рабочей CRM заказчика.
Рабочие контакты в этой CRM обычно подписаны. Одного этого признака мало.
Удалялся только контакт, у которого сошлись оба признака.
Сделки с несколькими контактами на месте, и у всех контакты с именами. Это я проверил сам.
Часть пустых контактов была привязана к компаниям, и после удаления эти привязки исчезли.
Сделки с датой импорта вместо своей
Дата создания из выгрузки, сделанной до импорта
Переписку с клиентом не видно в сделке
История контакта лежит в сделке примечаниями, по порядку событий
Пустые контакты у сделок и компаний
Контактов без имени нет, сделки с несколькими контактами на месте
Новые поля "Источник" и "Канал" пустые, до разметки
Заполнены там, где подошло правило заказчика. Где правило не подходило, поле осталось пустым
Так стало и в первой выгрузке, и в основной. 270 сделок, которые завершились с ошибкой ещё при импорте, свели с их контактами, и история и даты у них встали на место.
Одну проверку я оставил заказчику. Привязки к компаниям у удалённых контактов пропали, а как было до импорта, знал только он, поэтому компании я попросил посмотреть его. Заказчик проверил, замечаний не было.
Всё, что будете менять. В этой истории даты вернула именно такая выгрузка.
Тест на десять строк проверяйте не только по сделкам. Дубли в первом тесте появились как раз в контактах.
Сразу по обоим и только после пробного прогона.
Скрипт починки должен переживать повторный запуск. Иначе обрыв связи на середине даёт вторую копию данных.
Данные в CRM перепутались после массовой загрузки или чьей-то правки? Напишите. Посмотрю, что уцелело в системе и в выгрузках, и скажу, что можно вернуть, не задев живые данные.
Ещё по теме - Сопровождение CRM · Внедрение CRM для туркомпании · CRM и автоматизация в Петербурге