# Микроразметка для интернет-магазина: Product, Offer, отзывы

Адрес материала: https://shopseo.ru/tehnika/mikrorazmetka/
Тема страницы: Разметка Schema.org для магазина: Product, Offer, AggregateRating, Review и BreadcrumbList в JSON-LD. Примеры кода, частые ошибки и проверка валидаторами.

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


Микроразметка сообщает поисковику и другим машинам, что на странице товар, сколько он стоит, есть ли он в наличии и как его оценили покупатели. Для магазина минимальный набор — `Product` с вложенным `Offer` на каждой карточке и `BreadcrumbList` на карточках и категориях. Пишите её в формате JSON-LD, генерируйте из тех же данных, что выводятся на странице, и проверяйте валидатором Яндекса и Rich Results Test от Google.

## Зачем это магазину, если гарантии нет

Разметка не повышает позиции напрямую и не обязывает поисковик показывать звёзды или цену в сниппете. Зато она убирает двусмысленность: робот не гадает, какое из чисел на странице — цена, а какое — старая цена или стоимость доставки. Это влияет на то, как выглядит сниппет в Google, как товар понимают при сопоставлении с фидом, и как страница используется в ответах нейросетей — подробнее об этом на странице про [нейросети и магазин](https://shopseo.ru/prodvizhenie/neyroseti/).

Формат JSON-LD удобнее микроданных в атрибутах вёрстки: блок живёт отдельно от HTML, его проще собрать шаблоном CMS и проще проверить. Оба поисковика его поддерживают.

## Карточка товара: базовый блок

Условный пример для магазина товаров для дома. Все значения подставляются из базы, а не прописываются руками.

```json
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Диван-кровать Осло, серая рогожка",
  "sku": "OSLO-GR-200",
  "gtin13": "4600000000000",
  "brand": { "@type": "Brand", "name": "Условная фабрика" },
  "image": [
    "https://shop.example/upload/oslo-1.webp",
    "https://shop.example/upload/oslo-2.webp"
  ],
  "description": "Раскладной диван с механизмом еврокнижка, спальное место 140×200 см.",
  "offers": {
    "@type": "Offer",
    "url": "https://shop.example/catalog/divany/oslo-seryy/",
    "price": "42990",
    "priceCurrency": "RUB",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition",
    "seller": { "@type": "Organization", "name": "Магазин товаров для дома" }
  }
}
</script>
```

Что здесь обязательно, а что желательно:

| Свойство | Зачем | Комментарий |
|---|---|---|
| `name`, `image` | Опознать товар | Название как в H1, фото — те же, что в галерее |
| `offers.price`, `priceCurrency` | Цена в сниппете и сопоставление с фидом | Число без пробелов и символа валюты |
| `offers.availability` | Статус наличия | `InStock`, `OutOfStock`, `PreOrder`, `BackOrder` |
| `sku`, `gtin13`, `mpn` | Связать с той же моделью у других продавцов | Штрихкод указывайте только настоящий |
| `brand` | Брендовые запросы, группировка | Название производителя, не магазина |

Если у товара есть варианты по цвету или размеру с разными ценами, их можно описать несколькими `Offer` внутри `offers` или диапазоном через `AggregateOffer` с `lowPrice` и `highPrice`. Выбор зависит от того, как устроены варианты в каталоге — на одной странице или на разных адресах; это разобрано на странице про [дубли товаров](https://shopseo.ru/tehnika/dubli-tovarov/).

## Наличие и цена: где ломается чаще всего

Поисковики сверяют разметку с тем, что видит человек. Расхождение — самая частая причина, по которой расширенный сниппет пропадает.

- Цена в разметке не обновилась после выгрузки, потому что JSON-LD закеширован отдельно от карточки.
- На странице показана цена со скидкой, а в разметке — старая.
- Товара нет, а в разметке по-прежнему `InStock`. Как оформлять такие карточки целиком, читайте на странице про [товары не в наличии](https://shopseo.ru/tehnika/net-v-nalichii/).
- Цена выводится скриптом после загрузки, а в исходном HTML её нет совсем.

Если на сайте есть цена «по запросу», не ставьте в `price` ноль. Лучше вообще не размечать `Offer`, чем размечать недостоверно.

## Рейтинг и отзывы

`AggregateRating` и `Review` вкладываются в тот же `Product`:

```json
"aggregateRating": {
  "@type": "AggregateRating",
  "ratingValue": "4.6",
  "reviewCount": "18"
},
"review": [{
  "@type": "Review",
  "author": { "@type": "Person", "name": "Ирина" },
  "datePublished": "2026-09-14",
  "reviewRating": { "@type": "Rating", "ratingValue": "5" },
  "reviewBody": "Раскладывается легко, ткань не скатывается после двух месяцев."
}]
```

Три правила, которые нельзя нарушать: отзывы видны на этой же странице, написаны покупателями (не скопированы с маркетплейса или сайта производителя), рейтинг считается по ним же. Разметка чужих или придуманных отзывов — прямое нарушение правил обоих поисковиков, за него можно лишиться расширенных сниппетов на всём сайте. Как собирать и модерировать отзывы, чтобы было что размечать, — на странице про [отзывы и вопросы покупателей](https://shopseo.ru/kontent/otzyvy-i-voprosy/).

## Хлебные крошки

`BreadcrumbList` повторяет видимую цепочку «Главная → Раздел → Категория» и помогает поисковику понять место страницы в каталоге. Цепочка должна совпадать с той, что видна на странице, и вести на канонические адреса категорий. Логика самого дерева и крошек описана на странице про [структуру каталога](https://shopseo.ru/tehnika/struktura-kataloga/).

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    { "@type": "ListItem", "position": 1, "name": "Мебель", "item": "https://shop.example/catalog/mebel/" },
    { "@type": "ListItem", "position": 2, "name": "Диваны", "item": "https://shop.example/catalog/mebel/divany/" },
    { "@type": "ListItem", "position": 3, "name": "Диван-кровать Осло" }
  ]
}
```

Последний элемент — текущая страница, ссылку на неё можно не указывать.

## А категориям нужна разметка?

Категории размечать `Product` не нужно: это список, а не товар. Хватит `BreadcrumbList`. Иногда добавляют `ItemList` со ссылками на карточки, но заметного эффекта в выдаче это обычно не даёт, а ошибки в нём появляются при каждом изменении сортировки. Для магазина важнее, чтобы на каждой карточке разметка была полной и точной. Сведения о самом магазине — `Organization` с названием, логотипом и контактами — разумно разместить один раз на главной или на странице контактов.

## Проверка: порядок действий

1. Возьмите три типовые страницы: карточку в наличии, карточку без наличия, категорию.
2. Прогоните каждую через валидатор микроразметки в Яндекс Вебмастере и через Rich Results Test. Валидатор Schema.org покажет синтаксические ошибки независимо от правил поисковиков.
3. Сравните цену и наличие в результате проверки с тем, что видно на странице прямо сейчас.
4. После внедрения следите за отчётами о расширенных результатах для товаров в Search Console: там видно, сколько страниц прошло проверку и какие поля отсутствуют.
5. После каждого обновления шаблона карточки повторяйте проверку — разметка ломается тихо.

## Проверить в своём магазине

- Есть ли JSON-LD `Product` с `Offer` на всех карточках, а не только на части шаблонов.
- Совпадают ли цена и статус наличия в разметке с видимыми на странице.
- Что в разметке у товаров «нет в наличии» и «цена по запросу».
- Размечены ли только собственные отзывы, видимые на странице.
- Совпадает ли `BreadcrumbList` с видимыми крошками и ведёт ли на канонические адреса.
- Нет ли ошибок в отчётах о товарах в Search Console и в валидаторе Яндекса.

## Вопросы владельцев магазинов

### Почему разметка без ошибок, а звёзд в выдаче всё равно нет?

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

### Можно ли скопировать разметку из модуля CMS и не трогать?

Можно взять готовый модуль как основу, но проверьте его на своих страницах. Типичные проблемы модулей — пустой бренд, цена без учёта скидки, вечный статус «в наличии» и рейтинг, который выводится даже без отзывов. Всё это лучше исправить до того, как поисковик проиндексирует тысячи карточек.

### Микроданные или JSON-LD — есть ли разница для Яндекса?

Яндекс понимает оба формата. JSON-LD удобнее в поддержке, потому что не переплетается с вёрсткой и не ломается при её правке. Главное — не дублировать одну и ту же сущность в двух форматах с разными значениями.

### Нужна ли разметка, если товары уже выгружаются в фид?

Да, это разные каналы. Фид передаёт данные в товарные сервисы поисковиков, а разметка описывает конкретную страницу при обычном обходе. Они должны совпадать по цене и наличию: расхождение между ними поисковик может воспринять как недостоверные данные.

