Sales channel
OpenAI
Feeds are consumed by ChatGPT product discovery and Instant Checkout.
OpenAI ingests a merchant product feed so ChatGPT can surface products in shopping answers and complete purchases through Instant Checkout. It is the one major channel that does not fetch a feed URL you host: you push full catalogue snapshots to an OpenAI SFTP endpoint, and the most recently processed snapshot is retained for up to 14 days.
Feed specification
- Destination
- ChatGPT product discovery and Instant Checkout
- Accepted formats
-
Parquet (zstd, preferred)JSONL (.jsonl.gz)CSV (.csv.gz)TSV (.tsv.gz) - Refresh
- Feeds are pushed to OpenAI over SFTP rather than fetched from a URL, and the guidance is to publish a full catalogue snapshot on a predictable cadence of at least daily. OpenAI retains its most recently processed record for up to 14 days, so a catalogue that stops being pushed ages out rather than simply going stale.
Attributes for OpenAI
Every attribute documented in this knowledge base that OpenAI accepts.
| Attribute | Requirement | Notes |
|---|---|---|
| availability | Required | Accepts in_stock, out_of_stock, pre_order, backorder or unknown. The Google-compatible variant spells the third one preorder. |
| brand | Required | Required, and sits alongside a required seller_name that no Shopify product field supplies, so that one comes from a static store-level value. |
| condition | Optional | One of new, refurbished or used. |
| ads_metadata | Optional | There is no custom_label_0. Custom labelling for Ads is carried under ads_metadata instead. |
| description | Required | Capped at 5,000 characters of plain text. |
| product_category | Optional | Called product_category, and it is your own path from broad to specific separated by >, not Google's numeric taxonomy. The Google values do not carry over. |
| gtin | Optional | Exactly 8, 12, 13 or 14 digits including a valid check digit. Carry it as a string so leading zeros survive. |
| item_id | Required | Called item_id. Variants are submitted as one row each, so every variant carries its own item_id. |
| image_url | Required | Called image_url, and must be a direct JPEG or PNG that is publicly reachable, HTTPS preferred. Further views go in additional_image_urls. |
| group_id | Optional | Called group_id rather than item_group_id, and it travels with listing_has_variations set true and a variant_dict mapping option names to values. A Google mapping has to be rebuilt here, not renamed. |
| url | Required | Called url. This is the page a ChatGPT shopper lands on, so it has to resolve for a logged-out visitor. |
| mpn | Optional | Manufacturer part number, accepted as an alternative identifier to gtin. |
| price | Required | A single string of amount, space, uppercase ISO 4217 code, so "79.99 USD" rather than an amount and a currency in separate fields. |
| sale_price | Optional | Must be greater than zero and strictly less than price, so an empty or equal sale price has to be dropped rather than sent. |
| title | Required | Capped at 150 characters of plain text. |
What catches Shopify merchants out
You push the feed, it is not fetched
Every other channel here takes a feed URL and re-fetches it on a schedule. OpenAI expects full snapshots pushed to an SFTP endpoint it issues you. A feed built around "publish a URL and let the channel pull it" needs a delivery step added rather than just a mapping.
Price is one string, currency included
The price attribute is a decimal amount, a space, then an uppercase ISO 4217 code, so "79.99 USD" rather than an amount and a currency in separate columns. Shopify holds the two apart, so this is a formatting rule, not a field you can map straight across.
seller_name is required and is not a product field
Alongside the expected item_id, title, description, url, brand, image_url, availability and price, the spec requires seller_name. Nothing on a Shopify product carries it, so it has to come from a static value set once for the store.
Variants use a different shape to Google
Rather than Google's item_group_id, variants are grouped with group_id, flagged with listing_has_variations, and described by a variant_dict mapping option names to values. A feed already mapped for Google needs this rebuilt rather than renamed.
Common OpenAI errors
- Duplicate product id A duplicate id error means two or more rows in a feed claim the same identifier, so the channel cannot tell which one describes the item and keeps only the last it processed. On Shopify it usually means the feed was built per product rather than per variant, or that a SKU used as the id is blank or reused across variants.
- Missing value: brand The "Missing value: brand" issue means a channel expects a brand name for a product and the feed did not supply one, or supplied a placeholder it treats as empty. On Shopify it usually means the vendor field is blank, or holds a supplier or internal category rather than the brand a shopper would recognise.
Frequently asked questions
How do I submit a product feed to OpenAI?
You push it. OpenAI issues an SFTP endpoint and you upload full catalogue snapshots to it, rather than hosting a feed URL for the channel to fetch. The recommended cadence is a full snapshot at least once a day.
What happens if my OpenAI feed stops updating?
OpenAI retains its most recently processed record for up to 14 days. If snapshots stop arriving, products age out of that window and stop being eligible for ChatGPT shopping surfaces, so a broken delivery empties the catalogue rather than freezing it.
Which file formats does the OpenAI product feed accept?
Parquet compressed with zstd is preferred. JSONL is the reference format for the schema, and gzipped JSONL, CSV and TSV are also accepted. The Google-compatible variant lets you reuse tab or comma delimited files you already generate, with some attribute differences.
Primary sources
Channel specifications change. These are the official documents this page is based on.