Guide
How to create a ChatGPT Ads product feed
The OpenAI product feed is a tab delimited .txt file in UTF-8, one row
per variant, with 13 required attributes. If you already have a Google
Shopping feed, 30 of the 41 attributes are a straight rename,
and 11 have no Google equivalent at all and must be added.
What is a ChatGPT Ads product feed?
A ChatGPT Ads product feed is the file OpenAI Ads Manager reads to learn what you sell.
It is tab delimited, saved as .txt, encoded in UTF-8, with
a header row of attribute names and one row per variant rather than per
product. It is not a CSV and it is not XML, which is the first thing that trips people
up when they try to reuse a Google Shopping file directly.
Manually uploaded items expire after 14 days. For a catalogue that changes, point Ads Manager at a hosted URL or an SFTP feed instead of re-uploading.
The 13 required fields
A row missing any of these is rejected. Three of them exist nowhere in a Google Shopping or Shopify export, so they always have to be supplied by whatever does the conversion.
| OpenAI attribute | Level | Google Shopping equivalent | Notes |
|---|---|---|---|
item_id | Required | id | Unique identifier for the variant. Must be stable between uploads. |
title | Required | title | Product name as a shopper would recognise it. |
brand | Required | brand | Manufacturer or brand name. |
description | Required | description | Plain text. HTML is not accepted. |
url | Required | link | Link to the product page. |
image_url | Required | image_link | Main image. Must be a reachable http or https URL. |
price | Required | price | Price with an ISO 4217 currency code. |
availability | Required | availability | in_stock, out_of_stock or pre_order. |
seller_name | Required | no equivalent | Merchant name. Must match the name on the ad account. |
target_countries | Required | no equivalent | ISO 3166 alpha 2. Only the first entry is used. |
is_eligible_search | Required | no equivalent | Whether the product may appear in ChatGPT search. |
is_eligible_checkout | Required | no equivalent | Whether the product may be bought inside ChatGPT. |
is_ads_eligible | Required | no equivalent | Whether the product may be used in ads. |
How to convert a Google Merchant Center feed
Most of the work is renaming. Beyond that, four things are genuine conversions rather than a change of label:
- Availability values change. Google writes
in stockwith a space; OpenAI wantsin_stock.preorderbecomespre_order, and thenavailability_datebecomes required. - Prices need a currency code. Every price must carry an ISO 4217
code, for example
89.00 EUR. - The eligibility flags must be added.
is_eligible_search,is_eligible_checkoutandis_ads_eligibleare required and have no Google counterpart. - Seller and country must be added.
seller_namehas to match the name registered on the ad account.target_countriesis required per row, but in Merchant Center the country is feed level configuration, so it is not in the export. It can usually be recovered from theshippingattribute, which is formattedcountry:region:service:price.
How to convert a Shopify product export
A Shopify export needs repair before mapping, because of how Shopify writes variants:
- Fill the blanks back in. Shopify repeats one product across several rows and leaves the product level cells empty after the first row. Those cells have to be carried down before anything else, or every variant after the first loses its title, description and vendor.
- Drop image only rows. Extra images appear as rows with nothing but an image, and they are not products.
- Flatten the HTML.
Body (HTML)contains markup;descriptionmust be plain text. - Build the URL. A Shopify export has no product link, only a
Handle. The URL is your store domain plus/products/plus the handle. Without the domain, every row fails validation, becauseurlis required.
Google Shopping to OpenAI field mapping
30 of the 41 OpenAI attributes have a direct Google Shopping equivalent. This is the complete list.
| OpenAI attribute | Level | Google Shopping equivalent | Notes |
|---|---|---|---|
item_id | Required | id | Unique identifier for the variant. Must be stable between uploads. |
title | Required | title | Product name as a shopper would recognise it. |
brand | Required | brand | Manufacturer or brand name. |
gtin | Recommended | gtin | EAN, UPC or ISBN. Strongly improves matching. |
mpn | Recommended | mpn | Manufacturer part number. |
condition | Recommended | condition | new, refurbished or used. |
description | Required | description | Plain text. HTML is not accepted. |
url | Required | link | Link to the product page. |
image_url | Required | image_link | Main image. Must be a reachable http or https URL. |
additional_image_urls | Recommended | additional_image_link | Further images, comma separated. |
product_category | Recommended | google_product_category | Google product taxonomy category. |
material | Optional | material | Primary material. |
video_url | Optional | video_link | Product video. |
price | Required | price | Price with an ISO 4217 currency code. |
sale_price | Recommended | sale_price | Discounted price, when one applies. |
availability | Required | availability | in_stock, out_of_stock or pre_order. |
availability_date | Recommended | availability_date | Required when availability is pre_order. |
expiration_date | Optional | expiration_date | When the offer stops being valid. |
group_id | Recommended | item_group_id | Groups variants of the same product together. |
item_group_title | Optional | item_group_title | Title of the parent product. |
color | Optional | color | Colour option. |
size | Optional | size | Size option. |
size_system | Optional | size_system | Sizing standard, for example EU or US. |
gender | Optional | gender | male, female or unisex. |
age_group | Optional | age_group | adult, kids, infant and so on. |
custom_label_0 | Optional | custom_label_0 | Custom grouping label. Google lane only. |
custom_label_1 | Optional | custom_label_1 | Custom grouping label. Google lane only. |
custom_label_2 | Optional | custom_label_2 | Custom grouping label. Google lane only. |
custom_label_3 | Optional | custom_label_3 | Custom grouping label. Google lane only. |
custom_label_4 | Optional | custom_label_4 | Custom grouping label. Google lane only. |
The 11 fields Google Shopping does not have
These have no Google equivalent. Five of them are required, which is why a Merchant Center feed can never be uploaded to OpenAI unchanged.
| OpenAI attribute | Level | Google Shopping equivalent | Notes |
|---|---|---|---|
listing_has_variations | Recommended | no equivalent | true when the product has more than one variant. |
variant_dict | Recommended | no equivalent | Option names and values as a map, for example colour and size. |
seller_name | Required | no equivalent | Merchant name. Must match the name on the ad account. |
target_countries | Required | no equivalent | ISO 3166 alpha 2. Only the first entry is used. |
seller_url | Optional | no equivalent | Merchant storefront URL. |
accepts_returns | Optional | no equivalent | Whether returns are accepted. |
return_deadline_in_days | Optional | no equivalent | Return window length. |
return_policy | Optional | no equivalent | Link to the returns policy. |
is_eligible_search | Required | no equivalent | Whether the product may appear in ChatGPT search. |
is_eligible_checkout | Required | no equivalent | Whether the product may be bought inside ChatGPT. |
is_ads_eligible | Required | no equivalent | Whether the product may be used in ads. |
Can one feed target several countries?
No. target_countries accepts a list, but OpenAI's specification states that
only the first entry is used. One feed therefore covers one country. To
advertise the same catalogue in Germany and Austria, convert it twice, once with
DE and once with AT, and upload both files.
Questions
How do I create a ChatGPT shopping feed?
Export your product catalogue from your ecommerce platform, then convert it to the OpenAI product feed format and upload it in OpenAI Ads Manager. The format is a tab delimited .txt file in UTF-8 with one row per variant. It needs 13 required fields, three of which do not exist in a Google Shopping or Shopify export at all: is_eligible_search, is_eligible_checkout and is_ads_eligible.
How do I convert a Google Merchant Center feed to a ChatGPT Ads feed?
Most of the work is renaming. 30 of the OpenAI attributes have a direct Google Shopping equivalent, so id becomes item_id, link becomes url, image_link becomes image_url and item_group_id becomes group_id. Four things are not renames: availability values change from in stock to in_stock, preorder becomes pre_order, prices must carry an ISO 4217 currency code, and the eligibility flags and seller fields have to be added because Google feeds do not contain them.
Why does my Google Shopping feed have no target country?
Because in Google Merchant Center the target country is feed level configuration, not product data, so it is absent from the export. OpenAI requires target_countries on every row. The country is usually recoverable from the shipping attribute, which is formatted country:region:service:price.
What fields does OpenAI require that Google Shopping does not have?
Eleven attributes have no Google equivalent: is_eligible_search, is_eligible_checkout, is_ads_eligible, seller_name, target_countries, seller_url, accepts_returns, return_deadline_in_days, return_policy, listing_has_variations and variant_dict. The three eligibility flags and seller_name plus target_countries are required, so a Google feed can never be uploaded unchanged.
How do I convert a Shopify product export?
A Shopify export repeats one product across several rows and leaves the product level cells blank after the first row, so those cells have to be filled back in before anything else. Image only rows must be dropped, the HTML body flattened to plain text, and each variant becomes one row. Shopify exports also contain no product URL, only a Handle, so the URL is built from your store domain plus /products/ plus the handle.
What format does the OpenAI product feed use?
A tab delimited .txt file encoded in UTF-8, one variant per row, with a header row of attribute names. It is not comma separated and it is not XML.
How long does an uploaded feed stay live?
Manually uploaded items expire after 14 days. For anything recurring, point Ads Manager at a hosted URL or an SFTP feed rather than re-uploading by hand.
Can one feed target several countries?
No. target_countries accepts a list but only the first entry is used, so one feed covers one country. To advertise in Germany and Austria you convert the same catalogue twice, once with DE and once with AT, and upload both.
Do this automatically
The ChatGPT Ads Product Feed Generator performs every step above: detection, mapping, value normalisation, Shopify variant repair, validation and export. It runs entirely in your browser, so your catalogue is never uploaded anywhere. Feeds up to 500 products are free.
Field definitions follow the OpenAI product feed specification. Not affiliated with, endorsed by, or sponsored by OpenAI, Shopify or Google.