SEO интернет-магазина: каталог, фильтры и карточки

Микроразметка Product

Product+Offer на карточке магазина: какие поля обязательны, чем тип отличается от листинга и почему JSON должен совпасть с витриной.

Кирилл Бабийчук · обновлено · 5 мин чтения

Микроразметка Product — это машиночитаемый оффер на URL карточки: имя, цена, валюта и наличие, которые совпадают с тем, что видит человек. Это не словарь типов и не обещание звёзд в выдаче. Хаб — SEO интернет-магазина. Как пишется сам документ покупки — SEO карточек товаров. Формат JSON-LD и политики соответствия — structured data. Каталог типов — Schema.org. Как Google рисует расширение — rich snippets.

Плагин, который вешает Product на категорию, статью «как выбрать» и главную, даёт кабинету ошибки, а Поиску — одну «цену от» на чужой интент. Разметка не заменяет видимое предложение и не чинит пустую карточку.

Какой тип на какой URL

URL Честный тип Частая подмена
Карточка одного SKU / одной вариации с кнопкой купить Product + Offer Article «про товар» без оффера
Одна модель, несколько офферов на том же адресе Product + AggregateOffer (lowPrice) или группа вариаций Один Offer с чужой «ценой от»
Семья вариаций со своими адресами ProductGroup + hasVariant — см. вариации товаров Девять независимых Product без связи
Листинг категории или фильтра У Яндекса OfferCatalog с вложенными Offer Один Product на всю сетку
Гид «как выбрать кроссовки» Статья, не товар Product «чтобы были звёзды»

Google делит два слота. Product snippet принимает Offer или AggregateOffer. Merchant listing требует именно Offer: продавец должен быть тем, кто продаёт, и цена в разметке — больше нуля. Кабинет фида — соседний H1, сюда его не тащим: но справка Merchant Center уже сейчас требует, чтобы наличие в фиде совпало с посадочной, чекаутом и structured data.

Минимум полей, без которого слой врать не должен

Яндекс.Вебмастер: чтобы робот распознал товар, страницу размечают Product плюс Offer или AggregateOffer. У оффера обязательны availability, price или lowPrice, priceCurrency. Для рублей в справке указан код ISO 4217: RUB. Если в Offer стоит «нет в наличии», цену в сниппете Картинок не показывают. Разметку робот может пропустить, если схема битая; на факт индексации URL это само по себе не влияет. Срок «до двух недель» на сбор специального сниппета — из той же товарной справки, не SLA.

Search Central для оффера: текущая цена и валюта ISO 4217. Если одновременно заданы offers.price и priceSpecification, Google берёт offers.price. Наличие — одно значение из списка (InStock, OutOfStock, PreOrder, BackOrder и остальные из справки), не два статуса сразу. Для merchant listing цена ноль не подходит — в отличие от product snippet, где нулевая цена допустима как «без оплаты».

  1. Сначала цена, название и наличие в HTML. Нет факта на экране — нечему соответствовать. Политика structured data прямо запрещает прятать оффер только в JSON-LD.
  2. Один канонический товар на URL. Два плагина с разными ценами — дыра, не «полнота».
  3. Валюта и число как в витрине. Для РФ в оффере RUB; в фиде для стран вне US/CA справка Merchant просит включать НДС в цену. Не выдумываем «правильный» процент налога — сверяем с тем, что видит покупатель.
  4. Идентификатор вариации: свой sku / GTIN на тот оффер, который в корзине. Родитель без цены — не Product с кнопкой.
  5. Отзывы — только если корпус видимый и про этот SKU. Разбор — отзывы на карточках, не поле «для звёзд».

Где слой расходится с витриной

  • Цена в JSON вчерашняя, на экране — акция. Поиск показывает чужую цифру; Яндекс прямо называет недостоверную микроразметку поводом снять структурированные сниппеты.
  • Наличие InStock при кнопке «нет в наличии». Состояние документа — на товарах без наличия: при нулевом остатке цена на посадочной всё равно должна быть видна, если вы отдаёте товар как оффер.
  • Product на ЧПУ фильтра. Робот получает одну модель на сетку SKU.
  • Микроразметка на URL, который закрыт noindex или каноникалом на категорию. Слот уезжает не туда или не собирается.

Product schema читает оффер, который уже правда на странице. Скрытая цена «для сниппета» — спам слоя, не товарная оптимизация.

Проверка: Rich Results Test и инспектор URL на проде, валидатор Вебмастера для Яндекса. Смотрите не «зелёную галочку словаря», а совпали ли имя, цена, валюта и наличие с первым экраном. Товарный документ в выдаче Яндекса — товарные страницы. Если карточки живые, а заявку забирает чужая витрина, это постановка SEO-продвижения. Рамка метода — SEO.

Ограничение. Валидный Product не обещает rich result и не обещает плитку Товаров. Процент «карточек РФ со сниппетом» сюда не переносим. Кабинет Merchant Center и Яндекс Товары — отдельные URL: фид может обогатить сниппет, но не заменяет слой на странице и не чинит враньё HTML.

Частые вопросы

Нужна ли микроразметка, если цена уже написана в тексте?

Страница индексируется и без неё. Слой нужен, чтобы стабильно отдать цену, валюту и наличие в товарный сниппет и в Картинки. Скрыть в JSON другую цифру нельзя: оба поиска требуют совпадения с сайтом.

Можно ли разметить категорию как Product с «ценой от»?

Не как одну карточку модели. У Яндекса список — OfferCatalog. В Google merchant listing «цена от» на листинге не делает вас оффером конкретного SKU.

Offer или AggregateOffer — что ставить на карточку с размерами?

Если адрес один и в корзину кладут разные размеры с вилкой цены — AggregateOffer с lowPrice или группа вариаций. Если у комбинации свой URL и своя цена — отдельный Offer на этом адресе. Merchant listing просит именно Offer, не агрегат.

Почему валидатор зелёный, а цены в сниппете нет?

Допуск ≠ показ. Проверьте видимую цену, валюту, один статус наличия, каноникал и срок сбора. Нет в наличии — Яндекс в Картинках цену не рисует. Расхождение с фидом лечится источником, не вторым скриптом.