# OpenAI Product Feed for Magento 2  -  module reference

> Build the OpenAI (ChatGPT) product feed CSV per Magento 2 store view: all product types, variants, eligibility attributes, seller settings, cron and CLI.

Source: https://angeo.dev/docs/modules/openai-product-feed/
Updated: 2026-10-17

Module reference

# OpenAI Product Feed for Magento 2  -  module reference

Covers `angeo/module-openai-product-feed` 2.1.1 - Checked 16 October 2026 - MIT licensed

**OpenAI Product Feed** builds the product feed that ChatGPT reads, so your catalog can be found inside ChatGPT. It writes one CSV file per store view, in line with the **OpenAI Product Feed file-upload specification (Stable)**.

It covers every Magento product type: simple, virtual, downloadable, configurable, bundle and grouped.

Package`angeo/module-openai-product-feed`Latest version2.1.1 (released 2026-09-15)Magento2.4.6+PHP8.1 - 8.5LicenseMIT, freeLinks[GitHub](https://github.com/angeo-dev/module-openai-product-feed) - [Packagist](https://packagist.org/packages/angeo/module-openai-product-feed) - [Changelog](https://github.com/angeo-dev/module-openai-product-feed/blob/main/CHANGELOG.md) - [Module page](https://angeo.dev/modules/openai-product-feed/)

**On this page**

1. What it does
2. How product types are exported
3. Requirements
4. Installation
5. Setting it up
6. Generating the feed
7. Configuration reference
8. Cron
9. Upgrading from 1.x
10. FAQ
11. Related

## What it does

- Writes the spec columns, such as `item_id`, `is_eligible_search`, `is_eligible_checkout`, `image_url`, `item_weight_unit` and `return_deadline_in_days`.
- Exports configurable products as a parent row plus one row per variant (`group_id`, `variant_dict`, `item_group_title`).
- Links grouped products through `related_product_id` and `relationship_type`.
- Flags digital goods with `is_digital`.
- Keeps going when a product fails: the product is logged and skipped, the run does not stop.
- Loads stock and category data in batches, so large catalogs stay fast.

## How product types are exported

| Type | Rows in the feed |

| Simple | One row |
| Virtual / downloadable | One row, `is_digital=true`, no weight |
| Configurable | A parent row (`listing_has_variations=true`) and one row per enabled child, with `group_id`, `item_group_title` and a JSON `variant_dict` |
| Grouped | One row at the lowest price; children in `related_product_id` with `relationship_type=part_of_set` |
| Bundle | One row: the "from" price for dynamic bundles, the fixed price otherwise |

## Requirements

| Magento | 2.4.6+ (Open Source, Mage-OS or Adobe Commerce)  -  `magento/framework >=103.0.6 <104` |
| PHP | 8.1 - 8.5  -  `~8.1.0||~8.2.0||~8.3.0||~8.4.0||~8.5.0` |
| Other packages | `magento/module-inventory-sales-api >=1.2.3 <2` |

The feed reads stock from the Multi-Source Inventory index, so MSI must be installed. If a SKU is missing from the batch preload, the module falls back to Magento's normal per-product APIs.

## Installation

```
composer require angeo/module-openai-product-feed
bin/magento module:enable Angeo_OpenAiProductFeed
bin/magento setup:upgrade
bin/magento setup:di:compile                # production mode only
bin/magento cache:flush
```

## Setting it up

1. Open **Stores -> Configuration -> Angeo -> OpenAi Feed**.
2. Under **Seller**, fill in the seller name, URL, privacy policy and terms of service. The spec requires the privacy policy and terms when checkout is enabled for a product.
3. Under **Return policy**, set the return policy URL and the return window in days.
4. On each product, open the **OpenAI Configurations** attribute group and set **Enable Search** and **Enable Checkout**.

**Enable Search** is exported as `is_eligible_search`. **Enable Checkout** is exported as `is_eligible_checkout`. If search is off, checkout is forced to `false` in the feed, as the spec requires.

## Generating the feed

```
# All store views
bin/magento angeo:product-feed:generate

# Only some store views (the option can repeat)
bin/magento angeo:product-feed:generate --store=default --store=en_us
```

| Command | What it does |

| `bin/magento angeo:product-feed:generate` | |

The command prints progress per page and the total time. Output files are written to `var/angeo/openai_feed/<store_code>.csv`. Skipped products and a summary per store go to `var/log/angeo_openai_feed.log`.

On the reference benchmark (1,900 configurable products, 5 store views, about 10,300 rows per file), the batch loaders remove tens of thousands of per-product queries compared to 2.0.x.

## Configuration reference

All settings are under **Stores -> Configuration -> Angeo -> OpenAi Feed**. The table shows each field, its config path (for `bin/magento config:set`) and its default value.

Seller (4)

| Setting | Config path | Default |

| Seller Name | `openai_feed/seller/name` | `Example Store` |
| Seller Url | `openai_feed/seller/url` | `https://example.com/store` |
| Privacy Policy | `openai_feed/seller/privacy_policy` | `https://example.com/privacy` |
| Terms of service | `openai_feed/seller/tos` | `https://example.com/terms` |

Return policy (2)

| Setting | Config path | Default |

| Return Policy Url | `openai_feed/return_policy/url` | `https://example.com/returns` |
| Return Window | `openai_feed/return_policy/return_window` | `30` |

## Cron

The feed is built daily at 02:00.

| Job | Cron group | Schedule |

| `angeo_generate_openai_feed` | `default` | `0 2 * * *` |

## Upgrading from 1.x

2.0.0 is a breaking release. Feed columns were renamed to match the OpenAI specification, and `ProductMapperInterface::map()` now returns a list of rows. No data migration is needed: the `enable_search` and `enable_checkout` product attributes stay the same. Only the column names in the file change.

## FAQ

### Where is the feed file?

In `var/angeo/openai_feed/<store_code>.csv`, one file per store view. It is rebuilt daily at 02:00, or when you run the CLI command.

### How do I hide a product from ChatGPT?

Set Enable Search to No on the product. It is then exported with `is_eligible_search=false`, and checkout is forced to false as well.

### Does it handle configurable products?

Yes. You get a parent row and one row per enabled child, linked by `group_id`, with the variant options in `variant_dict`.

### Do I also need the Feed API module?

Not to build the file. The [OpenAI Product Feed API](https://angeo.dev/docs/modules/openai-product-feed-api/) adds REST endpoints for incremental updates next to the daily file.

### What happens when a product fails?

It is logged in `var/log/angeo_openai_feed.log` and skipped. The rest of the feed is still built.

## Related

- [OpenAI Product Feed API](https://angeo.dev/docs/modules/openai-product-feed-api/)  -  ACP REST endpoints for feeds, products and promotions
- [Rich Data](https://angeo.dev/docs/modules/rich-data/)  -  one linked JSON-LD graph per page, with offers and policies
- [AEO Audit](https://angeo.dev/docs/modules/aeo-audit/)  -  score 20 AI-visibility signals from the command line
- [All module reference pages](https://angeo.dev/docs/modules/) - [Compatibility matrix](https://angeo.dev/docs/compatibility/)

This page was written from the `README.md`, `composer.json` and `etc/*.xml` files of [tag 2.1.1](https://github.com/angeo-dev/module-openai-product-feed/tree/2.1.1), read on 16 October 2026. Settings, commands and defaults come straight from that code. If a newer release is out, the README on GitHub wins.
