Контекст
При смене подписки и реорганизации отдела продаж потребовалось перенести данные между двумя аккаунтами amoCRM с сохранением связей: лид → контакт → заметки, и переназначить ответственных по mapping-таблице.
Решение
Два независимых CLI:
- Миграция — итерирует лиды старого аккаунта постранично, для каждого тянет контакты и заметки, создаёт сущности в новом аккаунте, связывает их (
linkContactsToLead) и переносит заметки. ПоддерживаетTEST_MODEдля холостого прогона. - Синхронизация responsible — обходит лиды, применяет mapping
USER_MAP, переназначаетresponsible_user_idчерез PATCH, имеетDRY_RUNиTEST_LIMITдля предпрогона.
Стек и архитектура
- Runtime: Node.js, TypeScript 5.
- HTTP: axios c retry-обёрткой
amoGet/amoPatch. - Конфиг: dotenv (токены, base-URLs, mapping-таблица).
- Сборка: tsc →
dist/.
Роль и результат
Мы сделали оба инструмента под конкретные конфиги, обходя rate-limit amoCRM и сохраняя историю заметок и связей. Перенос прошёл без потерь данных, переназначение responsible — за одну ночь.