FastoShop

Как перенести товары с Ozon на свой сайт

У продавца с тысячей карточек на 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 и нейросети.