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







