Сообщение отправлено.

Как передать товарный фид в ChatGPT Shopping?

ChatGPT Shopping не читает тег на карточке товара. Каталог отправляют файлом в OpenAI по SFTP. Для discovery в каждой строке нужны item_id, title, description, url, brand, seller_name, image_url, availability и price.

Что это за файл

ChatGPT Shopping — это товары внутри ответов ChatGPT. В документации OpenAI по commerce каталог — это product feed: файл, который вы загружаете, а не обход страницы категории.

В руководстве get started четыре шага. Прочитать схему файла. Проверить обязательные поля в каждой записи. Загрузить каталог по SFTP. Перезаписать тот же файл новым снимком. OpenAI рекомендует полный снимок не реже раза в день. Discovery, ads и checkout — разные настройки. Список полей: https://developers.openai.com/commerce/specs/file-upload/products. Доставка файла: https://developers.openai.com/commerce/specs/file-upload/overview.

Какой файл принимает OpenAI

В обзоре file upload фид отправляют по SFTP. Предпочтительный формат — parquet. Также подходят jsonl.gz, csv.gz и tsv.gz. Кодировка — UTF-8.

Имя файла держите постоянным и перезаписывайте его. Если каталог режется на части, имена частей тоже постоянные. В обзоре — до 500 000 товаров на часть и файлы примерно до 500 MB. URL публичные, абсолютные, лучше HTTPS. В CSV ячейку с запятой берут в кавычки.

Хост SFTP не угадывают. Обзор загрузки файла его не публикует. Гайд Ads возвращает хост, порт и имя пользователя из sftp_access для этого фида. Там не сказано, что фид discovery ходит на тот же хост.

В get-started сказано, что подключение фида сейчас для approved partners: https://developers.openai.com/commerce/guides/get-started. На https://chatgpt.com/merchants/ уже подавшие заявку стоят в листе ожидания. Каталоги Shopify и Etsy уже подключены. Shopping в ChatGPT открыт для пользователей в US.

Девять обязательных полей

Для полезной строки discovery OpenAI помечает девять полей как обязательные. В обязательном поле должно быть значение. Пустая ячейка не значит ноль и не значит false. Слова null, unknown и n/a не отправляют. Исключение — availability: там unknown разрешён.

item_id — стабильная строка, уникальная для товара или варианта. Для другого товара её не используют повторно. Псевдонимы id и sku принимаются, но если рядом есть item_id, берётся он. Храните значение строкой, чтобы не пропал ведущий ноль.

title — название, с вариантом, если это важно. Ориентир — не больше 150 символов. description — простой текст. Ориентир — не больше 5 000 символов. url — карточка товара, по возможности уже с выбранным вариантом.

brand — марка как на странице. seller_name — продавец этого предложения. image_url — прямой файл картинки этого варианта, не HTML-страница.

availability — одно из in_stock, out_of_stock, pre_order, backorder, unknown. Пустое или неузнанное значение отклоняет строку. unknown не значит, что товар в наличии. Его ставят, только если статуса правда нет.

price — обычная цена в основных единицах: сумма, пробел и код ISO 4217 заглавными, как 79.99 USD. Точка, без разделителя тысяч и без символа валюты. Для USD — два знака после точки. Не округляйте цену до другой суммы к оплате.

Варианты, идентификаторы и цена со скидкой

Одна строка — один вариант, который можно купить. У строк общий group_id и свой item_id. listing_has_variations ставят в true, а variant_dict — это пары вроде color и size. group_id не равен item_id. У каждой строки свои price, availability, url и картинка.

gtin необязателен: 8, 12, 13 или 14 цифр с контрольной цифрой, без пробелов. Не выдумывайте его. mpn — артикул производителя, его передают вместе с brand.

sale_price необязателен. Он больше нуля, меньше price и в той же валюте. Скидка начинается и кончается, когда вы обновляете файл. По схеме даты в файле сами цену не переключают.

Там же сказано, что стандартная загрузка сейчас нацелена на US. Колонка target_countries сама по себе этот выбор не меняет. Другой рынок нужно подтвердить в интеграции.

Строка 79.99 PLN подходит под формат цены: десятичное число, пробел и код ISO 4217. Польшу она не выбирает.

{"item_id":"MUG-350-BLUE","title":"Ceramic mug, 350 ml, blue","description":"Glazed ceramic mug with a handle. Dishwasher safe.","url":"https://example.com/products/mug-blue","brand":"Northline","seller_name":"Northline Home","image_url":"https://example.com/images/mug-blue.jpg","price":"18.00 USD","availability":"in_stock"}

Shopify, WooCommerce и свой каталог

В схеме нет колонки с именем платформы. Вы перекладываете свой каталог в эти поля.

В Shopify берите стабильный id варианта как item_id и не используйте его снова. title, текст без HTML, URL варианта, vendor и имя магазина ложатся в title, description, url, brand и seller_name. Картинка — прямой URL файла. Количество больше нуля — это in_stock. Цена — основные единицы плюс валюта, не центы. Выгрузка — это Admin API или CSV товаров, и её строка заголовков — не схема OpenAI.

В WooCommerce уникальный SKU — это item_id. Если SKU повторяются, берите id вариации. permalink — это url. Обычная цена — это price. instock переходит в in_stock, outofstock в out_of_stock, onbackorder в backorder. У OpenAI предзаказ пишется pre_order. В Google Merchant — preorder. Копия фида Google без этой замены отклонит такие строки.

Свой магазин выгружает те же колонки из базы, которая кормит карточку. Файл собирают на сервере. Цена в файле и цена в HTML — одно число и одна валюта.

Как понять, что строку приняли

Начните со 100 товаров, со всеми обязательными полями, затем проверьте первый снимок и перезапишите тот же файл.

Успешная передача по SFTP — это ещё не принятая строка.

Для фидов Ads OpenAI описывает статусы загрузки: scanning, received, processing, completed, completed_with_errors, skipped и failed. Коды включают missing_required_column, invalid_value, unsupported_file_type и invalid_sftp_directory_layout. Файлы кладут в корень SFTP. Страница: https://developers.openai.com/ads/product-feeds.

Гайд загрузки файла не называет экран принятых и отклонённых строк. Товары читают через commerce API: https://developers.openai.com/commerce/specs/api/overview. Это не Ads. Статус Ads — не результат discovery.

Из-за чего строку отклоняют

Цена вида 79,99, 79.99PLN или $79.99 — не тот формат. availability со значением preorder, in stock или пустой ячейкой не входит в список. image_url на HTML-страницу — не прямая картинка. Непубличный URL не проходит правило доступа.

Повторное использование item_id для нового товара ломает правило идентификатора. Строки вариантов с одним item_id или с group_id, равным item_id, не собираются в группу. HTML внутри description ломает правило простого текста.

  • Одна строка на вариант, со стабильным item_id, который не переиспользуют.
  • В каждой строке есть title, description, url, brand, seller_name и прямой image_url.
  • availability — это in_stock, out_of_stock, pre_order, backorder или unknown.
  • price выглядит как 18.00 USD: точка, пробел и код валюты ISO.
  • Файл — parquet, либо jsonl.gz, csv.gz или tsv.gz, в UTF-8, и он перезаписывает то же имя.
  • Цена в файле совпадает с ценой в HTML страницы.
Можно ли отдать фид Google Merchant как есть?

Не копией без правок. Часть имён другая. У Google это id, link и image_link. У OpenAI — item_id, url и image_url, и ещё обязателен seller_name. Google пишет preorder, OpenAI — pre_order. Для части старых имён есть псевдонимы, но item_id всё равно важнее id.

Заменяет ли JSON-LD на карточке этот файл?

Нет. Файл — это то, что OpenAI принимает для ChatGPT Shopping. schema.org Product и Offer описывают те же факты на странице. Они должны совпадать. Одно другое не заполняет.

Как часто заменять файл?

В get started рекомендуют полный снимок не реже раза в день, поверх того же имени. price и availability обновляйте, когда они меняются. По схеме даты в загрузке сами это не планируют.

Что делать, если варианта нет в наличии?

Оставьте строку с availability out_of_stock и текущей ценой. Если строку убрать, вариант исчезнет. unknown — только когда статуса нет, и это не значит «в наличии».