**TL;DR.** Les exigences de Google pour les résultats enrichis de produits en 2026 ont ajouté `hasMerchantReturnPolicy` et `shippingDetails` comme champs nécessaires pour l'éligibilité aux extraits enrichis. Les produits sans eux perdent le prix, la disponibilité et les étoiles d'avis dans les résultats de recherche. Ordiko émet les deux par défaut une fois que vous configurez les politiques au niveau du magasin ; les concurrents nécessitent un travail de thème/plugin.

## Qu'est-ce qui a changé en 2026

Au cours de 2024 et 2025, Google a déployé de nouvelles exigences pour les données structurées des produits. La base de référence de 2026 :

| Champ                           | Requis pour le résultat enrichi ? | Effet si manquant                     |
| ------------------------------- | ---------------------------------- | ------------------------------------- |
| `name`, `image`, `description`  | Oui (depuis longtemps)             | Résultat non éligible                 |
| `offers.price`, `priceCurrency` | Oui (depuis longtemps)             | Extrait de prix masqué                |
| `offers.availability`            | Oui (depuis longtemps)             | Disponibilité non affichée            |
| `aggregateRating` ou `review`    | Recommandé                         | Évaluation par étoiles non affichée   |
| **`hasMerchantReturnPolicy`**    | **Oui (2026)**                     | **Résultat enrichi non éligible**     |
| **`offers.shippingDetails`**     | **Oui (2026)**                     | **Résultat enrichi non éligible**     |
| `brand`, `sku`, `gtin`           | Recommandé                         | Réduit la crédibilité / correspondance |
| `material`, `color`, `size`      | Recommandé                         | Réduit la filtrabilité                |

Source : [Google Search Central — Données structurées des produits](https://developers.google.com/search/docs/appearance/structured-data/product).

## hasMerchantReturnPolicy

La structure complète du champ :

```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"
}
```

Valeurs valides :

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

Si vous avez une politique de retour gratuite de 30 jours par courrier (le défaut courant et convivial) :

```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

La structure complète du champ :

```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"
    }
  }
}
```

Émettez un `shippingDetails` par région de destination que vous servez. Un magasin US-Canada expédie vers deux destinations, donc deux entrées.

## Modèle de référence (recommandé)

Définir la politique de retour et l'expédition par produit produit un HTML verbeux. Le modèle plus propre est de les définir une fois sur le schéma `Organization` avec des `@id`s stables et de les référencer depuis chaque produit :

```json
// Une fois sur chaque page (ou juste la page d'accueil) :
{
  "@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"
  }
}

// Par page produit :
{
  "@type": "Product",
  "name": "Sac en cuir",
  "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" }
  }
}
```

Cela valide exactement de la même manière que les politiques en ligne mais garde chaque PDP plus petite et plus facile à mettre en cache.

## Surcharges par produit

Certains produits nécessitent des exceptions :

- **Articles surdimensionnés** (meubles, matelas) : politique de retour différente (souvent `OriginalShippingFees`).
- **Matériaux dangereux** (batteries, aérosols) : `MerchantReturnNotPermitted` ou uniquement en magasin.
- **Faits sur mesure** (gravure, monogrammes) : `MerchantReturnNotPermitted`.
- **Produits numériques** : `MerchantReturnNotPermitted`.

Surchargez au niveau du produit :

```ts
// Pseudocode pour un produit Ordiko
{
  id: "prod_xyz",
  slug: "montre-gravée-sur-mesure",
  returnPolicy: {
    category: "MerchantReturnNotPermitted",
    applicableCountry: ["US"],
  },
}
```

L'ordre de résolution : surcharge produit → politique de magasin → aucune.

## Validation

1. **Par page** : [Google Rich Results Test](https://search.google.com/test/rich-results) sur des PDP représentatives. Confirmez "éligible" sans avertissements concernant le retour/l'expédition.
2. **À grande échelle** : [Schema Markup Validator](https://validator.schema.org) pour la syntaxe.
3. **En production** : Google Search Console → Améliorations → Produits → rapport de couverture.

## Comment Ordiko implémente cela

Ordiko émet `hasMerchantReturnPolicy` et `shippingDetails` sur chaque PDP automatiquement une fois que vous configurez :

- **Paramètres → SEO → Politique de retour** (un formulaire, ~5 champs).
- **Paramètres → SEO → Politiques d'expédition** (une ligne par destination).

Le résolveur dans `src/lib/seo/return-policy.ts` cascade : surcharge produit → politique de magasin → aucune. Le rendu émet le modèle de référence avec des `@id`s stables sur l'Organisation.

Pas de travail de thème. Pas de plugins. Pas d'écriture JSON-LD.

## Erreurs courantes

1. **Duplication en ligne de la politique de retour sur chaque produit.** Valide mais produit 10–50 Ko de JSON redondant par PDP. Utilisez le modèle de référence.
2. **Absence de `applicableCountry`.** Ceci est requis. Spécifiez les pays auxquels la politique s'applique.
3. **Mauvaise énumération de catégorie.** Utilisez l'URL complète (`https://schema.org/MerchantReturnFiniteReturnWindow`), pas le nom court.
4. **Politiques d'expédition qui ne correspondent pas aux tarifs d'expédition visibles.** Le schéma et le contenu de la page doivent être d'accord ou Google supprime le résultat enrichi.
5. **Aucune politique d'expédition du tout.** Même les magasins avec expédition gratuite doivent émettre `shippingDetails` avec une `shippingRate.value` de `0`.

## FAQ

**Quand `hasMerchantReturnPolicy` est-il devenu requis ?**
Google a annoncé l'exigence en 2024 avec une application déployée tout au long de 2025 et début 2026. À partir de 2026, l'absence de `hasMerchantReturnPolicy` sur le schéma Produit entraîne une perte d'éligibilité aux résultats enrichis — votre produit n'affiche plus le prix, la disponibilité ou les étoiles d'avis dans les SERP.

**Puis-je émettre une seule politique pour tout le magasin ?**
Oui. Définissez `hasMerchantReturnPolicy` une fois sur le schéma Organization avec un `@id` stable, puis référencez-le depuis chaque offre de produit via `@id`. C'est le modèle le plus propre et ce qu'Ordiko émet par défaut.

**Que faire si mes produits ont des règles d'expédition différentes ?**
Surchargez par produit. La plupart des magasins ont 90 % ou plus de produits sous la même politique et 5 à 10 % nécessitant des surcharges (surdimensionnés, matières dangereuses, faits sur mesure). Ordiko prend en charge une politique par produit nullable qui revient à la politique du magasin.

**Cela affecte-t-il les citations de recherche AI ?**
Oui, indirectement. Les moteurs AI (Perplexity, ChatGPT, Claude) analysent le même JSON-LD que Google. Des politiques de retour et d'expédition complètes améliorent la citabilité — les moteurs AI préfèrent les pages avec des données structurées complètes car ils peuvent répondre directement aux questions des utilisateurs.