# Meta vs OpenAI: feed requirements compared

A Meta catalogue feed and an OpenAI product feed describe the same catalogue in incompatible shapes. Five core fields are renamed, price carries its currency inside the value, variants are rebuilt around group_id and variant_dict, and the file is pushed over SFTP instead of fetched.

- **Canonical URL:** https://www.feedlab.io/knowledge/compare/meta-vs-openai
- **Last reviewed:** 18 September 2026
- **Source:** feedlab knowledge base
- **Licence:** free to quote and cite with attribution to feedlab


## Short answer

There is no shortcut from Meta to OpenAI. The values you send are largely the same, but the field names, the price format, the variant structure and the delivery mechanism all differ, and OpenAI requires seller_name, which no product field anywhere holds. Plan it as a second feed built from the same mapping.

## Attributes treated differently

| Attribute | Meta | OpenAI |
| --- | --- | --- |
| `brand` | Recommended | Required |
| `condition` | Required | Optional |
| `custom_label_0` | Optional (`custom_label_0`) | Optional (`ads_metadata`) |
| `google_product_category` | Not supported | Optional |
| `gtin` | Recommended | Optional |
| `id` | Required (`id`) | Required (`item_id`) |
| `image_link` | Required (`image_link`) | Required (`image_url`) |
| `item_group_id` | Required in some cases (`item_group_id`) | Optional (`group_id`) |
| `link` | Required (`link`) | Required (`url`) |

## Every attribute, side by side

| Attribute | Meta | OpenAI |
| --- | --- | --- |
| `availability` | Required | Required |
| `brand` | Recommended | Required |
| `condition` | Required | Optional |
| `custom_label_0` | Optional | Optional |
| `description` | Required | Required |
| `google_product_category` | Not supported | Optional |
| `gtin` | Recommended | Optional |
| `id` | Required | Required |
| `identifier_exists` | Not documented here | Not supported |
| `image_link` | Required | Required |
| `item_group_id` | Required in some cases | Optional |
| `link` | Required | Required |
| `mpn` | Optional | Optional |
| `price` | Required | Required |
| `sale_price` | Optional | Optional |
| `title` | Required | Required |


## Differences a table cannot show

### Delivery is a push, not a fetch

Meta fetches a URL you host, as often as hourly, and can also take pushed updates through the Catalog Batch API. OpenAI issues an SFTP endpoint and expects full catalogue snapshots pushed to it at least daily. The difference is not cadence but direction, and it means adding a delivery step rather than changing a setting.

### Five core fields change name

id becomes item_id, link becomes url, image_link becomes image_url, item_group_id becomes group_id and custom labels move into ads_metadata. Meta and OpenAI both accept a product category, but Meta ignores the Google taxonomy attribute while OpenAI takes product_category, so that field appears on one side only.

### Price includes the currency

Meta accepts an amount with a separate currency, following the Google convention. OpenAI wants a decimal amount, a space and an uppercase ISO 4217 code in one string, so "79.99 USD". Shopify stores the two apart, which makes this a generation-time join rather than a mapping.

### Variants are described rather than grouped

Meta groups variant rows with item_group_id and builds its picker from that alone. OpenAI wants group_id, a listing_has_variations flag and a variant_dict mapping option names to values, so the feed says what varies rather than only that something does. That is new structure, not a renamed column.

### condition matters on Meta and barely registers on OpenAI

Meta requires condition on every item. OpenAI treats it as optional. Meanwhile OpenAI requires brand, which Meta only recommends, so the two channels are strict about entirely different things.

### seller_name has no Shopify equivalent

OpenAI requires the selling merchant's name on every item. Nothing on a Shopify product carries it, and vendor is the wrong field because it describes the manufacturer. It has to be a static value set once for the store.




## Reusing one feed for the other channel

1. **Build the SFTP delivery before the mapping** — Prove you can land a snapshot on the endpoint on a schedule. Everything else is familiar work; this is the part with no equivalent in a Meta setup.
2. **Rename the five shared fields at publish time** — Keep one internal representation of each value and render channel-specific names when the file is generated. Maintaining two parallel mappings is how the two feeds start disagreeing about the same product.
3. **Join amount and currency into one price string** — Format as decimal amount, space, uppercase ISO code, and apply the same rule to any sale price. Watch zero-decimal currencies and thousands separators, which are the two ways this quietly goes wrong.
4. **Rebuild variants around group_id and variant_dict** — Map group_id from the Shopify product id, set listing_has_variations where a product has more than one variant, and build variant_dict from the option names and values Shopify already stores. The Meta item_group_id mapping gives you the grouping but none of the description.
5. **Add brand coverage and seller_name** — Brand is only recommended on Meta, so a catalogue fed to Meta alone often has patchy brand data. OpenAI requires it. Audit coverage, then set seller_name as a static store-level value rather than deriving it from a product field.







## Frequently asked questions

### Can I send my Meta catalogue feed to OpenAI?

No. Five core attributes are named differently, price has to carry its currency code inside the value, variants need group_id with listing_has_variations and variant_dict, seller_name is required, and the file is pushed over SFTP rather than fetched.

### Does OpenAI require brand?

Yes, where Meta only recommends it. A catalogue that has only ever fed Meta often has incomplete brand data, so it is worth auditing coverage before building the feed rather than discovering it in the rejection report.

### How are variants handled in an OpenAI product feed?

With group_id to tie the variants together, a listing_has_variations flag, and a variant_dict that maps each option name to its value. Meta's item_group_id provides the grouping but nothing that describes what actually varies.

### How often should an OpenAI feed be pushed?

At least daily, on a predictable cadence. The most recently processed snapshot is retained for up to 14 days, so a pipeline that stops pushing ages out of the catalogue rather than simply going stale.




## Primary sources

- [Meta: Product catalogue data feed reference](https://www.facebook.com/business/help/120325381656392)
- [OpenAI: Product feed required fields](https://developers.openai.com/commerce/specs/file-upload/products)



