Key Takeaways
- ChatGPT Ads Manager runs product-feed campaigns, but it rejects Google Merchant Center XML in every delivery method.
- In our test on a live merchant feed, plain .jsonl was fetched and still refused, while the same content as .jsonl.gz was accepted on the first try.
- is_ads_eligible defaults to false. A feed without it can connect cleanly and still have zero products allowed in ads.
- Manual CSV/TXT uploads expire after 14 days, so a hosted feed URL is the practical choice for a standing campaign.
- Send the whole live catalog, not only the products you have finished reviewing, or the ads catalog ends up nearly empty.
If you already run Google Shopping or Performance Max, ChatGPT Ads will feel familiar. OpenAI’s Ads Manager now runs product-feed campaigns: you connect a catalog, and ChatGPT can show your products as sponsored placements inside shopping conversations. For ecommerce teams, the feed is the part that matters, since that’s what the ad gets built from.
What surprised us is how little of a Google feed carries over. A ChatGPT Ads product feed has its own file format and its own field names, one default works against you, and a couple of the failures come back with no useful error. We learned this on 5 October 2026 while connecting a live merchant feed to Ads Manager. Below is what we ran into, roughly in the order you’ll hit it.
Three ways to add a ChatGPT Ads product feed
Ads Manager gives you three ways to get products in.
Upload a CSV or TXT file
Fastest way to start, and a bad way to keep going. Items from a manual upload expire after 14 days. A standing campaign built on uploads means someone re-uploads the catalog every two weeks, and the one time they forget, the products drop out.
Connect a hosted URL
You give Ads Manager an HTTPS address and OpenAI fetches the catalog from it on its own schedule. You paste it once. As long as the file behind the URL stays current, so does the feed.
Set up an SFTP connection
Server-to-server pushes. It works, but someone technical has to build and maintain it.
For most stores the hosted URL wins: it doesn’t expire, and you don’t need an engineer. The rest of this guide assumes that route.
Why your Google Merchant Center feed gets rejected
The first thing nearly everyone tries is pasting the Merchant Center feed URL they already have. It gets rejected. OpenAI doesn’t accept XML in any delivery method, so the RSS feed that has run your Google Shopping campaigns for years is the wrong shape here.
The field names are different too. OpenAI’s spec comes from the Agentic Commerce Protocol (the standard OpenAI and Stripe built for shopping in ChatGPT), and it says item_id where Google says id, url where Google says link, image_url where Google says image_link. Values have their own format as well. Price is written as "79.99 USD", and availability has to be one of OpenAI’s allowed values rather than whatever your store platform exports.
In practice you’re producing a second file from the same catalog. We went through the general format differences in AI Shopping Feed Formats. ChatGPT Ads adds a few more on top.
Plain .jsonl failed. The .jsonl.gz version worked
This one cost us the most time. OpenAI’s spec is built around JSONL (one product per line, each line a JSON object), so we served the catalog as a plain .jsonl file. OpenAI fetched the whole file without trouble. Twice. Ads Manager still wouldn’t save the feed.
Then we served exactly the same content gzip-compressed, as .jsonl.gz, and Ads Manager accepted it on the first try.
Nothing on screen pointed at compression. The fetch worked, the content was valid, and the save failed anyway. If you’re building this file yourself and Ads Manager keeps refusing a feed that looks right, compress it before you debug anything else.
The 9 required fields in a ChatGPT Ads product feed
OpenAI requires nine fields on every product:
item_idtitledescriptionurlbrandseller_nameimage_urlavailabilityprice
The optional fields are where ChatGPT gets enough to match a product to an actual question: sale_price, gtin, mpn, condition, product_category, color, size, material, gender, age_group, extra images, star rating, review count and Q&A. Fill the ones you have real data for and leave the rest out.
Identifiers deserve a separate word. Use the GTIN the manufacturer or GS1 assigned. If a product has no GTIN on record, leave the field empty. A made-up code belongs to someone else’s product, or to nothing, and either way it’s a policy problem. For the field-by-field reasoning, ChatGPT Product Feed Requirements goes deeper.
is_ads_eligible: the silent false
If one setting is going to sink a campaign without anyone noticing, it’s this one.
Besides the nine required fields, OpenAI uses a per-product field called is_ads_eligible to decide whether a product may appear in sponsored placements. It defaults to false. So a feed that leaves the field out doesn’t get rejected. It gets accepted, looks connected, shows no errors, and every product in it is ineligible for ads.
A ChatGPT Ads feed can be connected, error-free and complete, and still have zero products allowed to run. The default is false, and nothing on screen tells you.
Once you know, the fix is easy. Write is_ads_eligible on every row, explicitly: true for products you want in ads, false for the ones you don’t. Low-margin items, low stock, anything you’d rather not promote. You want those to be off because you chose it, not because of a default you never saw.
Don’t let a review queue empty your catalog
This one is easy to walk into if you clean up products before they go into the feed. Say your export only includes products that have been through your optimization or review process, and most of the catalog is still waiting. The ads catalog ends up nearly empty, and you’re running ChatGPT Ads on a sliver of what you sell.
We’d put every live product in the ads feed. Products you’ve already improved go in with the better title and description, and the rest go in with their current Merchant Center data, unchanged. As you work through the queue, products improve in place. Nobody waits for the last one.
ChatGPT Ads feed vs ChatGPT Shopping feed
These are two different feeds, and they’re easy to mix up.
| ChatGPT Ads feed | ChatGPT Shopping feed | |
|---|---|---|
| Purpose | Sponsored placements, run from Ads Manager | Organic product discovery in ChatGPT |
| Paid? | Yes, you run and fund the campaign | No, OpenAI says organic results are not ads |
| Ads control | is_ads_eligible per product | Not used |
If you’re after the organic side, start with ChatGPT Shopping Visibility. For why feed quality decides whether ads run at all, read ChatGPT Product Feed Ads: What Decides If You Show Up. OpenAI’s own field reference is in its product feed spec.
ChatGPT Ads ecommerce setup checklist
Before you connect a feed:
- Use a hosted URL, not a manual upload, so products don’t expire after 14 days.
- Serve
.jsonl.gz. Not XML, and not uncompressed JSONL. - Put all nine required fields on every row, in OpenAI’s names rather than Google’s.
- Write price as amount plus currency (
"79.99 USD") and map availability to OpenAI’s allowed values. - Write
is_ads_eligibleexplicitly on every row instead of trusting the default. - Include the whole live catalog, not only the products you’ve finished reviewing.
- Leave out products with no usable price instead of sending them broken.
- Keep price and stock in the file in step with your store. That’s the reason to use a URL in the first place.
Then in Ads Manager, open Feeds → Connect a feed by URL, paste the address and save.
Conclusion
ChatGPT Ads gives ecommerce brands a second feed-driven ad channel next to Google Shopping, and most of what you know about feeds still holds. The specifics are where people get stuck: no XML, a compressed JSONL file, OpenAI’s field names, and a default that quietly turns every product off.
The checklist above is enough to build the file yourself. If you’d rather skip that, UCP Radar now builds it from the Merchant Center feed you’ve already connected. Each feed gets one hosted chatgpt-ads.jsonl.gz URL that you paste into Ads Manager once. Products you’ve approved carry their optimized titles and descriptions, the rest carry their Merchant Center values, and is_ads_eligible is on every row. A per-product switch keeps anything you don’t want advertised out of ads, and it stays off after the next re-sync. You still run the campaign in Ads Manager. We just keep the file right.
Frequently Asked Questions
Not directly. OpenAI does not accept XML in any delivery method, so pasting your Merchant Center feed URL into ChatGPT Ads Manager gets rejected. You need a separate file built from the same catalog, in OpenAI's format and field names, such as item_id instead of id and image_url instead of image_link.
In our test on a live merchant feed on 5 October 2026, a gzip-compressed JSONL file (.jsonl.gz) was accepted on the first try. The same content served as plain .jsonl was fetched successfully twice and still would not save, and a Google Merchant Center XML feed was rejected.
It is OpenAI's per-product field that decides whether a product may appear in sponsored placements. It defaults to false, so a feed that leaves it out can connect without errors and still have no products eligible for ads. Write it explicitly on every row.
Items added through a manual CSV or TXT upload expire after 14 days. That works for a quick test, but a standing campaign needs a hosted URL or an SFTP connection so the catalog stays live without re-uploading.
No. The ChatGPT Ads feed powers paid, sponsored placements that you run from Ads Manager and uses the is_ads_eligible field. ChatGPT Shopping is the organic product discovery side, and OpenAI states those organic results are not ads.