
Два одинаковых товара, одинаковая цена, одинаковая позиция в выдаче. Но у одного сниппета – звёздочки рейтинга, цена, статус «В наличии», а у другого – голый title и серый текст. Кликают на первый. Всегда.
Разница между ними – структурированные данные (machine-readable описание контента страницы по стандарту Schema.org). И если Вы разработчик, который отвечает за e-commerce проект, эта разница – Ваша прямая зона ответственности.
Я Пётр Гришечкин, эксперт в области SEO. Последние 15 лет я проектирую системы кратного роста трафика для крупнейших сайтов. И последнее время пишу всякие околоSEO статьи – https://t.me/seo_and_sem. В этом руководстве – конкретные шаги, рабочий код и грабли, на которые наступают почти все.
Что такое Schema.org и почему это критично для e-commerce

Schema.org – это словарь структурированных данных, поддерживаемый Google, Яндекс, Bing и Apple. Технически это набор типов и свойств, которые описывают сущности на странице: товар, цену, отзыв, организацию, хлебные крошки.
Поисковик получает не «текст про кроссовки», а чёткую структуру: название, бренд, цена 5 990 ₽, рейтинг 4.7, в наличии. Результат – rich snippet (расширенный сниппет) в выдаче.
Что это даёт интернет-магазину на практике:
Рост CTR. По данным Google, rich results получают на 20–30% больше кликов, чем обычные сниппеты. По опыту – для карточек товаров с рейтингом и ценой разница бывает и выше.
Больше визуальной площади в SERP. Звёздочки, цена, наличие, хлебные крошки – всё это вытесняет конкурентов ниже.
Понимание контента поисковиком. Особенно критично для Яндекса, который активно использует разметку товаров для Турбо-страниц и товарных карточек.
Готовность к AI-выдаче. Google SGE (Search Generative Experience) опирается на структурированные данные при формировании ответов.
Откройте топ-10 по любому коммерческому запросу в Google или Яндексе. У большинства лидеров – микроразметка Product, Review, BreadcrumbList. Это не опция, это стандарт.
Основные типы Schema.org для интернет-магазина
Перед тем как писать код, нужно понять, какие типы схем покрывают ключевые страницы магазина.
Product – карточка товара
Центральный тип. Описывает конкретный товар: название, изображение, бренд, SKU, описание. Внутри Product вложен Offer (предложение с ценой и наличием).
Offer и AggregateOffer
Offer – одно конкретное предложение (цена, валюта, наличие). AggregateOffer – диапазон предложений для товара с вариациями (размеры, цвета) или для страницы каталога с несколькими товарами.
Review и AggregateRating
Review – отдельный отзыв с автором и оценкой. AggregateRating – сводный рейтинг (средняя оценка, количество отзывов). Именно AggregateRating отвечает за звёздочки в сниппете.
BreadcrumbList – хлебные крошки
Разметка навигационной цепочки. Google и Яндекс отображают её вместо URL в сниппете. Визуально чище, понятнее для пользователя.
Organization – информация о компании
Размещается на главной или на странице «О компании». Логотип, название, контакты, ссылки на соцсети. Формирует Knowledge Panel (карточку организации) в Google.
WebSite с SearchAction – поиск по сайту
Позволяет Google показать строку поиска по Вашему магазину прямо в SERP. Работает не для всех сайтов, но если включится – даёт заметное преимущество.
JSON-LD примеры для ключевых страниц

Формат JSON-LD (JavaScript Object Notation for Linked Data) – рекомендуемый Google способ добавления структурированных данных. Он не смешивается с HTML-разметкой, легко генерируется на бэкенде и фронтенде, не влияет на рендер.
Карточка товара: Product + Offer + AggregateRating
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Product", "name": "Кроссовки Nike Air Max 90", "image": [ "https://example.com/photos/nike-air-max-90-1.jpg", "https://example.com/photos/nike-air-max-90-2.jpg" ], "description": "Мужские кроссовки Nike Air Max 90 с амортизацией Air.", "sku": "NAM90-BLK-42", "brand": { "@type": "Brand", "name": "Nike" }, "offers": { "@type": "Offer", "url": "https://example.com/nike-air-max-90", "priceCurrency": "RUB", "price": "8990", "availability": "https://schema.org/InStock", "seller": { "@type": "Organization", "name": "МойМагазин" } }, "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.7", "reviewCount": "132" } } </script>
Что здесь важно:
sku– уникальный идентификатор товара. Google использует его для сопоставления с Merchant Center.priceCurrency– обязательно ISO 4217 код валюты (RUB, USD, EUR). Без него разметка невалидна.availability– полный URL значения из Schema.org:InStock,OutOfStock,PreOrder. Не строка «в наличии», а именно URI.image– массив. Google рекомендует минимум одно изображение с соотношением сторон 16:9, 4:3 или 1:1.
Страница каталога: ItemList + Product
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "ItemList", "itemListElement": [ { "@type": "ListItem", "position": 1, "item": { "@type": "Product", "name": "Nike Air Max 90", "url": "https://example.com/nike-air-max-90", "image": "https://example.com/photos/nike-air-max-90.jpg", "offers": { "@type": "AggregateOffer", "lowPrice": "7990", "highPrice": "9990", "priceCurrency": "RUB", "offerCount": "5" } } }, { "@type": "ListItem", "position": 2, "item": { "@type": "Product", "name": "Adidas Ultraboost 22", "url": "https://example.com/adidas-ultraboost-22", "image": "https://example.com/photos/ultraboost-22.jpg", "offers": { "@type": "AggregateOffer", "lowPrice": "11990", "highPrice": "13990", "priceCurrency": "RUB", "offerCount": "3" } } } ] } </script>
AggregateOffer здесь описывает диапазон цен для товара с несколькими вариациями. offerCount – количество вариантов (размеров, цветов).
Главная страница: WebSite + SearchAction
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "WebSite", "name": "МойМагазин", "url": "https://example.com", "potentialAction": { "@type": "SearchAction", "target": { "@type": "EntryPoint", "urlTemplate": "https://example.com/search?q={search\\_term\\_string}" }, "query-input": "required name=search_term_string" } } </script>
Хлебные крошки: BreadcrumbList
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Главная", "item": "https://example.com/" }, { "@type": "ListItem", "position": 2, "name": "Кроссовки", "item": "https://example.com/krossovki/" }, { "@type": "ListItem", "position": 3, "name": "Nike Air Max 90" } ] } </script>
Последний элемент без item (URL) – это текущая страница. Google именно так рекомендует.
Внедрение Schema.org в интернет-магазине: пошаговая инструкция
Теперь от теории к практике. Пошаговый план, который работает для магазинов любого размера.
Шаг 1. Выберите формат разметки
Три варианта: JSON-LD, Microdata, RDFa.
Выбирайте JSON-LD. Причины:
Рекомендован Google.
Не смешивается с HTML – проще поддерживать.
Легко генерируется динамически из данных API.
Можно добавить через Google Tag Manager без правки шаблонов.
Microdata (атрибуты itemprop, itemscope в HTML-тегах) всё ещё работает, но любое изменение вёрстки ломает разметку. Для e-commerce с частыми редизайнами это боль.
Шаг 2. Определите приоритетные страницы
Не нужно размечать всё сразу. Приоритет:
Карточки товаров – Product + Offer + AggregateRating. Максимальный эффект на CTR.
Все страницы – BreadcrumbList. Минимум усилий, видимый результат.
Главная – Organization + WebSite с SearchAction.
Страницы каталогов – ItemList с Product.
Страницы с отзывами – Review.
Шаг 3. Добавьте JSON-LD в шаблоны
Два подхода:
Через <head> или <body> в шаблоне страницы. Классический способ. На бэкенде формируете JSON из данных товара и вставляете в шаблон.
Через Google Tag Manager. Если нет быстрого доступа к коду. Создаёте Custom HTML тег с JSON-LD, триггер – загрузка конкретного типа страниц. Переменные Data Layer подставляют данные товара.
Важно: GTM-вариант Google индексирует, но с задержкой. Для критичных страниц лучше серверный рендер.
Шаг 4. Протестируйте разметку
Подробнее об инструментах – в следующем разделе. На этом этапе: каждый шаблон проверяется на тестовой странице до деплоя на продакшн.
Шаг 5. Отслеживайте результаты
Google Search Console → раздел «Улучшения» → «Товары», «Хлебные крошки», «Поле поиска по сайту». Здесь видны ошибки и валидные страницы.
Яндекс.Вебмастер → «Микроразметка». Показывает типы найденной разметки и ошибки.
GSC → Эффективность. Фильтруйте по типу поиска «Результаты с расширенными описаниями». Отслеживайте CTR до и после внедрения.
Проверка микроразметки: инструменты и типичные ошибки

Инструменты валидации
Google Rich Results Test (search.google.com/test/rich-results) – главный инструмент. Показывает, какие rich results доступны для страницы, и все ошибки/предупреждения. Принимает URL или фрагмент кода.
Schema Markup Validator (validator.schema.org) – проверяет синтаксическую корректность по спецификации Schema.org. Более строгий, чем Google-тест. Полезен для отлова ошибок, которые Google пока прощает, но может перестать.
Яндекс.Вебмастер → Микроразметка – обязателен для Рунета. Яндекс интерпретирует некоторые типы иначе, чем Google. Например, для товаров в Яндексе важны offers с явным указанием seller.
Типичные ошибки и как их исправить
Ошибка | Причина | Решение |
|---|---|---|
Missing field “price” | Нет цены в Offer | Всегда заполняйте |
Missing field “availability” | Нет статуса наличия | Добавьте |
Invalid enum value | Строка вместо URI в availability | Используйте |
Multiple entities | Несколько | Один Product на карточку. Для каталога – ItemList |
Warning: missing “image” | Нет изображения |
|
Ещё одна частая проблема – дубли @type. Если CMS генерирует Microdata в HTML, а Вы добавили JSON-LD, поисковик видит два конфликтующих описания. Решение: отключите Microdata в шаблоне или в плагине CMS.
Интеграция микроразметки с популярными CMS
Большинство конкурентных статей дают абстрактные примеры. Но Вы, скорее всего, работаете с конкретной CMS. Вот как внедрять разметку в двух самых популярных системах Рунета.
WordPress + WooCommerce
WooCommerce из коробки добавляет базовую Microdata-разметку Product. Проблема: она часто неполная и конфликтует с плагинами.
Вариант 1: Плагин. Yoast SEO (бесплатная версия) генерирует JSON-LD для Organization, WebSite, BreadcrumbList. Для Product – нужен Yoast WooCommerce SEO (платный) или альтернатива: Rank Math (бесплатно даёт Product schema).
Вариант 2: Кастомный код. Добавьте в functions.php или в кастомный плагин:
add_action('wp_head', function() { if (!is_product()) return; global $product; $schema = [ '@context' => 'https://schema.org', '@type' => 'Product', 'name' => $product->get_name(), 'image' => wp_get_attachment_url($product->get_image_id()), 'description' => wp_strip_all_tags($product->get_short_description()), 'sku' => $product->get_sku(), 'brand' => [ '@type' => 'Brand', 'name' => $product->get_attribute('pa_brand') ?: 'N/A' ], 'offers' => [ '@type' => 'Offer', 'url' => get_permalink(), 'priceCurrency' => get_woocommerce_currency(), 'price' => $product->get_price(), 'availability' => $product->is_in_stock() ? 'https://schema.org/InStock' : 'https://schema.org/OutOfStock' ] ]; // AggregateRating, если есть отзывы if ($product->get_review_count() > 0) { $schema['aggregateRating'] = [ '@type' => 'AggregateRating', 'ratingValue' => $product->get_average_rating(), 'reviewCount' => $product->get_review_count() ]; } echo '<script type="application/ld+json">' . wp_json_encode($schema, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . '</script>'; });
Не забудьте отключить стандартную WooCommerce Microdata, чтобы избежать дублей:
add_filter('woocommerce_structured_data_product', '__return_empty_array');
1C-Битрикс
В Битрикс микроразметка часто генерируется компонентом catalog.element. По умолчанию это Microdata, вшитая в шаблон.
Рекомендуемый подход: Отключите встроенную разметку в шаблоне компонента и добавьте JSON-LD через header.php шаблона сайта или через отдельный файл schema.php, подключаемый в template.php компонента.
Ключевой момент: данные товара берите из $arResult в шаблоне компонента. Цену, наличие, SKU – из свойств инфоблока. Формируйте JSON так же, как в PHP-примере выше, только вместо WooCommerce-функций используйте массив $arResult.
Если у Вас highload-инфоблоки – данные для schema берите из того же запроса, который отдаёт товар на страницу. Не делайте отдельный запрос к БД ради разметки.
Продвинутые типы: FAQPage, VideoObject, LocalBusiness
Базовая разметка Product/Offer покрывает основные задачи. Но есть типы, которые конкуренты почти никогда не внедряют, а они дают дополнительные rich snippets.
FAQPage – для секций «Вопрос-ответ»
Если на карточке товара или в категории есть аккордеон с вопросами – разметьте его как FAQPage. Google покажет вопросы и ответы прямо в сниппете, что значительно увеличивает занимаемую площадь в выдаче.
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "Как подобрать размер Nike Air Max 90?", "acceptedAnswer": { "@type": "Answer", "text": "Модель маломерит на 0.5 размера. Рекомендуем заказывать на размер больше." } }, { "@type": "Question", "name": "Есть ли гарантия на подошву?", "acceptedAnswer": { "@type": "Answer", "text": "Да, гарантия производителя – 2 года с момента покупки." } } ] } </script>
VideoObject – для видеообзоров
Если на странице товара встроено видео (YouTube-embed, свой плеер), разметка VideoObject позволяет Google показать видео-карусель в результатах.
{ "@type": "VideoObject", "name": "Обзор Nike Air Max 90", "description": "Подробный обзор кроссовок Nike Air Max 90.", "thumbnailUrl": "https://example.com/video-thumb.jpg", "uploadDate": "2024-11-15T08:00:00+03:00", "contentUrl": "https://example.com/videos/nike-review.mp4", "embedUrl": "https://youtube.com/embed/abc123" }
LocalBusiness – для оффлайн-точек
Если у магазина есть физические точки продаж, LocalBusiness на странице контактов или на главной формирует карточку в Google Maps и в блоке знаний.
Event – для акций и распродаж
Тип Event позволяет разметить ограниченные по времени акции. Google может показать даты и условия прямо в сниппете. Особенно эффективно для сезонных распродаж.
Автоматизация и динамическая генерация Schema

Статичные JSON-LD шаблоны работают для простых магазинов. Но когда у Вас тысячи товаров, вариации, динамические цены – нужна автоматизация.
Серверная генерация (PHP, Node.js, Python)
Самый надёжный подход. JSON-LD формируется на сервере из тех же данных, что отдаются в шаблон. Поисковик получает разметку при первом запросе, без необходимости выполнять JavaScript.
На Node.js (Express-подобный фреймворк) это выглядит так:
function generateProductSchema(product) { const schema = { "@context": "https://schema.org", "@type": "Product", "name": product.title, "image": product.images, "description": product.description, "sku": product.sku, "offers": { "@type": "Offer", "priceCurrency": "RUB", "price": product.price, "availability": product.inStock ? "https://schema.org/InStock" : "https://schema.org/OutOfStock", "url": product.url } }; if (product.reviewCount > 0) { schema.aggregateRating = { "@type": "AggregateRating", "ratingValue": product.avgRating, "reviewCount": product.reviewCount }; } return JSON.stringify(schema); }
Клиентская генерация (React, Vue)
Если магазин на SPA (Single Page Application), JSON-LD нужно рендерить в DOM. Google утверждает, что индексирует JavaScript-генерируемый JSON-LD, но с оговоркой: SSR (Server-Side Rendering) или SSG (Static Site Generation) надёжнее.
В React используйте react-helmet или next/head (для Next.js):
import Head from 'next/head'; export default function ProductPage({ product }) { const schema = { "@context": "https://schema.org", "@type": "Product", name: product.title, // ... остальные поля }; return ( <> <Head> <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }} /> </Head> {/* JSX компонента */} </> ); }
Для Vue (Nuxt.js) – аналогично через useHead() composable.
Интеграция с API товарной базы
Когда данные приходят из 1C, ERP или PIM-системы, JSON-LD генерируется из тех же API-ответов, что и контент страницы. Не создавайте отдельный маршрут для schema – это лишний запрос и риск рассинхронизации данных.
Схема: API → Контроллер → Шаблон (HTML + JSON-LD из одного набора данных).
Метрики успеха: как понять, что разметка работает
Внедрили разметку, прошли валидацию – а дальше? Без метрик это просто красивый код.
Что отслеживать
Покрытие в GSC. Раздел «Улучшения» → выбранный тип (Товары, FAQ, Хлебные крошки). Следите за соотношением «Валидные» / «С ошибками» / «С предупреждениями».
CTR по страницам с разметкой. В GSC → Эффективность → фильтр по URL или группам страниц. Сравнивайте CTR до и после внедрения. Изменения становятся заметны через 2–4 недели после индексации.
Количество показов rich results. В GSC → Эффективность → фильтр по типу результата поиска.
Конверсия. Если CTR вырос, но конверсия не изменилась – это всё равно плюс: больше трафика при том же CR означает больше продаж.
Подход к A/B-тестированию
Полноценный A/B-тест schema затруднён: нельзя показывать разный сниппет разным пользователям, это контролирует поисковик. Но можно:
Внедрить разметку на часть категорий, оставив контрольную группу без неё.
Сравнить CTR и трафик этих групп через 4–6 недель.
По опыту, разница в CTR для товарных запросов с rich snippets vs. без них составляет 15–25%.
Производительность и безопасность

JSON-LD не блокирует рендер
В отличие от Microdata, которая вплетена в HTML, <script type="application/ld+json"> не выполняется браузером как JavaScript. Парсер видит неизвестный MIME-тип и пропускает. Влияние на скорость загрузки – околонулевое.
Тем не менее:
Минифицируйте JSON-LD в продакшне. Убирайте пробелы и переносы строк. На странице каталога с 50 товарами разметка может весить несколько килобайт.
Не дублируйте данные. Один блок JSON-LD с полной информацией лучше, чем три блока с пересекающимися данными.
Безопасность при пользовательском контенте
Если отзывы генерируются пользователями и попадают в JSON-LD – экранируйте данные. Непроверенный текст в "text" свойстве Review может содержать HTML или спецсимволы, ломающие JSON.
В PHP: json_encode() экранирует по умолчанию. В JavaScript: JSON.stringify() тоже безопасен. Но дополнительно фильтруйте HTML-теги до того, как они попадут в объект schema.
Schema для AI-выдачи и голосового поиска
Google SGE и Яндекс Нейро всё активнее используют структурированные данные для формирования AI-ответов. Чем больше машиночитаемой информации на странице, тем выше шансы попасть в сгенерированный ответ.
Что стоит добавить уже сейчас:
sameAsв Organization – ссылки на соцсети, Яндекс.Карты, Google Maps. Помогает связать сущности.Personдля авторов отзывов – даёт дополнительный контекст для E-E-A-T сигналов.Eventдля акций с датами начала и окончания – потенциально попадает в AI-ответы на запросы типа «скидки на кроссовки на этой неделе».
Это инвестиция в ближайшее будущее. Стоимость внедрения минимальна, а выигрыш при смене формата выдачи может быть значительным.
Чеклист внедрения микроразметки для интернет-магазина

Перед тем как закрывать задачу, пройдитесь по этому списку:
[ ] Формат – JSON-LD для всех типов
[ ] Product + Offer на каждой карточке товара
[ ]
price,priceCurrency,availabilityзаполнены корректно[ ] AggregateRating – только если есть реальные отзывы (не фейковые)
[ ] BreadcrumbList на всех внутренних страницах
[ ] Organization на главной
[ ] WebSite + SearchAction на главной
[ ] Нет дублей (Microdata CMS отключена, если используете JSON-LD)
[ ] Все страницы проверены в Google Rich Results Test
[ ] Яндекс.Вебмастер не показывает ошибок в разделе «Микроразметка»
[ ] Настроен мониторинг в GSC (раздел «Улучшения»)
[ ] FAQPage добавлен на страницы с аккордеонами
[ ] VideoObject – для страниц с видеообзорами
Заключение
Микроразметка Schema.org для интернет-магазина – это не «дополнительная SEO-фишка», а базовый технический стандарт, от которого зависят видимость и кликабельность в поиске. Rich snippets с ценой, рейтингом и наличием товара дают преимущество, которое невозможно получить другим способом.
Первый шаг – возьмите карточку самого популярного товара, добавьте JSON-LD с Product/Offer/AggregateRating, проверьте в Rich Results Test. Через 2–4 недели сравните CTR в GSC. Разница убедит лучше любой статьи.
Если нужна помощь с аудитом текущей разметки или стратегией внедрения для крупного каталога – я разбираю подобные кейсы детально. Подробности и контакт в Telegram-канале.
FAQ
Нужно ли добавлять микроразметку на страницы пагинации каталога?
Нет. Размечайте только первую страницу категории (с ItemList). Страницы пагинации (?page=2, ?page=3) обычно закрыты от индексации или имеют rel="canonical" на первую страницу. Дублирование разметки на пагинациях приведёт к предупреждениям в GSC.
Google показывает ошибку “Missing field ‘priceValidUntil’” – это критично?
Это предупреждение (warning), не ошибка. Rich snippet всё равно может отображаться. Но если хотите убрать предупреждение – добавьте "priceValidUntil": "2025-12-31" в Offer. Укажите дату, до которой цена актуальна. Обновляйте автоматически из базы, если цены меняются.
Можно ли размечать AggregateRating, если отзывов пока нет?
Нельзя. Google прямо запрещает фейковые или отсутствующие отзывы в разметке. Если reviewCount равен нулю – не добавляйте блок AggregateRating. Когда появится хотя бы один реальный отзыв, подключайте динамически.
Микроразметка влияет на позиции в поисковой выдаче?
Напрямую – нет. Google многократно заявлял, что structured data не является фактором ранжирования. Но косвенное влияние велико: рост CTR → поведенческий сигнал → потенциальное улучшение позиций. Плюс для Яндекса разметка товаров важна для попадания в товарные карусели, что фактически равносильно повышению позиции.
Как часто нужно обновлять JSON-LD при изменении цен или наличия?
JSON-LD должен генерироваться динамически из актуальных данных при каждом запросе страницы. Если цена в базе изменилась – schema на странице должна отразить это немедленно. Статичный JSON-LD с захардкоженными ценами – путь к расхождению данных и ручному экшену от Google.
