При загрузке товаров на 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); } } Авито 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 гарантируют, что фид пройдёт модерацию с первого раза. Получите консультацию по вашему проекту уже сегодня. Свяжитесь с нами, чтобы обсудить детали.







