Skip to content
ChatGPT
Ad platforms

ChatGPT product feed for Shopify

When ChatGPT shows products, the catalog data comes from feeds that approved merchants submit to OpenAI. Feedflock turns your Shopify catalog into an OpenAI-format feed: nine required fields, structured variants, prices with currency. OpenAI doesn't fetch merchant URLs: your own pipeline pushes a full snapshot to its SFTP endpoint, and Feedflock keeps the file fresh at a stable URL so every push ships the latest state.

01 · ShopifyProduct in the catalog
Linen shirt SandNordlin · Men's shirtsSKU-2048 · S–XL
Price
$59
In stock
0 pcs
When out of stock
02 · chatgpt.csvUpdated just now
"is_eligible_search" "is_ads_eligible" "item_id" "group_id" "listing_has_variations" "title" "description" "url" "image_url" "price" "availability" "gtin" "brand" "variant_dict" "seller_name" "target_countries"
"true" "false" "SKU-2048-M" "8812345678901" "true" "Linen shirt Sand - M" "Breathable linen shirt with a relaxed regular fit." "https://shop.example/products/linen-shirt-sand?variant=46012345678901" "https://cdn.shop.example/img/linen-shirt-sand.jpg" "59.00 USD" "out_of_stock" "8594000123453" "Nordlin" "{ ""Size"": ""M"" }" "Shop Example" "US"
Productis_​eligible_​searchis_​ads_​eligible
SKU-2048-M
SKU-3110-01
SKU-5502-42
SKU-6120-28
SKU-7004
4discoverable in answers
2eligible for sponsored placements
Eligibility flags

Two booleans decide where ChatGPT shows your products.

Every row carries is_eligible_search and is_ads_eligible as lowercase true/false: the first puts the product into ChatGPT's shopping answers, the second into sponsored placements. The flags are set per product in Feedflock. The feed simply reports them.

Feed health

Catch feed issues before ChatGPT does.

Before every generation Feedflock checks that every field the channel requires is filled, and, on templates verified against the channel's own spec, that the values fit its rules. Most problems are fixed with one click, without editing products in Shopify.

Feed quality · chatgpt.csv
74 / 100
To review: 4
availability “preorder” on 5 productsOpenAI spells it pre_order, with an underscore. An unrecognized availability doesn't just lose the value, it rejects the whole row.
GTIN with 10 or 11 digits on 7 productsOpenAI takes exactly 8, 12, 13 or 14 digits. Shopify's barcode field is free text, so internal codes slip in.
Empty brand on 6 productsbrand is one of the nine required fields, and the spec asks for a real brand, not a placeholder. The Shopify vendor is blank.
Titles over 150 characters on 4 productsOpenAI asks for concise titles of at most 150 characters, including the selected variant.

Setup

Live in five steps

From a bare Shopify store to a listed offer: the whole setup fits into one coffee break.

  1. Apply as a ChatGPT merchant

    Apply at chatgpt.com/merchants. Product feeds are open to approved partners. After approval OpenAI provisions your SFTP credentials; markets beyond the US and Ads processing need their own setup.

  2. Install Feedflock

    Add Feedflock from the Shopify App Store. It reads your products, variants, stock and images directly through the Shopify API.

  3. Pick the ChatGPT Shopping template

    Create a new feed and choose ChatGPT Shopping. All nine required fields are mapped for you, seller_name included: it comes from your Shopify store name, and you can override it if your trading name differs.

  4. Check variants and identifiers

    Variants go out as one row each, with a shared group_id and a variant_dict of the selected options. gtin comes from the Shopify barcode; mpn defaults to your SKU, so switch it off if your SKUs aren't the manufacturer's part numbers.

  5. Push the feed to OpenAI

    Schedule a small script that downloads the feed's stable URL, gzips it as .tsv.gz and overwrites the same file in OpenAI's SFTP root, at least once a day. Feedflock regenerates the file every hour; to put only some products into ChatGPT ads, tag them chatgpt-ads in Shopify.

    https://feedflock.appfleece.com/f/demo-chatgpt/chatgpt.csv

The feed

What the channel receives

chatgpt.csv
"is_eligible_search"	"is_ads_eligible"	"item_id"	"group_id"	"listing_has_variations"	"title"	"description"	"url"	"image_url"	"price"	"availability"	"gtin"	"brand"	"variant_dict"	"seller_name"	"target_countries"
"true"	"false"	"SKU-2048-M"	"8812345678901"	"true"	"Linen shirt Sand - M"	"Breathable linen shirt with a relaxed regular fit."	"https://shop.example/products/linen-shirt-sand?variant=46012345678901"	"https://cdn.shop.example/img/linen-shirt-sand.jpg"	"59.00 USD"	"in_stock"	"8594000123453"	"Nordlin"	"{ ""Size"": ""M"" }"	"Shop Example"	"US"
Live preview
Linen shirt Sand

Nordlin

Linen shirt Sand

$59

Feed fields

is_eligible_search

true

is_ads_eligible

false

item_id

SKU-2048-M

group_id

8812345678901

listing_has_variations

true

title

Linen shirt Sand - M

description

Breathable linen shirt with a relaxed regular fit.

url

https://shop.example/products/linen-shirt-sand?variant=46012345678901

price

59.00 USD

availability

in_stock

gtin

8594000123453

brand

Nordlin

variant_dict

{ "Size": "M" }

seller_name

Shop Example

target_countries

US

The channel

Shopping questions, answered

Products surface inside the conversation, and what ChatGPT can say about them comes from your feed: titles, descriptions, variants, prices and stock. Factual descriptions that answer a shopper's questions are what the model reads.

Discovery and ads from one feed

The same product data powers organic discovery and ChatGPT ads. is_ads_eligible opts a product into Ads processing independently of search, so you can advertise some products and keep the rest organic.

No category tree to fight

OpenAI names no taxonomy: product_category is your own path, broad to specific. Nothing gets rejected for being off-tree, and Feedflock can still send Google's path if you have it mapped.

The feed

  • The ChatGPT Shopping template maps all nine required fields (item_id, title, description, url, brand, seller_name, image_url, availability and price), with seller_name taken from your Shopify store name
  • OpenAI's canonical column names, one row per variant, UTF-8. A simple script gzips it to tsv.gz for the push
  • Prices go out as amount + space + ISO 4217 (59.00 USD); a compare-at price becomes price plus sale_price, and a sale that isn't strictly lower is left out
  • Availability from Shopify's stock status as in_stock or out_of_stock, never a Google spelling: the one field whose bad value rejects the row
  • Variants ship as one row each, with a shared group_id, listing_has_variations and a variant_dict of the selected options; url opens the product page with that variant selected
  • Ads eligibility per product: is_ads_eligible is false by default and switches on for the whole feed or for products tagged chatgpt-ads
  • Every generation is checked against OpenAI's spec (enum values, money format, GTIN lengths, title and description limits), and empty required columns are listed before you push
  • Regenerated every hour at a stable URL, so the daily push to OpenAI's SFTP always ships a current full snapshot

Deep dive

01

Nine fields, one row per variant

  • Required: item_id, title, description, url, brand, seller_name, image_url, availability, price
  • Titles at most 150 characters, descriptions plain text up to 5,000
  • Parquet preferred; jsonl.gz, csv.gz and tsv.gz also accepted
  • No placeholder strings: an optional field you don't know is left empty
Technical details

The OpenAI product feed is one row per purchasable item or variant, with nine required fields: item_id, title, description, url, brand, seller_name, image_url, availability and price. Titles stay at or under 150 characters and descriptions are plain text up to 5,000: factual copy that answers the questions a shopper would ask, because that is what the model reads.

OpenAI prefers parquet and also accepts jsonl.gz, csv.gz and tsv.gz, all UTF-8 with absolute, publicly reachable URLs. Feedflock renders the tab-delimited form with OpenAI's canonical column names. Unknown optional values stay empty, since the spec rules out placeholders like n/a or unknown, and an empty cell is never read as zero or false.

02

Identifiers and variants

  • item_id is stable and unique: never reuse it for a different item
  • Variants share a group_id, set listing_has_variations and name their options in variant_dict
  • GTIN is exactly 8, 12, 13 or 14 digits with a valid check digit, leading zeros kept
  • mpn is the manufacturer's part number, sent together with brand
Technical details

An item_id is a promise: stable, unique per item or variant, and never reused for a different product. OpenAI matches products by item_id, not by file name, and keeps it through price, stock, title and image changes. Feedflock uses the variant SKU and falls back to the variant ID when a SKU is missing.

Variants of one product go out as separate rows sharing a group_id that differs from every item_id, with listing_has_variations set and a variant_dict naming the selected options, as serialized JSON in the cell, as the spec requires. Each row carries its own price, availability, URL and image. Where the manufacturer assigns a GTIN, send it: exactly 8, 12, 13 or 14 digits with a valid check digit, no spaces or dashes.

03

Ads and checkout in ChatGPT

  • is_ads_eligible: true opts a product into Ads processing; false opts it out
  • Ads eligibility is independent of search discovery: you control them separately
  • Checkout inside ChatGPT is a separate integration; the template ships discovery-only
  • Catalogs for Ads also arrive by SFTP, set up in OpenAI's Ads Manager
Technical details

ChatGPT ads build on the same product feed. A row opts into Ads processing with is_ads_eligible: true, independently of search eligibility, so you can advertise a product without changing how it surfaces in organic answers, or keep it discoverable without advertising it. In Feedflock the flag is false by default; set it for the whole feed or per product, for example true only on products tagged chatgpt-ads in Shopify.

Checkout inside ChatGPT needs its own integration with OpenAI; an eligibility flag alone does not complete it. The template therefore sends is_eligible_checkout as false, so buyers land on your store. If OpenAI enables checkout for you, it also needs seller_privacy_policy and seller_tos, which Feedflock can derive from your Shopify policy pages.

04

Push delivery, prices and markets

  • OpenAI never polls a merchant URL: you push a full snapshot via SFTP, at least daily
  • Keep one stable file name and overwrite it; there is no completion marker
  • A product missing from a snapshot lingers up to 14 days: retire it now with is_eligible_search: false
  • Standard uploads target the US; Canada and Mexico need market setup
Technical details

Delivery is push, not pull: OpenAI provisions an SFTP endpoint during onboarding and your pipeline uploads a complete catalog export: a full snapshot treated as the source of truth, at least once a day, under a stable file name overwritten in place. There is no completion marker: once uploads stop changing, OpenAI processes every file in the SFTP root. Feedflock's part is the file itself, regenerated hourly at a stable URL, so a cron script that downloads and pushes it always ships current prices and stock.

A product missing from a processed snapshot is kept for up to 14 days, so one broken upload never empties your catalog. And to retire an item immediately, set is_eligible_search to false. Money is written as amount, space, ISO 4217 code (79.99 USD), and a sale_price counts only when it is positive, strictly below price and in the same currency. A standard upload targets the US; a currency or product URL on its own doesn't select another market.

The takeaway

One stable URL, an hourly refresh and a file that follows OpenAI's spec column by column, ready for your push pipeline to ship to ChatGPT every day. Your Shopify catalog stays the single source of truth, in discovery and in ads.

Claude · ChatGPT

Or set up your ChatGPT feed in chat

Connect Feedflock to Claude or ChatGPT and ask. It creates the feed as a draft, maps your categories to ChatGPT's own tree and tells you what is still missing. You approve every change.

feedflock · mcp

Create a ChatGPT feed for my store and map my categories.

I'll create it as a draft and show you each change before I make it.

FAQ

You push it: OpenAI does not fetch merchant-hosted URLs. During onboarding OpenAI provisions SFTP credentials, and your pipeline uploads a full snapshot at least daily under a stable file name. Feedflock regenerates the file every hour at a stable URL, so a small cron script (download, gzip, push to SFTP) keeps ChatGPT current. For changes during the day, OpenAI also offers an API.
For most stores, yes: Shopify catalogs reach ChatGPT through Shopify's own integration, so check that first. A dedicated feed is for merchants onboarded with OpenAI directly, and it puts the controls in your hands: which products go in, the full variant structure, per-product ads eligibility and how often it refreshes.
OpenAI also reads a Google-compatible profile with Google's column names. On that path, though, the per-item is_eligible_search flag doesn't opt products out and seller_name comes from your registered merchant name. The Feedflock template writes the OpenAI format natively, with every control available.
Keep the row in the feed with availability out_of_stock. An empty or unrecognized availability value rejects the entire row, and unknown does not assert that the item is in stock.
Through your Ads onboarding with OpenAI. In the OpenAI format each row carries is_ads_eligible: true opts the product in, false opts it out, and an empty value falls back to any feed-level Ads default. Ads processing is independent of search discovery.
Only with a checkout integration OpenAI enables separately. A feed flag alone doesn't do it. The template ships discovery-only, with is_eligible_checkout set to false, so shoppers buy on your store.
A standard OpenAI-format upload targets the US. Canada and Mexico follow once OpenAI confirms market setup for your feed. A currency or product URL on its own does not select a market.

Get on every marketplace that matters this afternoon.

Install free, connect your first feed in minutes, and let Feedflock keep it fresh and validated.

.myshopify.com