Остатки и цены на сайте жили отдельной жизнью от склада. Обновляли их выгрузкой раз в неделю руками, поэтому покупатели заказывали то, чего давно нет, а менеджеры звонили извиняться. Цена на сайте и цена в счёте расходились регулярно.
Первым делом не выгрузка, а сопоставление позиций. Артикулы совпадают не полностью: фасовки и варианты в учётной системе часто заведены отдельными позициями, а на сайте это варианты одной карточки. Такие товары молча остаются со старым остатком, и именно из-за них обмен считают неработающим. Сначала отчёт: что сопоставилось, что нет, что задвоено.
Дальше правила исключений: подарочные наборы, позиции других площадок, упаковка и служебные группы не должны попадать на сайт вообще.
Главную защиту поставила на сбой: если учётная система ответила ошибкой или отдала пустой список, обмен не записывает нули. Иначе однажды утром магазин окажется пустым, и никто не поймёт, почему.
Поведение при нулевом остатке обсудили отдельно: скрывать товар или помечать. Массовое скрытие страниц роняет позиции в поиске, и возвращаются они медленно.
Остатки и цены обновляются по расписанию автоматически, с отчётом о сопоставлении, исключениями по группам, защитой от обнуления и журналом, по которому видно, что и когда изменилось.
Заказы приходят на то, что действительно есть на складе.