Двусторонняя интеграция amoCRM и торговой платформы ABCP для магазина автозапчастей: статусы возвратов в обе стороны, сделки едут по воронке сами. Node.js, TypeScript, Express
Интернет-магазин автозапчастей: продажи идут через платформу ABCP, а возвраты ведутся в amoCRM. Пока связи не было, менеджер переставлял статусы руками в двух окнах, а изменения в ABCP сделка не видела: статусы расходились, сделки зависали, автоматизация воронки не срабатывала.
Задача в два этапа. Первый: поле в сделке меняет статус позиции заказа в ABCP. Второй: любое изменение статуса в ABCP само приходит в сделку и переводит её на нужный этап. У ABCP нет вебхуков, в тарифе amoCRM нет триггера на изменение поля, а это боевой продакшн с тысячами сделок, где нельзя дублировать, откатывать или терять события.
Что сделано:
- сервис на Node.js и TypeScript (Express) под pm2: прямой канал по вебхукам amoCRM, обратный - опрос истории статусов ABCP каждые 5 минут;
- по каждой позиции хранится отпечаток последней обработанной записи: в сделку попадает только новое и только чужое, без циклов;
- защита от эха: собственная запись не возвращается обратно и не откатывает статус менеджера;
- устойчивость к API: очередь с лимитом запросов, повторы, деление «отравленных» пачек;
- соответствия статусов и этапов в трёх JSON-конфигах, правки без программиста и без перезапуска;
- деплой push в main => GitHub Actions => сервер с проверкой /health, включение обратного канала через режим DRY-RUN.
Результат: обе системы синхронны, менеджер работает в одном окне amoCRM. Около 5 000 сделок в воронке, около 800 позиций под наблюдением, ни одного дубля, отката или потерянного события за время работы.
Стек: Node.js, TypeScript, Express, amoCRM API v4, ABCP API, pm2, GitHub Actions.