При завантаженні товарів на Ozon, Wildberries, Avito кожен маркетплейс диктує свій формат і структуру. Помилка в заголовку або кодуванні — і фід відхилено. Ми розробляємо універсальні генератори, які автоматично підлаштовуються під вимоги майданчика. Наш досвід — понад 50 успішних проєктів для інтернет-магазинів з каталогами від 500 до 500 000 товарів. Автоматизація економить до 70% часу на ручну підготовку — замість 4 годин на день ви витрачаєте 10 хвилин на контроль.
Важливо розуміти: фіди — це не просто експорт даних. Це узгоджена робота з API маркетплейсів, врахування лімітів (до 1000 товарів за запит, обмеження на частоту) та коректна обробка зображень. Неправильний фід може призвести до деактивації карток або штрафів від майданчика. Наприклад, на Ozon максимальний розмір файлу — 128 МБ, перевищення викличе помилку. На Wildberries — до 100 000 товарів на один фід.
Ми будуємо систему на перевірених підходах: стратегія патернів, асинхронна генерація через черги та автоматична валідація. Кожен фід проходить тест на тестовому оточенні перед відправкою на прод. Це гарантує, що помилки виявляться до того, як потраплять на маркетплейс.
Типові формати по маркетплейсах
| Маркетплейс | Формат | Спосіб передачі |
|---|---|---|
| Ozon | Excel / CSV / API | Seller API v3 |
| Wildberries | Excel / API | Supplier API |
| Avito | XML (avito-формат) | URL фіду |
| AliExpress | CSV | Seller Center |
| Amazon | CSV (Flat File) | Seller Central / MWS |
| Rozetka | YML / XML | URL фіду |
| Lamoda | CSV | SFTP |
| Leroy Merlin | XML | SFTP / API |
Як налаштувати універсальний генератор фідів?
Архітектура будується на патерні Strategy: ядро генератора одне, адаптери під кожен маркетплейс — окремі класи. Це дозволяє легко додавати нові майданчики без зміни основного коду.
interface MarketplaceFeedAdapter { public function getHeaders(): array; public function transform(Product $product): array; public function getFormat(): string; // 'csv' | 'xml' | 'xlsx' public function getDelimiter(): string; } class OzonFeedAdapter implements MarketplaceFeedAdapter { public function getHeaders(): array { return [ 'Артикул', 'Назва товару', 'Опис', 'Ціна', 'Стара ціна', 'ПДВ', 'Кількість', 'Вага, г', 'Ширина, мм', 'Висота, мм', 'Глибина, мм', 'Зображення', 'Категорія', 'Бренд', 'Штрихкод', ]; } public function transform(Product $product): array { return [ $product->sku, $product->name, strip_tags($product->description), $product->price, $product->compare_price ?? '', '20', // ПДВ 20% $product->stock, $product->weight_grams ?? '', $product->width_mm ?? '', $product->height_mm ?? '', $product->depth_mm ?? '', $product->images->pluck('cdn_url')->implode('; '), $product->category?->ozon_category ?? '', $product->brand?->name ?? '', $product->barcode ?? '', ]; } public function getFormat(): string { return 'csv'; } public function getDelimiter(): string { return ';'; } } class AvitoCatalogAdapter implements MarketplaceFeedAdapter { // Avito вимагає XML зі специфічною структурою public function getFormat(): string { return 'xml'; } public function getDelimiter(): string { return ''; } // ... } class UniversalFeedGenerator { public function generate(MarketplaceFeedAdapter $adapter, string $outputPath): void { if ($adapter->getFormat() === 'csv') { $this->generateCsv($adapter, $outputPath); } elseif ($adapter->getFormat() === 'xml') { $this->generateXml($adapter, $outputPath); } } private function generateCsv(MarketplaceFeedAdapter $adapter, string $path): void { $fp = fopen($path, 'w'); // UTF-8 BOM для коректного відкриття в Excel fwrite($fp, "\xEF\xBB\xBF"); fputcsv($fp, $adapter->getHeaders(), $adapter->getDelimiter()); Product::with(['images', 'brand', 'category']) ->where('is_active', true) ->chunk(500, function ($products) use ($fp, $adapter) { foreach ($products as $product) { fputcsv($fp, $adapter->transform($product), $adapter->getDelimiter()); } }); fclose($fp); } } Avito XML-фід
Avito вимагає специфічний XML-формат з елементами <Ad>:
<?xml version="1.0" encoding="UTF-8"?> <Ads formatVersion="3" target="Avito.ru"> <Ad> <Id>SKU-12345</Id> <AllowEmail>No</AllowEmail> <Title>Кросівки Nike Air Max 270</Title> <Description>Опис товару...</Description> <Category>Одяг, взуття, аксесуари</Category> <GoodsType>Кросівки</GoodsType> <Condition>Нове</Condition> <Price>4990</Price> <Images> <Image url="https://cdn.example.com/product1.jpg"/> <Image url="https://cdn.example.com/product2.jpg"/> </Images> <ContactPhone>+79001234567</ContactPhone> </Ad> </Ads> Чому важлива валідація фідів перед відправкою?
Без валідації ви ризикуєте відправити на маркетплейс биті дані — пусті артикули, від'ємні ціни або некоректні URL зображень. Це призводить до відхилення всього фіду та втрати часу. Наш валідатор перевіряє кожен рядок перед записом:
class FeedValidator { public function validate(array $row, MarketplaceFeedAdapter $adapter): array { $errors = []; if (empty($row[0])) { $errors[] = 'Пустий артикул'; } if (empty($row[1]) || mb_strlen($row[1]) > 255) { $errors[] = 'Некоректна назва'; } if (!is_numeric($row[3]) || $row[3] <= 0) { $errors[] = 'Некоректна ціна'; } return $errors; } } Додатково перевіряємо кількість товарів (не повинно бути 0), відповідність категорій та наявність обов'язкових полів для конкретного маркетплейсу. Згідно з Ozon Seller API v3 documentation, обов'язкові поля: артикул, ціна, залишок.
Як доставити фід на маркетплейс?
| Спосіб | Опис | Швидкість |
|---|---|---|
| Пряме посилання | Файл лежить у storage/public/feeds/, доступний за URL |
Миттєво |
| SFTP | Відправка на віддалений сервер маркетплейсу | До 1 хвилини |
| API | Пряме завантаження через REST API майданчика | 5-30 секунд |
| Сповіщення з посиланням або вкладенням | 1-2 хвилини |
Ми налаштовуємо розклад через Laravel Scheduler та відправляємо сповіщення про помилки в Telegram або на пошту.
Процес роботи
- Аналіз вашого каталогу та вимог маркетплейсів.
- Проєктування структури фіду та вибір адаптерів.
- Розробка генератора з урахуванням N+1 запитів та оптимізації пам'яті (chunk-обробка).
- Тестування на тестовому оточенні та валідація всіх полів.
- Деплой на прод та налаштування розкладу.
- Передача документації та навчання вашої команди.
Терміни та вартість
Базовий генератор з одним адаптером — від 1 до 2 робочих днів. Кожен додатковий маркетплейс — від 0,5 до 1 дня. Вартість розраховується індивідуально і залежить від складності каталогу та кількості форматів. Зверніться до нас для точної оцінки.
Що входить у розробку
- Універсальний генератор з одним або кількома адаптерами.
- Налаштування розкладу та способів доставки.
- Валідація даних перед вивантаженням.
- Інтеграція з вашою CMS або ERP.
- Документація та консультація.
- Гарантія коректної роботи протягом місяця після здачі.
Типові помилки при створенні фідів
- Невідповідність кодування — Excel вимагає UTF-8 BOM, інакше кирилиця відображається кракозябрами.
- Відсутність обов'язкових полів — у кожного маркетплейсу свій набір required-полів.
- Перевищення лімітів — довжина назви, кількість зображень, загальний розмір файлу.
- Некоректні посилання на зображення — URLs мають бути доступні ззовні.
- Застарілі ціни — фіди потрібно оновлювати за розкладом, інакше товари відхиляють.
Наші інженери з 5-річним досвідом в e-commerce гарантують, що фід пройде модерацію з першого разу. Отримайте консультацію по вашому проєкту вже сьогодні. Зв'яжіться з нами, щоб обговорити деталі.







