Кабінет продавця пише «завантажено 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 описує стан файлів, а не результат імпорту: фіди міряні ззовні, і в кабінети цих магазинів ми їх не завантажували.

