Синхронизация остатков между сайтом и маркетплейсами

Магазин, который продаёт на сайте и одновременно на нескольких маркетплейсах, неизбежно сталкивается с вопросом: как сделать так, чтобы остаток одного и того же товара был одинаковым везде. Ответ — не разовая настройка, а процесс, который должен работать без участия человека каждый день, иначе расхождения возникают быстрее, чем их успевают замечать.

Почему рассинхрон остатков — это штрафы и потерянные продажи

Магазин продаёт один и тот же товар одновременно на собственном сайте, на Wildberries, на Ozon и на Яндекс.Маркете. У каждой площадки — своя карточка, своё поле «остаток» и своя скорость обновления данных. Пока эти поля обновляются вручную или с задержкой, склад существует в четырёх версиях одновременно, и рано или поздно они расходятся: на сайте товар «в наличии», на Wildberries — тоже, а физически на складе осталась одна единица.

Дальше срабатывает типовой сценарий: покупатель А оформляет заказ на Wildberries, покупатель Б через десять минут — на сайте. Один из двух заказов невозможно закрыть. Продавец либо отменяет заказ на маркетплейсе — а это фиксируется как отмена по вине продавца и бьёт по рейтингу карточки и по статистике аккаунта, либо звонит покупателю сайта с извинениями и возвратом денег. Второй сценарий не наказывается площадкой, но стоит репутации и повторных продаж.

Есть и обратная проблема, которая теряет деньги тише, но не менее эффективно: товар физически есть, но в остатке одной из площадок стоит ноль из-за задержки синхронизации. Карточка уходит из выдачи или помечается «нет в наличии», покупатель уходит к конкуренту, а продавец даже не узнаёт об упущенной продаже — в отчётах она нигде не отражается как потеря. Чем больше каналов продаж, тем выше суммарная стоимость обеих ошибок: и распроданного дважды товара, и товара, который есть, но не продаётся, потому что система «думает», что его нет.

Обе ошибки бьют не только по конкретному заказу. Повторные отмены на маркетплейсе снижают показатели аккаунта, от которых зависит видимость всех остальных карточек продавца в поиске площадки, — то есть цена одной несинхронизированной позиции со временем размазывается на весь ассортимент. А регулярные ложные «нет в наличии» на сайте отучают постоянных покупателей проверять сайт вообще, потому что он выглядит менее надёжным источником информации о наличии, чем маркетплейс.

Показателен типичный пример: магазин одежды с ассортиментом около 800 SKU продаёт через сайт, Wildberries и Ozon. Пока остатки сверяются вручную раз в сутки, за месяц у него скапливается несколько десятков вынужденных отмен заказов на маркетплейсах и примерно столько же упущенных продаж на сайте из-за карточек, ошибочно показанных как отсутствующие. По отдельности каждый случай выглядит как мелкая накладка, а суммарно — это заметная доля недополученной выручки, которую владелец магазина обычно не видит в отчётах, потому что она не оформлена как единая статья потерь.

Ручная выгрузка vs автоматическая синхронизация: где предел ручного режима

На старте, пока в ассортименте 30–50 товаров и один канал продаж помимо сайта, ручная синхронизация работает: раз в день выгрузить остатки в Excel, руками поправить цифры в личном кабинете маркетплейса — на это уходит 15–20 минут. Проблема не в том, что ручной режим неточен сам по себе, а в том, что он линейно не масштабируется: при 500+ SKU и 3–4 каналах продаж та же задача занимает уже несколько часов в день, и всё равно к моменту, когда выгрузка загружена в последнюю площадку, часть цифр в ней уже устарела.

Ручная выгрузка почти всегда означает разрыв в несколько часов между реальным состоянием склада и тем, что видят покупатели. За это время успевает пройти несколько продаж на других каналах — и именно в этом окне возникает риск повторной продажи одного и того же товара. Добавьте к этому банальные ошибки копирования между таблицами — сдвинутую строку, забытый ноль, не ту площадку — и получится, что ручной режим не столько экономит время, сколько незаметно копит риск, который реализуется в самый неподходящий момент: в высокий сезон, при резком всплеске спроса на конкретный SKU.

Отдельная сложность ручного режима — распределение ответственности внутри команды. Пока выгрузку остатков делает один и тот же человек, ошибки хотя бы предсказуемы: он знает особенности каждой площадки и держит в голове проблемные SKU. Как только эта задача передаётся другому сотруднику, уходит в отпуск или размывается между несколькими людьми, накопленное неформальное знание теряется вместе с ней, а вместе с ним растёт и частота ошибок — просто потому, что новый человек не знает всех нюансов, которые предыдущий держал в уме, а не фиксировал в системе.

Автоматическая синхронизация закрывает именно это окно. Она забирает данные об остатке из одного источника и передаёт их во все каналы через API маркетплейсов без участия человека на каждом шаге. Отличие не в том, что автоматизация «умнее» человека, а в том, что она реагирует на изменение остатка за секунды или минуты, а не за часы, и делает это одинаково для всех площадок сразу, без риска забыть один из каналов.

Граница между «ручной режим ещё работает» и «пора автоматизировать» проходит не по количеству SKU как таковому, а по тому, успевает ли человек обновлять данные быстрее, чем меняется реальный остаток. Если склад пополняется и распродаётся несколько раз в день на нескольких каналах одновременно, любой фиксированный график ручной выгрузки — хоть раз в час — оставляет разрыв, который со временем только растёт вместе с ассортиментом и числом площадок.

Как часто должна обновляться синхронизация (интервалы, событийная модель)

Есть два принципиально разных подхода к обновлению остатков. Первый — интервальная синхронизация: система раз в 5, 15 или 30 минут опрашивает состояние склада и передаёт актуальные цифры на все площадки. Второй — событийная модель: остаток пересчитывается и рассылается сразу после конкретного триггера — оплаченного заказа, возврата, ручной корректировки на складе.

У интервальной модели есть слабое место — «слепое окно» между двумя циклами обновления. Если синхронизация идёт раз в 15 минут, а ходовой товар за это время продаётся на двух каналах одновременно, риск повторной продажи никуда не исчезает, он просто становится реже, а не нулевым. Для медленно оборачиваемых товаров этого достаточно, для хитов продаж — нет.

Событийная модель закрывает это окно почти полностью: как только заказ подтверждён на любом из каналов, остаток списывается и это изменение сразу же уходит на остальные площадки, а не ждёт следующего цикла опроса. На практике оптимальная схема комбинирует оба подхода: событийное списание отрабатывает моментальную реакцию на продажу, а регулярная фоновая сверка (например, раз в час или раз в сутки) страхует от пропущенных событий — сбоя API площадки, обрыва соединения, ручной корректировки склада, которая произошла в обход системы.

Частоту фоновой сверки стоит привязывать к тому, насколько критичен для бизнеса пропущенный сбой. Для магазина с товарами длительного хранения достаточно ночной сверки раз в сутки — цена задержки в обнаружении расхождения невысока. Для скоропортящегося или ограниченного по партии товара имеет смысл сверять остатки каждый час: чем короче цикл сверки, тем быстрее система обнаружит и исправит расхождение, возникшее не по причине продажи, а из-за технического сбоя на одной из площадок.

Что делать с резервом/минимальным остатком на каждой площадке

Даже при событийной синхронизации между продажей и фактическим обновлением остатка на площадке проходит какое-то время — доли секунды на API-запрос, задержка на стороне маркетплейса при обработке вебхука, время на подтверждение оплаты. Это время не равно нулю, и если товар продаётся «под ноль» до последней единицы, именно в эту паузу и попадает риск двойной продажи.

Решение — буфер, он же минимальный остаток: порог, ниже которого товар помечается «нет в наличии», даже если физически на складе ещё осталась одна-две единицы. Буфер не должен быть одинаковым для всего каталога:

  • для товара, который продаётся 1–2 раза в неделю, достаточно буфера в 1 единицу — риск столкновения двух заказов в узком окне синхронизации минимален;
  • для хита продаж, который уходит по 5–10 заказов в час сразу на нескольких площадках, буфер стоит рассчитывать от скорости продаж за интервал синхронизации — если товар продаётся со скоростью 2 единицы в 15 минут, а синхронизация идёт раз в 15 минут, буфер меньше 2 единиц уже рискован;
  • для товара с ограниченной партией (последняя поставка, сезонный товар без пополнения) буфер можно сознательно завысить, чтобы часть остатка «придержать» под конкретный канал с наибольшей маржой.

Буфер можно задавать не только по товару, но и по площадке: например, оставлять больший запас прочности на канале с самым долгим циклом подтверждения заказа и меньший — там, где заказ подтверждается почти мгновенно.

Статичный буфер, заданный один раз при настройке, со временем теряет точность: скорость продаж товара меняется вместе с сезоном, акциями, появлением похожего товара у конкурента. Поэтому буфер стоит пересматривать регулярно, а не считать разовой настройкой, — в идеале пересчитывать его автоматически на основе фактической статистики продаж за последние недели, а не держать в голове у одного менеджера, который завёл цифру полгода назад и забыл о ней.

Как это устроено в единой системе (сайт + все МП из одного каталога)

Проще всего эта логика работает не тогда, когда остатки синхронизируются между несколькими самостоятельными системами учёта, а тогда, когда у сайта и всех маркетплейсов один источник данных об остатке. В «Витрине» сайт на своём домене и карточки на Wildberries, Ozon, Яндекс.Маркете и МегаМаркете ведутся из единого каталога: остаток меняется один раз в одном месте, а дальше расходится по всем каналам продаж без ручной сверки таблиц. Это не отменяет необходимость настроить буферы и интервалы под конкретный ассортимент, но убирает саму причину рассинхрона — параллельные, не связанные друг с другом источники правды об остатке.

Переход с разрозненных выгрузок на единый каталог обычно не требует полной перестройки процессов за один шаг: сначала подключается основной канал с наибольшим оборотом, затем к нему поочерёдно добавляются остальные площадки, а буферы и интервалы синхронизации донастраиваются уже по факту наблюдения за реальной скоростью продаж. К моменту, когда все каналы объединены вокруг одного каталога, ручная сверка остатков перестаёт быть ежедневной задачей и превращается в редкое исключение, а не в рутину, отнимающую часы у сотрудника каждый день.

Готовы навести порядок в магазине?

Сайт, Wildberries, Ozon, Яндекс.Маркет, МегаМаркет и 1С — в одном месте, с реальной аналитикой прибыли по каждому товару.

Посмотреть тарифы