Фид для Яндекс Директа 2026: обязательные элементы, categoryId и ошибки валидации
Товарные кампании вытягивает качество фида, а не настройка кампании. Разбираю по официальной справке обязательные элементы оффера, роль categoryId, два уровня сегментации и ошибки, из-за которых офферы молча выпадают.

Товарные кампании и смарт-баннеры вытягивает не настройка кампании, а качество файла, который в неё подаётся. Половина проблем «показов мало» и «товары не откручиваются» решается не в интерфейсе Директа, а в XML.
Ниже — обязательные элементы по официальной справке, роль categoryId, принципы сегментации и разбор ошибок, из-за которых офферы молча игнорируются.
Фид — это не выгрузка товаров. Это описание витрины, которую увидит человек. Всё, чего в нём нет, не покажется, а всё, что в нём неверно, покажется неверно.
1. Структура файла
Формат YML, в основе XML. Корневой элемент — yml_catalog, у него обязателен атрибут date в формате ГГГГ-ММ-ДД чч:мм, и он должен соответствовать реальному времени генерации файла на вашей стороне.
Внутри — элемент shop, в нём currencies и categories, и только после них список offers. Порядок здесь не косметический: если категории объявлены после офферов, часть товаров останется без категории.
Ограничения файла из требований Директа: один каталог на файл, длина URL до 2048 символов, стандартная для XML кодировка.
2. Обязательные элементы оффера
| Элемент | Когда обязателен | Что будет без него |
|---|---|---|
categoryId | Всегда | Оффер вне сегментации, кампанию не настроить |
url | Всегда | Некуда вести, оффер не работает |
name | Упрощённый тип оффера | Оффер игнорируется |
vendor и model | Тип vendor.model | Оффер игнорируется, объявление не формируется |
currencyId | Если указан price | Цена без валюты — ошибка |
атрибут available | Если фильтруете по наличию | Фильтр по наличию не соберётся |
Ключевое слово в правой колонке — «игнорируется». Оффер без обязательного элемента не даёт ошибку валидации всего файла, он просто выпадает молча. Поэтому расхождение между числом товаров в каталоге и числом офферов в кампании нужно проверять руками: само оно о себе не сообщит.
3. categoryId: на нём держится всё управление
Технически это положительное целое число длиной до 18 символов, и каждый оффер принадлежит ровно одной категории. Практически — это единственный рычаг, которым вы управляете товарной кампанией.
Через categoryId товары разводятся по кампаниям, а по кампаниям расставляются разные цели по ДРР. Без этого весь каталог живёт одной кучей: товар с маржой 8% и товар с маржой 45% откручиваются с одной целью, и первый съедает бюджет второго.
Отсюда правило: структура категорий в фиде строится не по логике сайта, а по логике экономики. Если на сайте «Аксессуары» — одна категория, а внутри неё товары с двукратной разницей в марже, в фиде это должны быть две категории.
4. Сегментация: два уровня
| Уровень | По чему делим | Зачем |
|---|---|---|
| Первый | categoryId | Разная маржа — разные цели по ДРР |
| Второй | Цена товара | Дешёвые и дорогие позиции ведут себя по-разному |
| Третий, по желанию | Наличие и оборачиваемость | Не тратить бюджет на то, что вот-вот кончится |
Второй уровень часто пропускают, а зря. В одной кампании товар за 1 500 ₽ и товар за 40 000 ₽ усредняются: система оптимизирует под общую конверсию, и дешёвый товар с высокой конверсией перетягивает на себя показы, а дорогой, который и приносит деньги, недополучает трафик.
5. Ошибки, из-за которых фид не работает
Плавающий идентификатор товара. Идентификаторы должны быть уникальными и одинаковыми в разных фидах. Если при каждой выгрузке id пересобирается заново, система видит новый товар и заново набирает по нему статистику — обучение не накапливается никогда.
Расхождение с посадочной. Цена в фиде 3 900 ₽, на сайте 4 200 ₽. Валидатор это пропустит, модерация — нет. Проверяется только руками, по десятку случайных товаров после каждой крупной правки каталога.
Нулевая цена и неправильный oldprice. Цена, равная нулю, и старая цена, которая не превышает текущую, — типовые причины отклонения оффера.
Константа в дате генерации. Атрибут date, который не меняется от выгрузки к выгрузке, — признак того, что фид собирается неправильно, и повод для проблем с актуальностью данных.
Категории после офферов. Формально файл валиден, фактически часть товаров теряет категорию, а вместе с ней и попадание в нужную кампанию.
6. Товарная кампания и смарт-баннеры: не одно и то же
Вопрос всплывает постоянно, поэтому коротко. Товарная кампания — отдельный тип кампании, который сам собирает объявления из фида и показывает их и в поиске, и в сетях. Смарт-баннеры — динамический формат внутри сетей.
Общее у них одно: оба питаются фидом. И для обоих качество файла важнее настроек кампании — в интерфейсе нельзя починить то, чего нет в XML. Как настраиваются сами кампании — в разборе товарных кампаний и смарт-баннеров, эта статья про сам файл.
7. Чек-лист перед запуском
| Проверка | Как проверить |
|---|---|
| Дата генерации реальная | Сравнить атрибут date с временем последней выгрузки |
| Категории объявлены до офферов | Открыть XML, посмотреть порядок блоков |
| Число офферов совпадает с каталогом | Сверить количество в фиде и в CMS |
| Идентификаторы стабильны | Сравнить две последовательные выгрузки |
| Цены совпадают с сайтом | Проверить 10 случайных товаров вручную |
| Нет нулевых цен | Отфильтровать price = 0 |
| Категории отражают маржу | Свериться с юнит-экономикой, а не со структурой сайта |
8. Итог
Обязательный минимум в каждом оффере: categoryId и url всегда, name для упрощённого типа, vendor и model для vendor.model, currencyId при наличии цены. Категории объявляются до офферов, идентификаторы стабильны, дата генерации настоящая.
Дальше начинается управление: categoryId строится по экономике, а не по структуре сайта, и внутри категорий добавляется деление по цене. Именно на этом уровне товарная кампания перестаёт быть чёрным ящиком.
Связанные материалы: товарные кампании и смарт-баннеры, гайд по Яндекс Директу, что происходит с CPC, калькулятор ROAS.
Если фид собран, а товары не откручиваются — присылайте ссылку на файл в Telegram, посмотрю, что там молча выпадает.