angeo / module-openai-product-feed
Generate AI-powered product feeds with OpenAI for Magento 2. Enable smarter product data syncing, personalized recommendations, and seamless e-commerce integration.
OpenAI Product Feed Generator for Magento 2
Generates an OpenAI (ChatGPT) product feed per store view so your Magento catalog can be discovered — and purchased — inside ChatGPT.
The exported CSV is compliant with the OpenAI Product Feed file-upload specification (Stable) and covers all Magento product types: simple, virtual, downloadable, configurable, bundle and grouped.
Features
- Feed columns aligned with the OpenAI Product Feed file-upload specification (Stable):
item_id,is_eligible_search,is_eligible_checkout,image_url,item_weight_unit,return_deadline_in_days, and more - All Magento product types: simple, virtual, downloadable, configurable, bundle, grouped
- Configurable products exported as parent listing + child variant rows (
group_id,variant_dict,item_group_title) - Grouped products linked via
related_product_id/relationship_type - Digital goods flagged with
is_digital - Fault-tolerant generation: failing products are logged and skipped, never abort the run
- Dedicated log file:
var/log/angeo_openai_feed.log - Optional attributes (media gallery, reviews, Q&A)
- Test coverage
Requirements
- PHP >= 8.1
- Magento 2.4.x (Open Source or Adobe Commerce)
Installation
You can install this module as a Composer package.
composer require angeo/module-openai-product-feed- Run
bin/magento setup:upgrade
As a module
- Download latest release files and extract them under
app/code/Angeo/OpenAiProductFeed - Run
bin/magento setup:upgrade
Upgrading from 1.x
Version 2.0.0 is a breaking release. Feed columns were renamed to match the OpenAI
specification (item_id, is_eligible_search, is_eligible_checkout, image_url,
item_weight_unit, return_deadline_in_days, …) and ProductMapperInterface::map()
now returns a list of rows. See CHANGELOG.md for the full list.
No data migration is needed: the enable_search / enable_checkout product
attributes are unchanged — only the exported column names differ.
Configuration
You can find the module's configuration under Stores -> Settings -> Configuration -> Angeo:
seller identity (name, URL, privacy policy, terms of service) and return policy
(URL, return window in days). Per the OpenAI specification, seller_privacy_policy
and seller_tos are required when checkout is enabled for a product.
Two product attributes control per-product eligibility (found in the
"OpenAI Configurations" attribute group):
- Enable Search → exported as
is_eligible_search - Enable Checkout → exported as
is_eligible_checkout(automatically forced to
falsein the feed when search is not enabled, per the specification)
Product Feed
To generate the product feeds manually, use the angeo:product-feed:generate Magento command:
bin/magento angeo:product-feed:generate
A cron job (angeo_generate_openai_feed) also runs daily at 02:00.
Output file path, relative to the var directory: var/angeo/openai_feed/<store_code>.csv
Skipped products and per-store summaries are written to var/log/angeo_openai_feed.log.
Product type handling
| Type | Behavior |
|---|---|
| Simple | One row |
| Virtual / Downloadable | One row, is_digital=true, no weight |
| Configurable | Parent row (listing_has_variations=true) + one row per enabled child with group_id, item_group_title and JSON variant_dict |
| Grouped | One row, minimal price, children listed in related_product_id with relationship_type=part_of_set |
| Bundle | One row, minimal ("from") price for dynamic bundles, fixed price otherwise |
Contributing
Found a bug, have a feature suggestion or just want to help in general? Contributions are very welcome! Check out the list of active issues or submit one yourself.
Need help with agentic commerce for Magento? Professional support, AEO audits and implementation at angeo.dev. Check how your store looks to AI agents with the free scanner at api.angeo.dev.
Questions? Contact me at [email protected]
Changelog
All notable changes to this module are documented in this file.
[2.0.1] - 2026-07-06
Changed
- Lowered the PHP requirement from 8.3 to 8.1, extending compatibility to
Magento 2.4.4+ environments. Typed class constants (a PHP 8.3-only syntax)
were replaced with untyped constants; no behavior changes.
[2.0.0] - 2026-07-04
Breaking changes
- Feed columns renamed to match the OpenAI Product Feed file-upload specification (Stable):
id→item_id,enable_search→is_eligible_search,enable_checkout→is_eligible_checkout,
image_link→image_url,return_window→return_deadline_in_days.
If you post-process the generated CSV, update your column mapping. ProductMapperInterface::map()now returns a list of feed rows (each row is an
associative array keyed by feed column name) instead of a single positional row.
Custom type mappers must be updated accordingly.- The
weightcolumn now contains only the numeric value; the unit is exported in the
newitem_weight_unitcolumn (lb/kg), as required by the specification. - Boolean flags are exported as lower-case
true/falsestrings, as required by
the specification. - The custom
GenerateOpenAiFeedForStoreExceptionclass was removed. Feed generation
no longer throws on per-product or per-store errors (see below).
Added
- Support for all Magento product types: configurable, virtual, downloadable,
bundle and grouped, in addition to simple products.- Configurable products are exported as a parent listing row plus one row per
enabled child variant, withgroup_id,listing_has_variations,
item_group_titleand a JSONvariant_dictbuilt from the configurable
attributes (spec "Variants" schema). - Virtual and downloadable products are exported with
is_digital=trueand no
physical weight. - Grouped products reference their associated products through
related_product_id/relationship_type=part_of_set(spec "Related Products"
schema) and export their minimal price. - Bundle products export their minimal ("from") price for dynamic bundles and
the fixed price for fixed bundles.
- Configurable products are exported as a parent listing row plus one row per
- New feed columns:
item_weight_unit,is_digital,group_id,
listing_has_variations,variant_dict,item_group_title,
related_product_id,relationship_type. - Dedicated log file
var/log/angeo_openai_feed.logwith a per-store summary
(rows written / products skipped).
Changed
- Feed generation is now fault-tolerant. Custom exceptions were replaced with
logging: a product that fails to map is skipped and logged, a failing attribute
handler produces an empty cell and a warning, and a store whose writer cannot be
created is skipped — the run always continues. descriptionis exported as plain text (HTML stripped, entities decoded,
whitespace collapsed, truncated to 5,000 characters) per the specification.product_categorynow exports the full category path with the>separator
(e.g.Apparel & Accessories > Shoes) and no longer crashes on uncategorized
products.- Prices are formatted as
<amount> <ISO 4217 code>(e.g.79.99 USD) without
locale symbols or thousands separators, and resolve through the price-info
pipeline so composite product types export a correct minimal price. sale_priceis only exported when an active discount exists (final price below
regular price), honoring special-price date ranges and catalog price rules.is_eligible_checkoutis forced tofalsewheneveris_eligible_searchis not
true, per the specification dependency rule.- CSV rows are normalized against the header definition, guaranteeing column order
and empty cells for missing values. - Attribute handlers are instantiated once per run instead of once per product row.
Fixed
- Fatal error in the per-store service: the second
throwreferenced an unimported
exception class, and the exception file name did not match its class name (PSR-4). - Operator-precedence bug in
ProductWeightProviderthat dropped the weight unit
for products with a weight and exported0 <unit>for products without one. ProductCategoryProvidercrash on products without categories (current([])
returnsfalse, which the null-coalescing fallback never caught).- Broken
ProductAttributeHandlerProvider(class/file name mismatch and wrong
import) rewritten and wired into the mapping pipeline. - Inventory quantity lookups no longer fail rows for composite product types that
have no salable quantity of their own. bin/magento angeo:product-feed:generateno longer fails when the area code is
already set.
[1.0.2]
- Initial public release line: simple product export, seller and return policy
enrichment, CLI command and daily cron.
| Version | Stability | QA Status | Compatibility | Released |
|---|---|---|---|---|
| 2.0.1 | stable | Fail | Magento 2.4.7-2.4.9 Details | 2026-07-06 20:40:44 |
| 2.0.0 | stable | Fail | Magento 2.4.8-2.4.9 Details | 2026-07-05 18:04:28 |
| 1.0.3 | stable | Fail | Magento 2.4.8-2.4.9 Details | 2026-07-03 20:33:42 |
| 1.0.2 | stable | Fail | Magento 2.4.8-2.4.9 Details | 2025-10-20 19:28:00 |
| 1.0.1 | stable | Not tested | Not yet tested Details | 2025-10-13 19:02:17 |
Requires 7
| Package | Constraint |
|---|---|
| magento/framework | * |
| magento/module-catalog | * |
| magento/module-configurable-product | * |
| magento/module-grouped-product | * |
| magento/module-inventory-sales-api | * |
| magento/module-store | * |
| php | >=8.1 |
Compatibility
Each Magento release line is installed on its supported PHP versions, then the module is built (DI compilation + static-content deploy) and its unit and integration suites are run. The matrix shows the lines and PHP versions the module is confirmed to install and run on. Code-quality results further down (phpstan, phpcs, …) are reported separately and never affect compatibility.
Code Quality
Advisory checks against the module's source. Static analysis runs once across the whole module; PHPStan re-runs per Magento + PHP version because resolvable symbols differ between releases. These NEVER affect the Compatibility badge. A phpcs finding can't make a module incompatible.
Static analysis
Coding standards (phpcs), mess detection (phpmd), copy-pasted code (cpd), PHP cross-version compatibility, composer.json validity. Each runs once for the whole module.
PHPStan
Type-checks the module's PHP against a real Magento install at the configured gate level. Re-runs per Magento and PHP version because resolvable symbols differ between releases.
Tests
Unit and integration suites, run for each applicable Magento and PHP version. A test failure speaks to the module's behaviour, not its compatibility with a Magento line, so it is reported here separately and never reddens the compatibility matrix.
Unit tests
| Magento | PHP 8.2 | PHP 8.3 | PHP 8.4 | PHP 8.5 |
|---|---|---|---|---|
| 2.4.7 | N/A | N/A | ||
| 2.4.8 | N/A | N/A | ||
| 2.4.9 | N/A | N/A |
Integration tests
| Magento | PHP 8.2 | PHP 8.3 | PHP 8.4 | PHP 8.5 |
|---|---|---|---|---|
| 2.4.7 | N/A | N/A | ||
| 2.4.8 | N/A | N/A | ||
| 2.4.9 | N/A | N/A |
Security
Security checks run directly against the module: an audit of its declared dependencies for known vulnerabilities (composer audit) and a scan of its source for malware and web-shell signatures. Each runs once. A malware detection fails the version outright.
More from angeo
View vendorMagento 2 module for AI Engine Optimization (AEO). Generates spec-compliant llms.txt and llms-full.txt per llmstxt.org standard, plus streaming JSONL for vector indexing. Multi-store, multi-website, CLI, cron, async admin UI, Page Builder-aware sanitization, customer-group pricing, atomic writes, ETag/Cache-Control, .md mirrors.
Magento 2 module for AI Engine Optimization (AEO). Injects AI crawler rules (OAI-SearchBot, GPTBot, ChatGPT-User, PerplexityBot, Perplexity-User, Google-Extended, ClaudeBot, anthropic-ai, Claude-User, Applebot, cohere-ai, Amazonbot, Meta-ExternalAgent) into robots.txt — without overwriting your existing configuration. Supports per-bot Allow/Disallow lists, Crawl-delay, Sitemap directives, multi-store, and a public Api\RobotsStatusInterface for cross-module integration with angeo/module-aeo-audit.
Live AI brand visibility audit for Magento 2. Queries ChatGPT, Claude, Perplexity, Gemini and Groq with brand-probing prompts and scores real-world AI recall, citation rate and recommendation presence. Extends angeo/module-aeo-audit v3 via CheckerInterface as the 16th signal, alongside the 15 built-in technical checks.
Magento 2 AEO (AI Engine Optimization) Audit. v3 covers 15 signals — robots.txt AI bots, llms.txt + llms.jsonl, Product / Organization / FAQ schema, merchant return + shipping policies, sitemap.xml, UCP profile, AI product feed, OG tags, canonical + hreflang, JSON-LD quality, well-known endpoint matrix, Core Web Vitals via CrUX. Score Trend dashboard, Admin UI, cron, dynamic fix commands, dependency-injected extension point for custom checkers.
Turn an existing module into recurring revenue.
If you already maintain a Magento 2 module on GitHub or GitLab, listing it on Packagento takes about five minutes. We mirror your tags, handle distribution signing, and route paid licenses through Stripe Connect, so you can keep shipping the way you already do.