
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.

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.
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.
Setup
Live in five steps
From a bare Shopify store to a listed offer: the whole setup fits into one coffee break.
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.
Install Feedflock
Add Feedflock from the Shopify App Store. It reads your products, variants, stock and images directly through the Shopify API.
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.
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.
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
"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"

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
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.
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
GTINis 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.
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.
Push delivery, prices and markets
- OpenAI never polls a merchant
URL: you push a full snapshot viaSFTP, 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.
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
Get on every marketplace that matters this afternoon.
Install free, connect your first feed in minutes, and let Feedflock keep it fresh and validated.