Как перенести товары с Ozon на свой сайт
12 сентября 2024
У продавца с тысячей карточек на Ozon есть готовый каталог: названия, описания, цены, фотографии, остатки. Всё это уже набито, руками или через поставщика, и повторять эту работу ради собственного сайта никто не станет. Именно на этом обычно и заканчиваются разговоры про «надо бы свой магазин»: перспектива перебивать тысячу карточек вручную закрывает тему на год.
Между тем каталог переносится машинно. Ozon отдаёт его через Seller API, и дальше вопрос только в том, что делать с расхождениями: у части карточек нет артикула, у части цена стоит нулём, а фотографии лежат на сервере площадки и остаются там даже после переноса. Ниже, последовательность, которая доводит дело до работающей витрины, и места, где обычно спотыкаются.
Шаг 1. Ключ Seller API
В кабинете продавца: Настройки → API-ключи → Сгенерировать ключ. Оттуда нужны два значения. Client-Id и Api-Key. Ключ выдаётся с ограниченным набором прав и сроком жизни около полугода, так что для разового переноса это безопасная операция: даже утечка такого ключа не даёт доступа к деньгам или к смене реквизитов.
Если карточек много, ключ удобно создать заранее и проверить, что он работает: неверный Client-Id даёт ту же ошибку, что и отозванный ключ, и без проверки это выясняется в момент переноса.
Ключ нужен ровно на время переноса. В FastoShop он не сохраняется, ни в базе, ни в конфигурации; после того как каталог приехал, значение можно отозвать в кабинете, и на работу магазина это не повлияет. Если вы переносите каталог не с площадки, а со своего старого сайта, ключ не понадобится вовсе: подойдёт обычная ссылка на YML-выгрузку, которую отдают Битрикс, InSales и Тильда.
Шаг 2. Посмотреть, что приедет, до записи
Это тот шаг, который чаще всего пропускают, а потом разбирают последствия. Перед записью стоит получить разбор: сколько карточек новых, сколько уже есть, у скольких нет артикула и у скольких цена нулевая. Артикул, единственное, по чему товары сопоставляются между загрузками, поэтому карточка без него не переносится: угадывать по названию значит рано или поздно склеить два разных товара.
Отдельно смотрите на цены. У площадок бывает несколько ценовых полей, и не все они заполнены; карточка с нулём, это не бесплатный товар, а отсутствие данных, и класть её на витрину нельзя. Разумное поведение импорта, пропустить такие позиции и сказать, сколько их было, а не выложить в магазин товар за ноль рублей.
| Что видно до записи | Почему это важно |
|---|---|
| Новых карточек | Понятно, сколько появится товаров на витрине |
| Без артикула | Эти не перенесутся: сопоставлять их между загрузками не по чему |
| С нулевой ценой | Пропускаются, иначе товар уходит в продажу за ноль |
| Повторяющиеся артикулы | Дубли внутри самой выгрузки, считаются отдельно |
| Изменение цен | При повторной загрузке видно, где цена выросла или упала сильнее всего |
Шаг 3. Перенос
Дальше нажимается кнопка. Ориентир по времени: каталог на 24 000 позиций переносится меньше чем за минуту, и это измеренная цифра, а не обещание. Работа идёт на сервере, поэтому страницу можно закрыть, возвращаетесь и видите результат.
Стоит сразу задать группу поставщика. Магазин часто живёт с двух-трёх источников: прайс оптовика, собственные позиции, остатки с площадки. Если каждая загрузка обновляет только свою группу, то новый прайс «Ромашки» не перепишет цены на ваши собственные товары и не обнулит остатки другого поставщика. Без такого разделения вторая же загрузка затирает результаты первой, и это выясняется в самый неподходящий момент.
Шаг 4. Фотографии
Здесь скрыта неочевидная зависимость. При переносе фотографии обычно подключаются ссылками на сервер источника: так каталог приезжает за минуту, а не за сутки, 24 000 карточек это больше 60 000 снимков, и скачивать их синхронно во время импорта бессмысленно.
Но пока фото остаются ссылками, витрина зависит от чужого сервера. Закроют доступ, сменят адреса или просто выключат хостинг, и магазин останется без единой картинки. Поэтому фотографии стоит забрать к себе отдельным действием: оно идёт в фоне, показывает прогресс и его можно остановить. Что не скачалось, остаётся ссылкой, и повторный запуск добирает только это.
Вместе с фотографиями имеет смысл сделать уменьшенные копии для плитки каталога. Разница ощутимая: снимок поставщика на 197 КБ превращается в 16 КБ, то есть экономия около 92%, а страница каталога из шестидесяти товаров весит 958 КБ вместо девяти мегабайт. Для покупателя с телефона это разница между «открылось» и «подождите».
Если артикулов нет вовсе
Бывает каталог, где артикул не заполнен почти нигде: карточки заводили быстро, поле осталось пустым. Такой каталог переносится один раз и дальше не обновляется, сопоставлять нечего, и каждая новая загрузка будет создавать дубли вместо обновления цен.
Лечится это на стороне источника, до переноса. Проставьте артикулы в кабинете площадки или в своей таблице: подойдёт любая устойчивая строка, лишь бы она не менялась от загрузки к загрузке и была уникальной. Штрихкод, внутренний код поставщика, комбинация «поставщик-номер» - годится всё. Полчаса работы в таблице избавляют от вечной ручной сверки потом.
Второй частый случай, артикулы есть, но у разных поставщиков они совпадают. Тогда спасают группы: каждая загрузка работает только внутри своей, и одинаковый артикул в двух прайсах не склеивает разные товары. Пересечение при этом видно в разборе перед записью, карточка помечается как чужая и не трогается.
Зачем свой сайт, если карточки уже продаются
Резонный вопрос: площадка даёт трафик, зачем ещё один канал. Разница в том, кому достаётся результат поисковой работы. Карточка на маркетплейсе ранжируется как страница маркетплейса: описание, отзывы и фотографии работают на его домен, а не на ваш. Уйдёте с площадки или попадёте под смену правил, накопленная выдача останется там.
Свой сайт копит эту выдачу вам, но только если он сделан под поиск: страницы отдаются сервером готовыми, у каждого товара есть разметка с ценой и наличием, карта сайта обновляется вместе с ценами. Тогда товар попадает в выдачу с ценой прямо в сниппете, а не ссылкой без подробностей. Для каталога это не косметика: разметка страницы каталога у нас укладывается примерно в 30 КБ, и поисковику не нужно исполнять скрипты, чтобы её прочитать.
Плюс площадка перестаёт быть единственным домом. Заказ с сайта не облагается комиссией, покупатель приходит напрямую, а телефон и имя остаются у вас, а не в чужом кабинете.
Шаг 5. Проверить витрину
- откройте каталог и посмотрите, все ли товары на месте;
- зайдите в карточку, фотографии, описание, цена, наличие;
- положите товар в корзину и оформите тестовый заказ;
- проверьте остатки: ноль означает «нет в наличии» и товар не купят;
- посмотрите цены, если магазин торгует не в той валюте, в которой пришёл прайс.
Последний пункт стоит расшифровать. Прайс поставщика может приходить в одной валюте, а магазин продавать в другой, тогда нужен коэффициент, в который закладывают и курс, и наценку. Курс никакая программа за вас не угадает: его берут в банке и вписывают руками, а дальше цена витрины считается от цены источника. Если этого не сделать, на витрину встанут рублёвые числа со знаком другой валюты, ошибка тихая и дорогая.
Что дальше
Перенос, разовая операция, а магазин живёт дальше. Поставщик присылает новый прайс, и каталог обновляется той же кнопкой: цены и остатки подтягиваются, а названия, описания и фотографии, которые вы правили руками, остаются вашими. Товары, исчезнувшие из выгрузки, не удаляются, им обнуляется остаток, потому что удалённый товар уносит с собой проиндексированный адрес страницы.
Посмотреть, как это выглядит на настоящем каталоге, можно в демо-магазине: там живой импортированный каталог, а не подготовленные картинки. Сколько стоит такой магазин с обслуживанием, на главной. Если предпочитаете держать всё у себя, программа открытая и ставится на собственный сервер: исходный код на GitHub.
Дальше по теме: как перенести товары с Wildberries на свой сайт и как синхронизировать остатки с Ozon без 1С.
Свой магазин рядом с WB и Ozon: 3 месяца бесплатно
FastoShop переносит товары селлера в его интернет-магазин, который находят Яндекс, Google и нейросети.