Produits absents des résultats shopping de ChatGPT : la liste des 10 vérifications

Produit absent de ChatGPT shopping : presque toujours une ligne de flux mal formée. Dix causes, du prix à l'instantané périmé, et leur correction.

Publié le 11 min de lecture

Les produits absents des résultats shopping de ChatGPT remontent presque toujours à une ligne de flux qu’OpenAI n’a pas pu utiliser : un champ obligatoire manque, un prix est écrit 25,99 au lieu de 25.99 EUR, une marque indique n/a, un GTIN échoue au contrôle de sa clé, ou l’instantané a cessé d’être rafraîchi. La spécification ne documente aucun rapport d’erreur ligne par ligne, vous devez donc auditer le fichier vous-même. Voici les 10 causes à vérifier, dans l’ordre.

Pourquoi vous devez auditer le fichier vous-même

La page de présentation du dépôt de fichiers cite trois causes d’échec fréquentes : « Missing required fields », « Outdated or non-spec field names » et « Malformed field values ». Elle demande aussi de « Start with a small sample (around 100 items) » avant un déploiement complet. Ce que la documentation ne décrit pas, c’est un rapport qui vous dirait quelles lignes ont été rejetées et pourquoi. Tant qu’un tel rapport n’existe pas, un produit qui disparaît de ChatGPT est un symptôme que vous devez remonter jusqu’à une ligne de votre fichier.

Cette liste va des causes les plus fréquentes au niveau de la ligne jusqu’aux causes au niveau du fichier, qui mettent tout un catalogue hors ligne d’un coup. Pour chacune, vous trouverez une méthode de détection applicable à votre propre export et la correction. Les règles de champ sont citées d’après la spécification du flux produit ; la référence complète des champs se trouve dans La spécification du flux produit OpenAI, champ par champ.

1. Un champ obligatoire est manquant ou vide

Les neuf champs obligatoires sont item_id, title, description, url, brand, seller_name, image_url, availability et price. La spécification indique qu’un champ omis, un null JSON ou une cellule vide dans un fichier délimité « supplies no value », et pour availability elle précise qu’une valeur omise, vide ou non reconnue rejette la ligne.

Comment le détecter. Comptez les cellules vides par colonne obligatoire dans votre export. Les coupables habituels sont brand (champ fournisseur vide sur Shopify, attribut vide sur WooCommerce), description (produits créés à la hâte avec un titre seulement) et seller_name (jamais mis en correspondance, parce qu’aucun autre canal ne le demande).

Comment le corriger. Renseignez la valeur à la source. Ne la remplacez pas par une valeur de remplissage pour passer le contrôle ; c’est la cause numéro 4.

2. Des noms de champs obsolètes ou hors spécification

Les flux dérivés d’un ancien modèle OpenAI ou d’un export Google Shopping portent des noms qu’OpenAI traite comme des alias hérités (id, sku, item_group_id, enable_search, enable_checkout, is_eligible_ads, return_window), ou des noms qu’il ne connaît pas du tout (link, image_link, google_product_category). Les alias sont encore acceptés, mais la spécification demande de « Send only one name per value », et les noms inconnus ne fournissent rien : un champ obligatoire écrit à la manière de Google est un champ obligatoire manquant.

Comment le détecter. Comparez votre ligne d’en-tête (ou vos clés JSON) aux noms actuels : item_id, group_id, is_eligible_search, is_eligible_checkout, is_ads_eligible, return_deadline_in_days, url, image_url.

Comment le corriger. Renommez dans la correspondance de l’export, et n’émettez jamais le nom actuel et son alias dans le même fichier.

3. Un prix ou un prix promotionnel au mauvais format

price est une seule chaîne : « a decimal amount in major units, a space, and an uppercase three-letter ISO 4217 currency code », par exemple 79.99 USD, avec « a decimal point, no thousands separators or exponent notation ». sale_price doit être « greater than zero, strictly less than price, and in the same currency » ; un prix promotionnel égal, supérieur, nul, négatif ou dans une autre devise n’est pas utilisé.

Comment le détecter. Cherchez dans la colonne des prix une virgule, un symbole monétaire (, $, £), un code devise en minuscules, une devise absente, ou une valeur au-dessus de 999 écrite avec un séparateur de milliers. Comparez ensuite sale_price à price ligne par ligne et signalez chaque cas où ils sont égaux.

Comment le corriger. Formatez les prix dans l’export, pas dans la boutique. Une boutique qui affiche 1 079,99 € est correcte ; le flux doit dire 1079.99 EUR. Une promotion terminée doit retirer sale_price de la ligne : « Submit the current price; update the feed when a sale starts or ends. »

4. Des valeurs de remplissage

« Do not use placeholder strings such as null, unknown, or n/a; unknown is valid only where explicitly listed. » Le seul champ où unknown est légal est availability. Les valeurs de remplissage apparaissent le plus souvent dans brand et seller_name, parce qu’un outil interne exigeait des colonnes non vides.

Comment le détecter. Cherchez dans chaque colonne texte null, unknown, n/a, na, none, - et TBD, sans tenir compte de la casse.

Comment le corriger. Remplacez par la vraie valeur. Pour brand, la spécification veut la « Product brand as shown on the product page » ; pour les produits en marque propre, c’est votre propre marque.

5. Du HTML, des majuscules ou des titres et descriptions trop longs

title est limité à 150 caractères et description à 5 000, tous deux en texte brut. La page des bonnes pratiques demande un texte « concise, factual copy that helps users understand products. Plain text and bullet-style text are both acceptable. » Les éditeurs de boutique enregistrent les descriptions en HTML, et un export qui ne retire pas les balises envoie <p>, <br>, &nbsp; et des styles en ligne dans le champ.

Comment le détecter. Cherchez < et & dans la colonne des descriptions. Mesurez la longueur des titres et signalez tout ce qui dépasse 150 caractères. Signalez les titres dont chaque lettre est une majuscule.

Comment le corriger. Retirez les balises et décodez les entités à l’étape d’export, en conservant les sauts de paragraphe sous forme de retours à la ligne. Réécrivez les titres en casse de phrase avec les détails de variante, puisque la spécification veut le « Product name, including the selected variant when relevant. » La spécification ne cite pas les majuscules intégrales comme cause de rejet ; le validateur de Convrail les rejette malgré tout, parce qu’un titre tout en majuscules donne l’impression de crier au milieu d’une réponse conversationnelle et qu’aucune vraie fiche produit ne nomme le produit ainsi. Si vous voulez de l’aide pour réécrire les titres à grande échelle, le module optimisation du flux en rédige des propositions que vous relisez.

6. L’URL de l’image n’est pas un JPEG ou un PNG direct

image_url doit être une « direct image URL, such as a JPEG or PNG », accessible publiquement, HTTPS de préférence. Trois schémas échouent : un lien vers la page produit au lieu du fichier image, une URL qui a besoin d’une session ou d’un jeton signé pour se charger, et un format autre que JPEG ou PNG (WebP ou AVIF servi par défaut par un CDN d’images).

Comment le détecter. Récupérez un échantillon d’URL d’images depuis l’extérieur de votre réseau, sans cookies, et lisez l’en-tête Content-Type : il doit valoir image/jpeg ou image/png. Signalez les URL qui se terminent par .webp ou .avif, et celles qui contiennent ?token= ou &signature=.

Comment le corriger. Faites pointer image_url vers le fichier JPEG ou PNG d’origine. La plupart des CDN de plateforme conservent l’original quand on demande l’URL sans paramètre de format.

7. Un GTIN invalide

Le gtin doit compter « exactly 8, 12, 13, or 14 digits, including a valid check digit. Preserve leading zeros; no spaces or dashes. » Un GTIN erroné est une valeur mal formée sur une ligne par ailleurs correcte.

Comment le détecter. Trois contrôles : une longueur dans {8, 12, 13, 14} ; uniquement des chiffres (ni tirets ni espaces) ; et la clé de contrôle elle-même, que vous pouvez recalculer avec la pondération modulo 10 standard (multipliez alternativement les chiffres par 3 et par 1 en partant de la droite, additionnez, et la clé amène le total à un multiple de 10). Cherchez aussi les codes à 11 ou 12 chiffres qui en comptaient 12 ou 13 à l’origine : un tableur qui a traité la colonne comme un nombre a supprimé le zéro initial.

Comment le corriger. Corrigez le code-barres à la source, ou omettez le champ. La spécification dit explicitement « do not invent a value to replace a missing GTIN. » Convrail vérifie la clé de contrôle sur chaque ligne et omet un GTIN invalide plutôt que de l’envoyer ; le produit part quand même et l’omission est consignée dans le journal.

8. Des erreurs de regroupement de variantes

Les variantes ont besoin de trois champs cohérents. group_id est le « Stable parent-listing ID shared by all variants » ; s’il est « Omitted or empty: uses item_id, which does not establish a variant group. » listing_has_variations doit valoir true sur chaque ligne de variante. variant_dict associe des noms d’options à des valeurs et « Requires listing_has_variations=true and group_id different from item_id. »

Comment le détecter. Signalez les lignes où group_id est égal à item_id. Signalez les groupes où listing_has_variations manque ou vaut false sur certaines lignes. Signalez les groupes dont les clés de variant_dict diffèrent d’une ligne à l’autre (une variante dit colour, la suivante color) ou dont deux lignes partagent la même combinaison d’options. Comparez color et size au premier niveau avec les mêmes clés dans variant_dict ; la spécification avertit que « Neither representation reconciles conflicting values for you. »

Comment le corriger. Utilisez l’identifiant du produit parent de la plateforme comme group_id et l’identifiant de la variante comme item_id. Émettez les mêmes noms d’options dans tout le groupe. Gardez title, url, image_url, availability et price propres à chaque variante, comme le recommande la page des bonnes pratiques.

9. Des indicateurs d’éligibilité et de ciblage

Plusieurs indicateurs peuvent masquer un produit, volontairement ou par accident.

  • is_eligible_search=false « disables it and checkout eligibility ». Si une modification en masse l’a appliqué à tout le catalogue, rien n’est éligible.
  • is_ads_eligible « Omitted/empty: disabled unless feed-level default applies. » Les produits que vous attendez dans les publicités ChatGPT ont besoin d’un true explicite.
  • is_eligible_checkout=true est ignoré quand l’éligibilité à la recherche vaut false, et les deux URL de politique (seller_privacy_policy, seller_tos) n’établissent pas à elles seules la disponibilité du paiement.
  • target_countries doit contenir des codes ISO 3166-1 alpha-2 en majuscules « configured for feed. Omitted/empty does not mean worldwide. » Un nom de pays, un code en minuscules ou un pays non configuré dans votre compte ne cible rien.

Comment le détecter. Comptez les valeurs false dans is_eligible_search. Listez les valeurs distinctes de target_countries et comparez-les à ce qui est configuré auprès d’OpenAI. Vérifiez que les colonnes booléennes ne contiennent que true ou false (chaînes en minuscules dans les fichiers délimités ; vrais booléens en JSONL et en Parquet), et non TRUE, 1 ou yes.

Comment le corriger. Fixez les indicateurs délibérément depuis les réglages du flux plutôt que produit par produit, et tenez-les à l’écart des formules de tableur qui produisent TRUE.

10. L’instantané est périmé, trop volumineux ou renommé

Le dernier groupe de causes met tout un catalogue hors ligne plutôt qu’un seul produit.

  • Non rafraîchi. La page de présentation demande de « Publish full snapshots on a predictable cadence (at least daily). » OpenAI « retains its most recently processed record for up to 14 days », donc un flux dont la tâche planifiée s’est arrêtée reste visible un moment, puis tout expire d’un coup. À l’inverse, un produit que vous avez retiré du fichier subsiste jusqu’à 14 jours ; pour le retirer plus tôt, gardez la ligne et passez is_eligible_search=false.
  • Mauvais nommage de fichier. « Use a stable file name. Keep the same file name on every update and overwrite it with the latest snapshot instead of creating a new name each run. » Une exécution qui écrit feed-2026-09-05.jsonl.gz à côté du fichier de la veille ne remplace pas l’instantané de la veille.
  • Fragments trop volumineux. « Up to 500k items per shard is recommended; target shard files under ~500MB ». Découpez avant ces limites.
  • Pas en UTF-8. Un export en Windows-1252 avec des caractères accentués est une valeur mal formée sur chaque ligne concernée.
  • Déploiement complet sans échantillon. La page de présentation demande de commencer « with a small sample (around 100 items) ». Une centaine de lignes révèle chaque erreur de correspondance avec une fraction du bruit.

Comment le détecter. Sur votre destination SFTP, listez les fichiers : il doit y avoir un nom stable par fragment, écrasé chaque jour, chacun sous la limite de taille. Regardez la date de dernière modification. Lancez file sur l’export pour confirmer l’UTF-8.

Comment le corriger. Corrigez la planification et le nommage dans la tâche d’export. Convrail écrit les fragments sous les noms feed-organic-000.<ext>, feed-organic-001.<ext> et ainsi de suite, découpe à 500 000 articles ou environ 450 Mo, et écrase les mêmes noms à chaque livraison quotidienne ; les compromis entre formats sont traités dans Parquet, JSONL ou CSV pour le flux produit OpenAI.

Erreurs fréquentes au moment du diagnostic

  • Vérifier la boutique, pas le fichier. La fiche produit a l’air parfaite ; c’est la ligne exportée qu’OpenAI lit.
  • Tester un produit et généraliser. Une cause comme la virgule décimale touche chaque ligne exportée depuis le même environnement régional.
  • Supprimer un produit du flux pour le « réinitialiser ». Il subsiste jusqu’à 14 jours ; la réinitialisation ne produit rien de visible.
  • Corriger la valeur à la main dans le fichier. Le prochain instantané automatique écrase la correction ; corrigez la correspondance ou les données source.
  • Supposer que le silence vaut succès. En l’absence de rapport ligne par ligne dans la documentation, une livraison téléversée sans erreur prouve que le transfert a fonctionné, pas que les lignes étaient utilisables.

Où le journal d’exécution de Convrail intervient

Convrail passe cette liste automatiquement sur chaque ligne avant que le fichier ne parte. Chaque exécution enregistre itemsTotal, itemsValid et itemsRejected, la différence avec l’exécution précédente (ajoutés, retirés, modifiés), l’état de la livraison avec le nombre de tentatives, et une entrée d’erreur par article rejeté avec l’item_id, le champ et la règle enfreinte. Les neuf champs obligatoires, les formats de prix et de prix promotionnel, les valeurs de remplissage, le HTML dans les descriptions, les titres en majuscules, les URL d’images, la clé de contrôle du GTIN, les règles de variantes et les indicateurs d’éligibilité sont tous couverts, et les fragments sont nommés, dimensionnés et livrés comme la page de présentation le demande. Quand un produit que vous vendez chaque jour n’est pas dans ChatGPT, le journal vous dit quelle exécution l’a écarté et pourquoi, au lieu de vous laisser décoder un silence. Une livraison échouée est retentée, puis ouvre une alerte de santé.

Prochaine étape

Passez votre catalogue dans le validateur de Convrail et lisez le journal des rejets avant votre prochain instantané : voir la page flux produit.

Sources

Questions fréquentes

OpenAI m'indique-t-il quels produits ont été rejetés de mon flux ?

La spécification ne documente aucun rapport d'erreur ligne par ligne. La page de présentation du dépôt nomme les causes d'échec fréquentes (champs obligatoires manquants, noms de champs obsolètes, valeurs mal formées), vous devez donc auditer le fichier vous-même avant la livraison.

Combien de temps un produit reste-t-il dans ChatGPT après avoir disparu de mon flux ?

OpenAI conserve son dernier enregistrement traité jusqu'à 14 jours. Pour retirer un produit plus vite, gardez-le dans le flux avec is_eligible_search à false.

Un seul champ défectueux peut-il retirer un produit de ChatGPT shopping ?

Oui. Une valeur mal formée dans n'importe quel champ, obligatoire ou non, rend la ligne inutilisable ; un prix mal formaté ou une balise HTML dans une description suffit. La correction consiste à valider chaque ligne avant la livraison.

Pourquoi tout mon catalogue semble-t-il absent plutôt que quelques produits ?

Vérifiez d'abord les causes au niveau du fichier : un flux qui change de nom de fichier à chaque exécution, des fragments au-delà de la taille recommandée, un instantané de plus de 14 jours ou des noms de champs hérités sur toutes les lignes. Elles touchent tous les produits d'un coup.

Mesurez le canal ChatGPT dès cette semaine

Gratuit pendant l'accès anticipé, le temps d'intégrer les premières boutiques. Laissez votre email et vous recevez le lien d'installation dès qu'une place s'ouvre.

Pas de newsletter. Un seul email avec le lien d'installation, rien d'autre.