Вариация товара — это продаваемая комбинация одной модели (цвет, размер, память, комплектация), а не ещё один абзац на карточке и не галочка фильтра каталога. Хаб — SEO интернет-магазина. Как собирается живой SKU-документ — SEO карточек товаров. Срез витрины «красные 42» без своего артикула — уже фильтры, не вариация.
Решение одно: сколько URL Поиск должен считать отдельными документами. Один канон с переключателем — если человек ищет модель, а цвет и размер выбирает на странице. Свой URL — если комбинацию ищут как товар: «iPhone 16 256 белый», «кроссовки Pegasus зелёные». Третьего «родительского» документа без цены и наличия магазину обычно не нужно: и справка Merchant Center, и schema.org ProductGroup прямо говорят, что группа — не оффер.
Один документ или много
Google Search Central описывает два рабочих контура. Одна страница: все варианты выбираются без перезагрузки, чаще через query; у группы свой URL, у каждого оффера — свой адрес с уже выбранной комбинацией. Несколько страниц: у каждой вариации отдельный документ. Это не «ещё один способ уникализировать title». Это выбор, какой адрес человек получит из поиска и какой адрес уйдёт в фид.
| Ситуация | Сколько URL | Почему |
|---|---|---|
| Размеры 40–46 одной пары, цена и фото одни, спроса на «размер 43» как на модель нет | Один канон, переключатель | Иначе индекс получает тонкие дубли и отбирает обход у денежной карточки |
| Цвет ищут как отдельный товар, своё фото, иногда своя цена | Свой URL на цвет | Иначе сниппет и фид показывают чужой цвет, а клик ведёт на «дефолт» |
| Память / диагональ / процессор меняют модель в языке запроса | Свой URL на комплектацию | Это уже разные товары в выдаче, не свитч на одной карточке |
| CMS-родитель «модель» без цены, наличия и кнопки купить | Не индексировать | Merchant Center: не выгружать parent SKU отдельным товаром; schema.org: ProductGroup сам по себе не продаётся |
Яндекс на товарном URL формулирует ту же развилку иначе. Вариации — отдельные предложения, только если у них свой адрес, своя цена и своё наличие. Иначе на карточке честный AggregateOffer с lowPrice: в Картинках цена тогда читается как «от N ₽». Разбор самого товарного документа — товарные страницы в Яндексе, не этот H1.
Три контура, которые обязаны совпасть
Вариация ломается не на «уникальном описании», а когда HTML, фид и разметка рассказывают разные семьи.
- Витрина. Человек видит, какую комбинацию кладёт в корзину. Переключатель, который не меняет адрес, должен честно менять цену, фото и наличие на том же URL. Отдельный URL обязан открываться уже с этой комбинацией, а не с «базовым» цветом.
- Фид. Справка Merchant Center: вариации — похожие товары, которые отличаются цветом и размером (одежда) или памятью, диагональю, процессором и графикой (электроника). Каждая вариация — отдельный товар со своим
id. Одинаковыйitem_group_idсклеивает семью. Родительский артикул, если нужен, ставят вitem_group_id, а не выгружают третьей карточкой. Для бесплатных товарных объявлений поле группы обязательно у всех вариаций. Кабинет фида — соседний H1, сюда его чек-лист не тащим. - Разметка. Search Central: группа помечается
ProductGroupсproductGroupID,variesByиhasVariant(или обратной связьюisVariantOf). У каждой вариации свойsku. На одной странице со свитчем разметка не обязана переписываться при каждом клике: в официальном примере она описывает группу и офферы сразу. Поля schema — соседний URL кластера, не повод клеить скрытый JSON с чужой ценой.
Если в HTML один канон, а в фиде девять независимых id без item_group_id, Google показывает девять карточек одной футболки. Если в фиде семья склеена, а на сайте у каждого размера свой индексируемый title «купить кроссовки», Поиск получает девять тонких документов и один вранный сниппет.
Что вариацией не является
- Комбинация фильтра «бренд + цвет + наличие» на листинге. Это витрина категории, её индекс разбирают фильтры и фасеты.
- Новое поколение или другая линейка с своим артикулом производителя. Это соседняя модель, не
item_group_id. - Нулевой остаток одного размера на общем каноне. Кончился 42-й — не плодите отдельный noindex-URL; состояние документа — на товарах без наличия.
- Персонализация и гравировка. Merchant Center держит для них отдельные поля (
is_bundle, описание «customized»), это не размерный ряд.
Вариация — семья офферов одной модели. Фильтр — срез витрины. Новая модель — другой товар. Если путаете три, индекс либо дублирует карточку, либо прячет единственный живой SKU.
Где CMS плодит мусор
WooCommerce variable product часто отдаёт ?attribute_pa_color= как отдельный 200. Если каноникал не схлопнут на модель, робот обходит все комбинации атрибутов. OpenCart опции с ЧПУ без спроса делают то же. Битрикс по свойствам инфоблока умеет построить URL на каждую пару «цвет+размер», хотя на витрине это один переключатель.
Проверка короткая. Откройте модель в инкогнито и переключите цвет: меняется ли адрес, title, цена, наличие и главное фото. Сверьте этот адрес с id и link в фиде и с offers.url в JSON-LD. Потом снимите выдачу по модели и по «модель + цвет». Если в топе дефолтный цвет, а запрос называл другой — у комбинации нет своего документа, либо каноникал его съел.
Подрядчик, который «открыл все вариации для охвата», продаёт комбинаторику атрибутов. Постановка контура магазина, если каталог системно врёт семьёй, — SEO-продвижение, не массовый index на каждый размер. Рамка метода — SEO.
Ограничение. Универсального правила «цвет всегда отдельно, размер никогда» нет: смотрите язык запроса и то, что реально кладут в корзину. Процент «правильных» вариаций в чужом каталоге сюда не переносим. Кабинет Merchant Center и Яндекс Товары — отдельные URL, их не подменяем чек-листом группы.
Частые вопросы
Нужен ли отдельный URL на каждый размер одежды?
Нет, если размер не ищут как товар и цена с фото не меняются. Держите переключатель на одном каноне. Отдельный адрес нужен, когда комбинацию спрашивают сами и у неё свой оффер.
Можно ли выгрузить в фид только родительский артикул?
Нет. Merchant Center просит уникальный id на каждую вариацию и общий item_group_id. Родителя отдельным товаром не отдают: его значение как раз и ставят в группу.
Если переключатель не меняет адрес, как отдать цену в поиск?
На одном URL честно покажите текущий оффер и, если офферов несколько, вилку цены. В Яндексе это AggregateOffer с lowPrice. В разметке Google — ProductGroup с вложенными hasVariant, у каждого свой offers.url, даже если путь отличается только query.
Чем вариация отличается от фильтра «красный» на категории?
Вариация принадлежит одному артикулу и корзине. Фильтр собирает много SKU на листинге. Индексировать срез «красные кроссовки» — решение витрины, не семьи одной модели.