E-commerce

Rozetka-фид: почему отклоняют товары, если валидатор говорит «ОК»

Кабинет продавца пишет «загружено N из M», а валидатор ставит сто баллов — и непонятно, что не так. Прогон 21 чужого фида на 88 991 товар 05.09.2026: структура цела почти всегда, а без нарушений обязательных элементов Rozetka оказался один фид с 28 товарами.

5 сентября 2026 г.
8 мин чтения

Кабинет продавца пишет «загружено N товаров из M поданных» и на этом останавливается. Какие именно позиции не прошли, за что и что с ними теперь делать — не сказано. Владелец берёт онлайн-валидатор, тот считает структуру файла и ставит сто баллов. Дальше вопрос уходит к разработчику, разработчик открывает фид в браузере, видит нормальный XML и отвечает, что со стороны сайта всё отдаётся правильно. Оба правы, и именно поэтому дело не движется.

Пятого сентября 2026 мы собрали 28 публичных адресов YML-фидов чужих магазинов и прогнали их через ядро нашего валидатора с пресетом Rozetka, а поверх — дополнительные проверки по официальной справке площадки «Требования к XML-файлу», снятой в тот же день. Разобрался 21 фид, в них 88 991 товар. Девять из них сделаны именно для Rozetka — это видно по адресу, — и в этих девяти 30 279 позиций. Семь адресов не разобрались: четыре мёртвые или закрытые, один упёрся в лимит запросов, два имеют сломанную структуру, о них ниже.

Главный результат прогона такой. Базовая структура — идентификатор, цена, валюта, категория — цела в 16 фидах из 21. Это ровно то, что проверяет большинство онлайн-валидаторов, и ровно то, за что они ставят сто баллов. А без единого нарушения обязательных элементов Rozetka оказалось два фида, причём один из них всё равно отпадает целиком из-за отсутствия currencyId. Реально чистым остаётся один. В нём 28 товаров.

Что Rozetka считает обязательным

Справка площадки перечисляет обязательные элементы прямо: yml_catalog, shop, currencies, categories, offers, offer с id и available, stock_quantity или quantity_in_stock, price, currencyId, categoryId, picture, vendor, name или model, description, param. О характеристиках сказано отдельно: «название и значение обязательно должны быть заполнены». Об остатках: «позиции без этого тега будут иметь статус „нет в наличии“». Об идентификаторе: «допускается использование символов: Aa-Zz и 0-9, не допускается использование кириллицы и пробелов».

Половина этого списка — не структура, а содержание. Валидатор структуры увидит отсутствующий param только тогда, когда его специально научили, что для Rozetka этот тег обязателен. Вот как часто содержания не хватало в прогоне 05.09.2026.

Чего не хватает Фидов из 21 Товаров из 88 991 Из 9 фидов для Rozetka
характеристики (param) 15 (71 %) 16 040 (18,0 %) 7
бренд (vendor) 12 (57 %) 11 128 (12,5 %) 5
описание (description) 9 (43 %) 5 698 (6,4 %) 3
остатки (stock_quantity) 6 (29 %) 38 069 (42,8 %) 1
картинки (picture) 5 (24 %) 1 794 (2,0 %) 3

Порядок в двух правых колонках разный, и это самое интересное в таблице. Характеристики выпадают чаще всего по фидам, остатки — больнее всего по товарам: шесть файлов, но почти 43 % всей выборки. Причина в том, что остатков не бывает «немного»: либо тег стоит во всех позициях, либо ни в одной. В оптовом прайсе посуды и товаров для дома на 19 907 позиций тега остатков нет нигде. Магазин привык к атрибуту available="true" и считает вопрос наличия закрытым, а Rozetka держит позицию в продаже только пока число остатка больше нуля.

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

Мелочи, которые таковыми не являются

Описание короче 50 символов — 13 фидов из 21 (62 %), 1 726 товаров. В фиде сувенирной продукции это 500 позиций из 551. Формально описание заполнено, требование справки соблюдено, а карточка при этом пустая.

Дубли названий — 11 фидов (52 %), 903 товара. Справка формулирует требование так: «не должно быть больше одной позиции с абсолютно одинаковым названием». На практике это один и тот же товар в разных цветах или размерах, у которого отличие не вынесено в название. В фиде автотоваров таких 529 позиций, то есть 13 % файла, в фиде косметики оптом — 101 позиция, 15 %.

Идентификаторы с дефисом и двоеточием (277685-07, MO:39689-5546) стоят в трёх фидах, и это 23 926 товаров — 26,9 % выборки. Здесь нужна честность: формально такие символы вне разрешённого набора, а на практике дефис обычно проходит. Мы не видели отклонения именно из-за него и не утверждаем, что оно будет. Но перед выгрузкой большого каталога это тот пункт, который дешевле проверить отдельно, чем выяснять постфактум.

Картинки по http вместо https — один фид, зато целиком: 5 088 товаров. Больше пятнадцати картинок на позицию — три фида, 319 товаров; последствие здесь мягкое, площадка просто возьмёт первые пятнадцать.

Когда отпадает не товар, а весь файл

В четырёх фидах ошибка в одной строке снимает каталог полностью.

В фиде E, сделанном для Rozetka, во всех 6 108 позициях стоит currencyId со значением BRG, а блок currencies пуст. По справке площадка принимает только гривну, доллар и евро, так что в этом файле нет ни одной позиции с допустимой валютой — похоже, это ошибка настройки модуля, которую никто не заметил. В фиде N валюта объявлена как id="1.00000000" вместо кода, поэтому UAH в товарах не совпадает с объявленным: 1 103 позиции. В фиде O пусты все currencyId, а описание пустое у 978 товаров из 981. В фиде T на 31 товар currencyId нет вообще — это и есть тот второй «чистый» файл, который отпадает не по содержанию, а по валюте.

Ещё два файла не разобрались вовсе. Фид со спорттоварами на 11 410 позиций имеет корень shop без yml_catalog: формально это не YML, и разбор останавливается на первой строке. В фиде одежды и подарков на 2 661 позицию товары завёрнуты в item вместо offer, а картинки лежат в image — собственный формат, который ни один маркетплейс не читает как YML.

Откуда это берётся

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

Характеристики живут в атрибутах товара или просто в тексте описания, а в фид их надо класть отдельными param с заполненными названием и значением. Бренд во многих каталогах либо пуст, либо подменён артикулом. Остаток есть в учётной системе, но в тег stock_quantity его никто не мапил, потому что для другой площадки хватало атрибута available. Файл при этом валиден, парсится, весит свои десятки мегабайт — в прогоне 05.09.2026 три фида были больше 60 МБ, самый большой 89 МБ — и на вид вполне рабочий.

Дополнительное наблюдение о происхождении этих файлов. Шесть из одиннадцати фидов, найденных перебором типичных путей, отдаются одним и тем же модулем экспорта для OpenCart. То есть ошибка здесь не персональная: магазины выгружают каталог одним инструментом с одинаковыми настройками по умолчанию.

Что с этим делать

Первое — прогнать свой файл пресетом Rozetka в валидаторе YML-фида. С 05.09.2026 он проверяет именно эти элементы и возвращает конкретные offer id с названием проверки, а не общую оценку. Как читать результат и что из него передать разработчику, разобрано в семи причинах, по которым площадка не принимает фид — здесь не повторяемся.

Второе — смотреть на списки позиций, а не на баллы. Сто баллов означает, что файл структурно цел, и ничего больше: в нашем прогоне такую оценку получили 16 фидов из 21, среди них и тот, у которого нет ни одной характеристики ни в одном товаре.

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

Когда же выясняется, что поля надо менять на стороне магазина, а не в файле, начинается работа с каталогом и маппингом: как мы её делаем, описано на странице интеграции с Rozetka.

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

Чего этот прогон не доказывает

Магазины для него найдены через открытые адреса фидов: перебор типичных путей на 118 доменах дал 11 файлов (9 %), ещё 12 адресов нашёл поиск по открытому коду на GitHub, и пять из них уже мёртвые или закрытые. Такой способ смещает выборку — в ней больше OpenCart и дропшиппинг-складов, чем на рынке в целом.

Двенадцать фидов из 21 сделаны не для Rozetka, а для других площадок или как универсальный YML. Требования Rozetka мы применили к ним как к кандидатам: а если этот же файл отдать Rozetka. Ситуация не выдумана, именно так магазины и делают, когда выходят на вторую площадку. Но цифры по всей 21 и цифры по девяти профильным фидам отличаются, поэтому в таблице стоят обе колонки.

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

Теги

E-commerce

🤔Вам понравилась статья?

Ваше мнение помогает нам создавать лучший контент

Поделитесь с друзьями

Нашли что-нибудь полезное? 🚀

Помогите другим узнать это — поделитесь статьей в социальных сетях

https://lionex.com.ua/blog/rozetka-fid-chomu-vidhylyayut-tovary

💚 Спасибо, что помогаете нам расти

Владислав Чистяков

Пише про те, що робить руками: інтернет-магазини на OpenCart, застосунки на Next.js, інтеграції та швидкість сайтів. У статтях — заміри й перевірки, які читач може повторити на своєму проєкті, а не загальні поради. Комерційна розробка з 2015 року.

Частые вопросы

Ответы на популярные вопросы по теме

Потому что площадка смотрит не на этот атрибут, а на тег остатков. В справке сказано прямо: «позиции без этого тега будут иметь статус „нет в наличии“». Нужен `stock_quantity` или `quantity_in_stock` целым числом больше нуля. В прогоне 05.09.2026 тега остатков не было в 6 фидах из 21, и это 38 069 товаров — 42,8 % всей выборки на 88 991 позицию.

Сто баллов означает, что цела структура: идентификатор, цена, валюта, категория. Содержание позиции такие валидаторы не проверяют. В прогоне 05.09.2026 базовая структура была цела в 16 фидах из 21, а без нарушений обязательных элементов Rozetka оказался один фид с 28 товарами. Разница между этими двумя числами и есть ответ.

По справке Rozetka тег `param` обязателен, причём «название и значение обязательно должны быть заполнены». Характеристики в тексте описания это требование не закрывают — нужны отдельные теги. Это самая частая нехватка в выборке: ни одного `param` не было в 15 фидах из 21, а среди фидов, сделанных именно для Rozetka, — в 7 из 9.

Формально да: справка разрешает в `id` только символы Aa-Zz и 0-9. На практике дефис обычно проходит, и мы не видели отклонения именно из-за него. В прогоне 05.09.2026 идентификаторы с дефисом или двоеточием стояли в трёх фидах и охватывали 23 926 товаров — 26,9 % выборки. Перед выгрузкой большого каталога этот пункт стоит проверить отдельно, а не считать заранее безопасным.

Смотреть на валюту и корень файла. В прогоне 05.09.2026 один фид на 6 108 позиций имел во всех товарах `currencyId` со значением `BRG` при пустом блоке `currencies`, ещё один объявлял валюту как `id="1.00000000"` вместо кода. Отдельно встречается корень `shop` без `yml_catalog` и товары в тегах `item` вместо `offer` — такие файлы останавливают разбор на первой строке.

Получайте лучшие статьи на почту

Подпишитесь на нашу рассылку и получайте полезные советы, инсайты и новости о веб-разработке, маркетинге и бизнесе.

Мы уважаем вашу конфиденциальность. Отписаться можно в любой момент.