Усі записи

Як відновити дані, які масово видалили в CRM

Хтось прогнав масову операцію не на тому сегменті, і зі списку зникли теги, зв’язки або цілі картки. Кнопки «скасувати» немає. Але в більшості випадків дані ще на місці.

ПОЗНАЧЕНО — НЕ СТЕРТО відновлено 3 / 6 ЗАПИС DELETED_AT 8412 · тег «клієнт» null 8413 · тег «VIP» null 8414 · тег «клієнт» null 8415 · тег «розсилка» 12:40:07 8416 · тег «клієнт» 12:40:09 8417 · тег «VIP» 12:40:12 restore.js --live ЛОГ ЗАПИТІВ POST /link 201 POST /link 201 POST /link 201 зворотний прогін цього файла — кнопка «скасувати»
Коротка відповідь

Спершу з’ясуйте, чи запис справді видалено. Багато систем робить soft delete — рядок лишається в базі з позначкою, і його можна повернути тим самим методом, яким створювали. Далі: зберіть перелік того, що треба відновити, — з копії бази, експорту або логів; проженіть його сухим прогоном без запису; і лише потім запускайте живий прогін, записуючи кожен запит у лог. Той самий лог потім працює як кнопка скасування.

Розділи · 8

Масову операцію запустили не на тому сегменті. Зникли теги, зв’язки контактів із сегментами, іноді самі картки. Кнопки «скасувати» в інтерфейсі немає, підтримка часто відповідає лише за добу, а менеджери вже не можуть працювати.

У більшості випадків дані нікуди не поділися.

#Видалено чи лише позначено видаленим

Перед будь-якими діями треба відповісти на одне запитання: запис видалено чи позначено видаленим.

Soft delete — рядок лишається в базі, йому просто проставляють позначку. Так працює багато CRM, бо це дешевше і безпечніше. Перевірити просто: зробіть запит за ідентифікатором об’єкта через API. Якщо приходить 200 і дані на місці — це soft delete, і відновлення зводиться до зняття позначки або повторного створення зв’язку.

Hard delete — рядка немає. Тоді джерелом лишається резервна копія або експорт, зроблений до інциденту.

#Звідки взяти перелік того, що відновлювати

Потрібен список пар «що з чим було зв’язано» перед інцидентом. Джерела за спаданням надійності:

  • резервна копія бази — якщо вона є і зроблена до події;
  • експорт із адмінки — багато систем дають вивантажити зв’язки таблицею;
  • логи самої операції — якщо той, хто видаляв, зберіг результат прогону;
  • сторонні системи — якщо ті самі дані дублюються в іншому сервісі.

Часу тут менше, ніж здається: у деяких системах позначені видаленими записи фізично прибирають через кілька днів. Тому список збирають насамперед, ще до того, як писати код відновлення.

#Чому сухий прогін обов’язковий

Скрипт відновлення має за умовчанням нічого не робити. Тільки показувати, що саме він збирається зробити.

node restore.js                 # нічого не шле, друкує перші 10 запитів
node restore.js --live          # тільки після того, як перевірили очима

На сухому прогоні перевіряють три речі: правильні ідентифікатори, правильний метод і правильну кількість. Якщо скрипт збирається зробити тридцять тисяч запитів, а видалили три тисячі зв’язків — щось не так із переліком, і краще це побачити зараз.

Це головна частина, і роблять її до запуску, а не після.

Кожен виконаний запит записують окремим рядком: метод, адреса, тіло, код відповіді, час. Формат — по одному запису JSON на рядок, щоб файл можна було читати частинами й не тримати в пам’яті.

Цей лог дає три речі:

  • доказ. Видно, що саме зроблено, а не «здається, відновили»;
  • відновлення після збою. Зв’язок обірвався на середині — повторний запуск бере тільки те, чого немає в лог-файлі;
  • скасування. Той самий файл, прогнаний зворотним методом, повертає все як було.
node restore.js --live --method=DELETE --from-log=logs/2026-08-13.jsonl

Це і є кнопка «скасувати», якої немає в інтерфейсі. Її треба зробити самому, і зробити до живого запуску.

#Що перевірити перед живим запуском

  • Те, що видаляє, зупинено.
  • Перелік зібрано і збережено окремим файлом.
  • Сухий прогін показав очікувану кількість і правильний метод.
  • Перевірено на одному записі, і результат переглянуто очима в інтерфейсі.
  • Скрипт пише лог у файл, а не в консоль.
  • Зрозуміло, як відкотити: команда відкату написана заздалегідь.

Пункт про один запис пропускають найчастіше. Він коштує хвилину й показує помилку до того, як вона стане масовою.

#Що зробити після відновлення

Інцидент варто закривати не відновленням, а усуненням причини.

У частині CRM масові операції відкриті всім, у кого є доступ до сегментів. Мінімум, який має сенс: обмежити коло тих, хто може їх запускати, і завести правило — перед масовою дією зберігати експорт того сегмента. Це тридцять секунд, які наступного разу зведуть відновлення до одного імпорту.

#Висновки

  • Спершу зупиніть те, що видаляє, і лише потім відновлюйте.
  • Перевірте, чи це soft delete: часто дані ще на місці.
  • Перелік для відновлення збирайте одразу — позначені записи можуть прибрати остаточно.
  • Скрипт за умовчанням не пише нічого; живий запуск — окремим прапорцем.
  • Кожен запит у лог. Той самий лог — доказ, продовження після збою і відкат.
  • Перед масовим прогоном перевірте на одному записі.

#Часті запитання

#Скільки часу є на відновлення?

Залежить від системи. Позначені видаленими записи можуть прибрати остаточно через кілька днів. Вважайте, що у вас доба, і збирайте перелік насамперед.

#Чи можна відновити, якщо резервної копії немає?

Часто так — якщо це soft delete або якщо ті самі зв’язки є в іншій системі. Якщо це hard delete й дублювання ніде немає, відновлювати нема з чого.

#Хто має це робити — ваша команда чи підтримка сервісу?

Якщо є API, швидше зробити самому: підтримка часто відповідає протягом доби й рідко відновлює вибірково. Звертатися варто, коли йдеться про hard delete й потрібна копія з їхнього боку.

weirflow — Автоматизація бізнес-процесів. Опубліковано: 14 серпня 2026

Опишіть свою ситуацію

Напишіть, який процес забирає найбільше часу. Відповімо, що з нього можна автоматизувати і скільки це приблизно коштує.

Обговорити завдання
Усі записи