# Microsoft Advertising vs OpenAI: feed requirements compared

Microsoft Advertising follows Google's specification closely, so an OpenAI feed differs from it in exactly the ways it differs from Google: six renamed fields, a price string carrying its own currency, a rebuilt variant structure, and delivery by SFTP push rather than a scheduled fetch.

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


## Short answer

The good news is that a Microsoft feed already carries almost every value OpenAI wants, including the taxonomy and the identifier chain. The work is in reshaping rather than sourcing: rename the fields, reformat price, rebuild the variant relationship, add seller_name, and build a push pipeline where you currently publish a URL.

## Attributes treated differently

| Attribute | Microsoft Advertising | OpenAI |
| --- | --- | --- |
| `brand` | Required in some cases | Required |
| `custom_label_0` | Optional (`custom_label_0`) | Optional (`ads_metadata`) |
| `google_product_category` | Recommended (`google_product_category`) | Optional (`product_category`) |
| `gtin` | Required in some cases | Optional |
| `id` | Required (`id`) | Required (`item_id`) |
| `identifier_exists` | Optional | Not supported |
| `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`) |
| `mpn` | Required in some cases | Optional |

## Every attribute, side by side

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


## Differences a table cannot show

### A pushed snapshot replaces a fetched URL

Microsoft fetches a TSV or XML file from a URL you host, daily. OpenAI expects full catalogue snapshots pushed to an SFTP endpoint it issues, at least daily. Nothing about your Microsoft setup transfers to that, and a failed push is silent where a failed fetch is reported back to you.

### Six fields are renamed

item_id, url, image_url, group_id, product_category and ads_metadata replace id, link, image_link, item_group_id, google_product_category and the custom labels. The values are the same; the column names are not, and there are enough of them that the file looks unfamiliar.

### Price carries its currency

Microsoft follows the Google convention of an amount with the currency configured alongside. OpenAI wants "79.99 USD" as a single string. It is a small rule that has to be applied consistently to prices and sale prices alike.

### brand goes from conditional to required

Microsoft expects brand as part of the identifier chain, so it is conditional. OpenAI requires it outright. A catalogue that leans on gtin alone to satisfy Microsoft will have brand gaps that OpenAI will not accept.

### The variant model is different, not renamed

Microsoft uses item_group_id exactly as Google does. OpenAI wants group_id plus a listing_has_variations flag and a variant_dict describing what varies. This is the one part of the migration that is genuinely new logic.

### File formats barely overlap

Microsoft takes TSV and XML. OpenAI prefers Parquet with zstd compression and also accepts gzipped JSONL, CSV and TSV. Compressed TSV is the one route that exists on both sides, and it is not the format OpenAI prefers.




## Reusing one feed for the other channel

1. **Stand up the SFTP push first** — Get a snapshot landing on the endpoint on a schedule, and alert on the job. This is the only part of the work that has no equivalent in your current pipeline.
2. **Rename the six fields at generation time** — Map from one internal representation to each channel's names rather than maintaining a second mapping. Two independent mappings of the same catalogue drift.
3. **Reformat price into amount plus ISO code** — Decimal amount, space, uppercase currency code, applied to price and sale price alike. Check zero-decimal currencies and any thousands separator your formatter might introduce.
4. **Fill the brand gaps before you launch** — Count the items with no usable brand value. Microsoft tolerated them wherever a valid gtin was present; OpenAI requires brand regardless, and vendor is not always the right source for it.
5. **Build group_id, listing_has_variations and variant_dict** — Group from the Shopify product id, flag products with more than one variant, and build the dictionary from the option names and values Shopify already holds.
6. **Choose the output format deliberately** — Parquet with zstd is preferred and is the right answer for a large catalogue. Gzipped TSV is the path of least resistance if you already generate TSV for Microsoft, and it is a legitimate starting point.







## Frequently asked questions

### Can a Microsoft Advertising feed be reused for OpenAI?

The values can, the file cannot. Six core fields are renamed, price has to carry its currency code, variants need a different structure, seller_name is required, and the feed is pushed over SFTP rather than fetched.

### What format does OpenAI prefer for a product feed?

Parquet with zstd compression, with gzipped JSONL, CSV and TSV also accepted. If you already generate TSV for Microsoft, compressed TSV is the shortest path to a first working push.

### Does OpenAI use the Google product taxonomy?

It takes a product_category attribute, so the category values you already maintain for Microsoft have somewhere to go. The field name differs, which is easy to miss in an otherwise familiar mapping.

### Is brand required for an OpenAI feed?

Yes. Microsoft treats brand as conditional, satisfied in combination with other identifiers, but OpenAI requires it on every item, so gaps that were tolerated will not be.




## Primary sources

- [Microsoft: Feed file guidelines](https://help.ads.microsoft.com/#apex/ads/en/56895/1)
- [OpenAI: Product feed required fields](https://developers.openai.com/commerce/specs/file-upload/products)



