OpenAI’s ChatGPT product feed needs nine fields on every row: item_id, title, description, url, brand, seller_name, image_url, availability and price. Everything else is optional, but the optional fields are where you answer what shoppers actually ask: the material, the size, the return window.
Below is every field in plain words, with an example and where a Shopify store usually keeps that fact. It follows OpenAI’s product feed reference, field names exactly as OpenAI writes them.
First: do you need to fill this in at all?
If you sell on Shopify or Etsy, no. OpenAI’s merchant page says your catalog “is already integrated, and no additional setup or application is required”. Shopify sends your products to ChatGPT through Shopify Catalog, and what you control is the product data in your Shopify admin. Our Shopify and ChatGPT guide covers that route.
This page is still useful on Shopify, because the feed fields are a clean list of the facts ChatGPT is built to receive. If a fact has a field here and your product page doesn’t state it, that’s a gap worth closing whichever way your data travels.
If you’re not on Shopify or Etsy, you apply to OpenAI and wait for approval. Our ChatGPT product feed guide walks through applying, delivery over SFTP and the schema traps to avoid.
The nine required fields
Every row needs all nine. A row is one thing a shopper can buy, so a T-shirt in three sizes is three rows.
| Field | What it means | Good example | Where it lives in Shopify |
|---|---|---|---|
item_id |
A permanent ID for this exact item or variant. Never reuse it | TRAIL-BLK-10 |
The variant SKU, or the variant ID |
title |
The product name, plus the variant if it matters. Aim for 150 characters or fewer | Trail running shoes, black, size 10 |
Product title plus the option values |
description |
A factual, plain-text description. Aim for 5,000 characters or fewer | Waterproof trail shoes with a rubber outsole and mesh lining. |
Product description, or the metafield you use for it |
url |
The product page, with this variant selected if possible | https://example.com/products/trail?variant=… |
The product URL |
brand |
The brand shown on the product page. A real name, not a placeholder | Northline |
Usually the Vendor field |
seller_name |
Who’s selling this offer | Northline Outdoor |
Your store name |
image_url |
A direct link to the main image, showing this variant (JPEG or PNG) | https://example.com/images/trail-black.jpg |
The variant image, or the first product image |
availability |
Stock status: in_stock, out_of_stock, pre_order, backorder or unknown |
in_stock |
Inventory for the variant |
price |
The regular price: amount, a space, the currency code | 79.99 USD |
Price, or compare-at price when the item is on sale (see below) |
Two of these trip people up.
availability can’t be blank. OpenAI says a missing or unrecognized value rejects the whole row. If you genuinely don’t know, write unknown.
price is the regular price, not the sale price. If an item is on sale, the regular price goes in price and the lower one goes in sale_price. In Shopify terms, that usually means your compare-at price goes in price and your current price goes in sale_price, but only if the compare-at price really was what you normally charge.
Variant fields: one product, several rows
These tie your rows back together so ChatGPT knows the black size 10 and the black size 11 are the same shoe.
| Field | What it means | Good example | Where it lives in Shopify |
|---|---|---|---|
group_id |
One ID shared by every variant of the product. Must differ from each item_id |
TRAIL |
The product ID or handle |
listing_has_variations |
true on every variant row |
true |
Set it whenever the product has options |
variant_dict |
The options this row picks, as name and value pairs | {"color":"Black","size":"10"} |
The variant’s option names and values |
offer_id |
An optional ID for this seller’s offer. Never put the price in it | northline-TRAIL-BLK-10 |
Usually not needed for a single-brand store |
Keep option names the same across a group. If one row says color and another says Colour, ChatGPT gets two different options.
Identifiers: GTIN and MPN
| Field | What it means | Good example | Where it lives in Shopify |
|---|---|---|---|
gtin |
The barcode number assigned to this exact item: 8, 12, 13 or 14 digits, with a valid check digit | 09506000134352 |
The variant’s Barcode field |
mpn |
The manufacturer’s part number, exactly as they write it. Send it with brand |
NL-TRAIL-10-BLK |
Often a metafield, if you keep one |
OpenAI is firm on one point: don’t invent an MPN to make up for a missing GTIN. If you don’t have one, leave it out. Our GTIN, MPN and SKU guide explains which one you actually have.
The facts that answer shoppers’ questions
This group is all optional, and it’s where most buying questions live.
| Field | What it means | Good example | Where it lives in Shopify |
|---|---|---|---|
condition |
new, refurbished or used. Always say used or refurbished |
new |
Usually new; say so for anything else |
product_category |
Your category path, broad to specific, separated by > |
Apparel & Accessories > Shoes |
Product category or Type |
material |
The main materials | Leather and rubber |
Product description, an option, or a metafield |
color |
The selected color, matching the image | Black |
The color option |
size |
The selected size label | 10 |
The size option |
gender |
male, female or unisex |
unisex |
Usually a metafield or tag |
age_group |
newborn, infant, toddler, kids or adult |
adult |
Usually a metafield or tag |
dimensions |
The product’s own size (not the box), at least two of length, width and height, plus a unit | {"length":"30","width":"20","height":"12","unit":"cm"} |
Product description or a metafield |
weight and item_weight_unit |
Net weight without packaging, and its unit (g, kg, oz or lb) |
0.75 and kg |
Product description or a metafield |
Notice what isn’t on the list. There’s no field for noise level, room coverage, runtime, warmth rating or battery life. For products people buy on a number like that, the number has to go in the title or the first lines of the description, with its unit.
It’s easy to miss. In our saved Shopify Catalog results for “humidifier for dry winter air large room quiet top fill”, a decibel figure appeared in the description of just 4 of the 10 listings, and in none of the titles.
Images, price and stock extras
| Field | What it means | Good example |
|---|---|---|
additional_image_urls |
More photos of this item, as a list | ["https://example.com/images/trail-side.jpg"] |
sale_price |
The current sale price: above zero, below price, same currency |
59.99 USD |
seller_url |
Your storefront page | https://example.com |
If sale_price is equal to or higher than price, or in a different currency, OpenAI simply ignores it.
Shipping, returns and reviews
| Field | What it means | Good example | Where it lives in Shopify |
|---|---|---|---|
shipping_price |
What shipping costs. 0.00 USD means free; leaving it out means unknown |
5.00 USD |
Your shipping settings |
accepts_returns |
true or false. A policy link alone doesn’t set it |
true |
Your refund policy |
return_deadline_in_days |
How many days a buyer has to return it. Only send with accepts_returns=true |
30 |
Your refund policy |
return_policy |
A link to the return policy for this item | https://example.com/policies/refund-policy |
Settings > Policies |
review_count |
How many product reviews. 0 means none; blank means unknown |
254 |
Your reviews app |
star_rating |
The average rating out of 5, to two decimals. Leave it out if there are no reviews | 4.50 |
Your reviews app |
The theme here: blank means unknown, not zero. OpenAI says so directly. Don’t fill gaps with n/a, null or 0. A free-shipping item and an item with unknown shipping are different things, and so are a product with no reviews and a product whose reviews you didn’t send. For a final-sale item, send accepts_returns=false and leave the window out.
For review fields, count only product reviews. Store reviews have their own fields, and those need extra setup.
The switches: search, checkout and ads
These don’t describe the product. They say where it can appear.
| Field | What it does | Default if you leave it out |
|---|---|---|
is_eligible_search |
false takes the item out of search (and checkout) |
On |
is_eligible_checkout |
Opts the item into in-ChatGPT checkout, if checkout is enabled for your integration | Off |
seller_privacy_policy, seller_tos |
Links to your privacy policy and terms, needed for checkout | None |
is_ads_eligible, ads_metadata |
Opt-in and labels for ChatGPT ads, set up separately | Off |
OpenAI says search eligibility “does not guarantee display”. And checkout is a smaller deal than it sounds: OpenAI’s merchant page says it’s moving away from a standalone Instant Checkout in ChatGPT, toward checkout on your own site or app.
The rest of the reference covers fields that only work once OpenAI has set them up for your feed: size_system, store_review_count, store_star_rating, accepts_exchanges, is_digital, marketplace_seller, target_countries and store_country. Adding those columns on your own does nothing. Standard uploads target US shoppers, whatever currency you use.
The five fields to get perfect first
OpenAI doesn’t publish how much any field counts. But its Help Center says ChatGPT may weigh the options available, price, reviews and ease of use against what the shopper asked. Shopify’s list of what AI platforms consider leads with title and description. Put those together, and here’s where we’d start:
description. It’s the only place for the facts that have no field of their own. Put the one or two numbers customers ask about in the first sentence, with units.title. Name the product type plainly, plus the variant. “Cloud 2.0, Midnight” tells a shopper nothing; “Weighted blanket, 15 lb, queen, navy” does.priceandsale_price. Regular price in one, sale price in the other. Get these backwards and your sale looks like a price hike.availability. An item that’s out of stock but listed as in stock is the fastest way to lose a shopper’s trust.review_countandstar_rating. Product reviews only, both from the same set of reviews, and nothing at all if there are none.
If you have a real GTIN, send it too. It’s the cleanest way to tell an assistant exactly which item you mean.
One warning about OpenAI’s other pages
OpenAI’s best-practices page uses names from a different format, like seller.name, variant_options and description.html. Those match the Draft schema that sits behind a toggle on the reference page, which OpenAI says is “published for planning and feedback only” and “not supported for production integrations yet”. They aren’t fields in the default (Stable) file-upload reference.
That matters because OpenAI’s own list of the most common upload failures includes “outdated or non-spec field names”. Build from the default view of the products reference, and treat the best-practices page as advice on content, not field names.
Your next step
Take your best-selling product and fill in this page’s tables for it by hand, one row per variant. Every cell you can’t fill is a fact your product page probably doesn’t state either. Pick the one a customer asks about most, and add it to the first line of the description this week.