ChatGPT Ads Product Feed Generator

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 attributeLevelGoogle Shopping equivalentNotes
item_idRequiredidUnique identifier for the variant. Must be stable between uploads.
titleRequiredtitleProduct name as a shopper would recognise it.
brandRequiredbrandManufacturer or brand name.
descriptionRequireddescriptionPlain text. HTML is not accepted.
urlRequiredlinkLink to the product page.
image_urlRequiredimage_linkMain image. Must be a reachable http or https URL.
priceRequiredpricePrice with an ISO 4217 currency code.
availabilityRequiredavailabilityin_stock, out_of_stock or pre_order.
seller_nameRequiredno equivalentMerchant name. Must match the name on the ad account.
target_countriesRequiredno equivalentISO 3166 alpha 2. Only the first entry is used.
is_eligible_searchRequiredno equivalentWhether the product may appear in ChatGPT search.
is_eligible_checkoutRequiredno equivalentWhether the product may be bought inside ChatGPT.
is_ads_eligibleRequiredno equivalentWhether 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:

  1. Availability values change. Google writes in stock with a space; OpenAI wants in_stock. preorder becomes pre_order, and then availability_date becomes required.
  2. Prices need a currency code. Every price must carry an ISO 4217 code, for example 89.00 EUR.
  3. The eligibility flags must be added. is_eligible_search, is_eligible_checkout and is_ads_eligible are required and have no Google counterpart.
  4. Seller and country must be added. seller_name has to match the name registered on the ad account. target_countries is 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 the shipping attribute, which is formatted country:region:service:price.

How to convert a Shopify product export

A Shopify export needs repair before mapping, because of how Shopify writes variants:

  1. 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.
  2. Drop image only rows. Extra images appear as rows with nothing but an image, and they are not products.
  3. Flatten the HTML. Body (HTML) contains markup; description must be plain text.
  4. 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, because url is 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 attributeLevelGoogle Shopping equivalentNotes
item_idRequiredidUnique identifier for the variant. Must be stable between uploads.
titleRequiredtitleProduct name as a shopper would recognise it.
brandRequiredbrandManufacturer or brand name.
gtinRecommendedgtinEAN, UPC or ISBN. Strongly improves matching.
mpnRecommendedmpnManufacturer part number.
conditionRecommendedconditionnew, refurbished or used.
descriptionRequireddescriptionPlain text. HTML is not accepted.
urlRequiredlinkLink to the product page.
image_urlRequiredimage_linkMain image. Must be a reachable http or https URL.
additional_image_urlsRecommendedadditional_image_linkFurther images, comma separated.
product_categoryRecommendedgoogle_product_categoryGoogle product taxonomy category.
materialOptionalmaterialPrimary material.
video_urlOptionalvideo_linkProduct video.
priceRequiredpricePrice with an ISO 4217 currency code.
sale_priceRecommendedsale_priceDiscounted price, when one applies.
availabilityRequiredavailabilityin_stock, out_of_stock or pre_order.
availability_dateRecommendedavailability_dateRequired when availability is pre_order.
expiration_dateOptionalexpiration_dateWhen the offer stops being valid.
group_idRecommendeditem_group_idGroups variants of the same product together.
item_group_titleOptionalitem_group_titleTitle of the parent product.
colorOptionalcolorColour option.
sizeOptionalsizeSize option.
size_systemOptionalsize_systemSizing standard, for example EU or US.
genderOptionalgendermale, female or unisex.
age_groupOptionalage_groupadult, kids, infant and so on.
custom_label_0Optionalcustom_label_0Custom grouping label. Google lane only.
custom_label_1Optionalcustom_label_1Custom grouping label. Google lane only.
custom_label_2Optionalcustom_label_2Custom grouping label. Google lane only.
custom_label_3Optionalcustom_label_3Custom grouping label. Google lane only.
custom_label_4Optionalcustom_label_4Custom 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 attributeLevelGoogle Shopping equivalentNotes
listing_has_variationsRecommendedno equivalenttrue when the product has more than one variant.
variant_dictRecommendedno equivalentOption names and values as a map, for example colour and size.
seller_nameRequiredno equivalentMerchant name. Must match the name on the ad account.
target_countriesRequiredno equivalentISO 3166 alpha 2. Only the first entry is used.
seller_urlOptionalno equivalentMerchant storefront URL.
accepts_returnsOptionalno equivalentWhether returns are accepted.
return_deadline_in_daysOptionalno equivalentReturn window length.
return_policyOptionalno equivalentLink to the returns policy.
is_eligible_searchRequiredno equivalentWhether the product may appear in ChatGPT search.
is_eligible_checkoutRequiredno equivalentWhether the product may be bought inside ChatGPT.
is_ads_eligibleRequiredno equivalentWhether 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.