# What Is a Product Feed and How Does It Work?

> What a product feed is, which fields it carries, how Google Merchant Center and ChatGPT receive it and why it has to match the published product page.

URL: https://clione.ai/glossary/product-feed/
Lang: en

Here _feed_ is not a blog's RSS channel or a social network's wall: it is **the list of your products, with their data, in the format another platform asks for**. Google now calls it a product data source. It matters because it is the route by which your products reach places that do not read your store page by page, or that do not trust only what they read. Google says so in its guide to its AI features: generative answers can include product listings and information, and **[Merchant Center](/glossary/google-merchant-center/) feeds help your products show up in those answers and in the rest of Search results**.[^google-ai-guide]

## How it works

**What it carries.** One row for every item that can be bought and one column for every piece of data. OpenAI asks for one row per item or variant and nine required fields so ChatGPT can discover the product: ID, title, description, [product page](/glossary/product-page/) URL, brand, seller name, image, availability and price.[^openai-feed-spec] The [Google Merchant Center](/glossary/google-merchant-center/) specification asks for a similar base, with its own names and limits: the title, for example, can run up to 150 characters.[^gmc-spec] On top of that base go the [product attributes](/glossary/product-attributes/) each destination accepts, such as color, size or material.

**How variants are grouped.** Each [product variant](/glossary/product-variants/) is a row with its own ID, and all the variants of one product share a group ID. OpenAI explains it this way: each row carries its own price, availability, URL and images, and the group ID has to be different from the ID of every item.[^openai-feed-spec] In Merchant Center, the group ID is required for variants in free listings.[^gmc-spec]

**How it is delivered.** Google accepts three kinds of source: a file, uploaded by hand or by SFTP, a Google Sheets spreadsheet or the Merchant API.[^gmc-data-source] OpenAI takes the full catalog over SFTP, as compressed Parquet, JSONL, CSV or TSV, **and recommends sending it at least once a day**. A product that disappears from an upload is not deleted right away: OpenAI keeps its last record for up to 14 days, so a late file does not empty the catalog.[^openai-feed-upload]

**Primary and supplemental.** In Merchant Center, the primary source is the only one that can add or remove products. A supplemental source supplies data the primary one is missing or updates what it has, but it cannot create or delete products or work on its own.[^gmc-data-source] It is how you fill gaps in a catalog without touching the platform connection.

**What to do with what you don't know.** OpenAI asks you to omit an unknown value and not fill it with text such as `null`, `unknown` or `n/a`: an empty field does not mean zero or "no".[^openai-feed-spec] A made-up value to get the row past validation is worse than a gap.

## In a store

**Fictional example.** The black variant of a backpack, as Merchant Center and OpenAI ask for it. The data is the same; the field names and some of the rules change.

| Data                     | Merchant Center                                       | ChatGPT (OpenAI)                                                  |
| ------------------------ | ----------------------------------------------------- | ----------------------------------------------------------------- |
| Item ID                  | `id`                                                  | `item_id`                                                         |
| Variant group ID         | `item_group_id`                                       | `group_id`                                                        |
| Title                    | `title`, with Google's length limit                   | `title`, with the variant if needed                               |
| Link to the product page | `link`                                                | `url`, with the selected variant where possible                   |
| Main image               | `image_link`                                          | `image_url`                                                       |
| Availability             | `in_stock`, `out_of_stock`, `preorder` or `backorder` | `in_stock`, `out_of_stock`, `pre_order`, `backorder` or `unknown` |
| Price                    | `price`, amount and ISO 4217 currency code            | `price`, the regular price in currency units                      |

Look at availability: the fallback value is written differently in each specification, and OpenAI allows an explicit `unknown` that Google does not have.[^gmc-spec][^openai-feed-spec] **One catalog needs one translation per destination**, and that is where data gets lost: an attribute with no column in the export template does not make it through. Clione, for example, generates a feed from the enriched catalog, uploads it every day to the SFTP account OpenAI gives the store for ChatGPT and creates a supplemental feed for Merchant Center; whether the products appear, and where, is up to each platform.


That the feed is a place to write what the product page does not say: a longer title, a sale price, a "free shipping" in the description. Google asks for the opposite. The title and description have to describe the product and match those on the landing page, with no promotional text, and **the [price and availability](/glossary/price-and-availability/) have to match the page, the checkout and the [structured data](/glossary/structured-data/)**.[^gmc-spec]


## How to check it

1. **List your feeds**: which destination each one goes to, how it is generated and, in Merchant Center, which source is primary and which are supplemental.[^gmc-data-source]
2. **Download the file that is actually sent** and count its rows against the items in your catalog, variants included. The missing ones are the first finding.
3. **Pick five products and compare them with their published page**: title, [price and availability](/glossary/price-and-availability/) have to match.[^gmc-spec]
4. **Look for filler values** such as "n/a", "unknown" or "0" in the optional fields, and delete them: what is unknown is omitted.[^openai-feed-spec]
5. **Check the date of the last processed upload** at each destination. If it is days old, the feed is not updating.[^openai-feed-upload]

## Related concept: structured data

A feed and [structured data](/glossary/structured-data/) say the same thing, what the product is and what it costs, by two different routes: you send the feed to each platform, and the search engine reads the markup when it crawls the [product page](/glossary/product-page/). Google recommends using both, because that makes you eligible for more experiences and helps it understand and verify your data, and **some experiences combine the two sources**: a product snippet can take the price from the feed if it is not in the markup.[^google-product-sd] That is why a correct feed does not make up for markup that says something else, or the other way around. Both come from the same [product catalog](/glossary/product-catalog/), and that is where they get fixed.

To go further, the [catalog and entities reading path](/learn/catalog-and-entities/) orders the rest of the terms, and the [ChatGPT product feed](/glossary/chatgpt-product-feed/) term goes into the detail of OpenAI's destination.
