**TL;DR.** Требования Google к богатым результатам продуктов в 2026 году добавили `hasMerchantReturnPolicy` и `shippingDetails` как поля, необходимые для соответствия требованиям к богатым сниппетам. Продукты без них теряют цену, наличие и звезды отзывов в результатах поиска. Ordiko по умолчанию генерирует оба поля, как только вы настраиваете политику на уровне магазина; конкурентам требуется работа с темами/плагинами.

## Что изменилось в 2026 году

В 2024 и 2025 годах Google внедрил новые требования к структурированным данным продуктов. Базовые требования 2026 года:

| Поле                             | Требуется для богатого результата? | Эффект при отсутствии                     |
| -------------------------------- | ---------------------------------- | ----------------------------------------- |
| `name`, `image`, `description`   | Да (давно установлено)             | Результат не соответствует требованиям    |
| `offers.price`, `priceCurrency`  | Да (давно установлено)             | Сниппет цены скрыт                       |
| `offers.availability`             | Да (давно установлено)             | Наличие не отображается                   |
| `aggregateRating` или `review`    | Рекомендуется                      | Звездный рейтинг не отображается          |
| **`hasMerchantReturnPolicy`**     | **Да (2026)**                      | **Богатый результат не соответствует требованиям** |
| **`offers.shippingDetails`**      | **Да (2026)**                      | **Богатый результат не соответствует требованиям** |
| `brand`, `sku`, `gtin`            | Рекомендуется                      | Уменьшает доверие / соответствие         |
| `material`, `color`, `size`       | Рекомендуется                      | Уменьшает фильтруемость                  |

Источник: [Google Search Central — Структурированные данные продуктов](https://developers.google.com/search/docs/appearance/structured-data/product).

## hasMerchantReturnPolicy

Полная структура поля:

```json
{
  "@type": "MerchantReturnPolicy",
  "@id": "https://example.com/#return-policy",
  "applicableCountry": ["US", "CA"],
  "returnPolicyCountry": "US",
  "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
  "merchantReturnDays": 30,
  "returnMethod": "https://schema.org/ReturnByMail",
  "returnFees": "https://schema.org/FreeReturn"
}
```

Допустимые значения:

- `returnPolicyCategory`: `MerchantReturnFiniteReturnWindow`, `MerchantReturnUnlimitedWindow`, `MerchantReturnNotPermitted`, `MerchantReturnUnspecified`.
- `returnMethod`: `ReturnByMail`, `ReturnInStore`, `ReturnAtKiosk`.
- `returnFees`: `FreeReturn`, `OriginalShippingFees`, `ReturnFeesCustomerResponsibility`, `RestockingFees`, `ReturnShippingFees`.

Если у вас есть 30-дневная бесплатная политика возврата по почте (распространенный потребительский стандарт):

```json
{
  "@type": "MerchantReturnPolicy",
  "applicableCountry": ["US", "CA"],
  "returnPolicyCountry": "US",
  "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
  "merchantReturnDays": 30,
  "returnMethod": "https://schema.org/ReturnByMail",
  "returnFees": "https://schema.org/FreeReturn"
}
```

## shippingDetails

Полная структура поля:

```json
{
  "@type": "OfferShippingDetails",
  "shippingRate": {
    "@type": "MonetaryAmount",
    "value": "4.99",
    "currency": "USD"
  },
  "shippingDestination": {
    "@type": "DefinedRegion",
    "addressCountry": "US"
  },
  "deliveryTime": {
    "@type": "ShippingDeliveryTime",
    "handlingTime": {
      "@type": "QuantitativeValue",
      "minValue": 0,
      "maxValue": 1,
      "unitCode": "DAY"
    },
    "transitTime": {
      "@type": "QuantitativeValue",
      "minValue": 2,
      "maxValue": 5,
      "unitCode": "DAY"
    }
  }
}
```

Генерируйте один `shippingDetails` для каждого региона назначения, который вы обслуживаете. Магазин в США и Канаде отправляет в два направления, поэтому требуется два элемента.

## Рекомендуемая схема

Определение политики возврата и доставки для каждого продукта создает многословный HTML. Более чистая схема — определить их один раз в схеме `Organization` с постоянными `@id` и ссылаться на них из каждого продукта:

```json
// Один раз на каждой странице (или только на главной):
{
  "@type": "Organization",
  "@id": "https://example.com/#organization",
  "name": "Example Store",
  "hasMerchantReturnPolicy": {
    "@type": "MerchantReturnPolicy",
    "@id": "https://example.com/#return-policy",
    "applicableCountry": ["US", "CA"],
    "returnPolicyCountry": "US",
    "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
    "merchantReturnDays": 30,
    "returnMethod": "https://schema.org/ReturnByMail",
    "returnFees": "https://schema.org/FreeReturn"
  }
}

// На странице каждого продукта:
{
  "@type": "Product",
  "name": "Кожаная сумка",
  "offers": {
    "@type": "Offer",
    "price": "149.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "hasMerchantReturnPolicy": { "@id": "https://example.com/#return-policy" },
    "shippingDetails": { "@id": "https://example.com/#shipping-us" }
  }
}
```

Это валидируется точно так же, как и встроенные политики, но делает каждую страницу продукта меньше и легче кэшируемой.

## Исключения для продуктов

Некоторые продукты требуют исключений:

- **Крупногабаритные товары** (мебель, матрасы): другая политика возврата (часто `OriginalShippingFees`).
- **Опасные материалы** (батареи, аэрозоли): `MerchantReturnNotPermitted` или только в магазине.
- **Индивидуальные заказы** (гравировка, монограммы): `MerchantReturnNotPermitted`.
- **Цифровые продукты**: `MerchantReturnNotPermitted`.

Переопределите на уровне продукта:

```ts
// Псевдокод для продукта Ordiko
{
  id: "prod_xyz",
  slug: "custom-engraved-watch",
  returnPolicy: {
    category: "MerchantReturnNotPermitted",
    applicableCountry: ["US"],
  },
}
```

Порядок разрешения: переопределение продукта → политика магазина → отсутствие.

## Проверка

1. **На странице**: [Google Rich Results Test](https://search.google.com/test/rich-results) на представительных страницах продуктов. Подтвердите "соответствует требованиям" без предупреждений о возврате/доставке.
2. **В большом масштабе**: [Schema Markup Validator](https://validator.schema.org) для синтаксиса.
3. **В производстве**: Google Search Console → Улучшения → Продукты → отчет о покрытии.

## Как Ordiko реализует это

Ordiko автоматически генерирует `hasMerchantReturnPolicy` и `shippingDetails` на каждой странице продукта, как только вы настраиваете:

- **Настройки → SEO → Политика возврата** (одна форма, ~5 полей).
- **Настройки → SEO → Политики доставки** (одна строка на каждое направление).

Решатель в `src/lib/seo/return-policy.ts` работает по цепочке: переопределение продукта → политика магазина → отсутствие. Рендерер генерирует схему ссылок с постоянными `@id` в организации.

Без работы с темами. Без плагинов. Без написания JSON-LD.

## Общие ошибки

1. **Встроенное дублирование политики возврата на каждом продукте.** Валидируется, но создает 10–50KB избыточного JSON на каждой странице продукта. Используйте схему ссылок.
2. **Отсутствие `applicableCountry`.** Это обязательно. Укажите страны, к которым применяется политика.
3. **Неправильный перечисляемый тип категории.** Используйте полный URL (`https://schema.org/MerchantReturnFiniteReturnWindow`), а не короткое название.
4. **Политики доставки, которые не соответствуют видимым ставкам доставки.** Схема и содержимое страницы должны совпадать, иначе Google подавляет богатый результат.
5. **Совсем нет политики доставки.** Даже магазины с бесплатной доставкой должны генерировать `shippingDetails` с `shippingRate.value` равным `0`.

## Часто задаваемые вопросы

**Когда `hasMerchantReturnPolicy` стало обязательным?**
Google объявил о требовании в 2024 году, с внедрением в 2025 и начале 2026 года. С 2026 года отсутствие `hasMerchantReturnPolicy` в схеме продукта приводит к потере права на богатый результат — ваш продукт больше не отображает цену, наличие или звезды отзывов в SERP.

**Могу ли я сгенерировать единую политику для всего магазина?**
Да. Определите `hasMerchantReturnPolicy` один раз в схеме организации с постоянным `@id`, затем ссылайтесь на него из каждого предложения продукта через `@id`. Это самая чистая схема, и именно это Ordiko генерирует по умолчанию.

**Что если у моих продуктов разные правила доставки?**
Переопределите на уровне продукта. Большинство магазинов имеют 90%+ продуктов с одинаковой политикой и 5–10% нуждаются в переопределениях (крупногабаритные, опасные материалы, индивидуальные заказы). Ordiko поддерживает возможность нулевой политики на уровне продукта, которая возвращается к политике магазина.

**Влияет ли это на цитаты AI-поиска?**
Да, косвенно. AI-движки (Perplexity, ChatGPT, Claude) обрабатывают тот же JSON-LD, что и Google. Полные политики возврата и доставки улучшают цитируемость — AI-движки предпочитают страницы с полными структурированными данными, потому что они могут напрямую отвечать на вопросы пользователей.