angeo / module-openai-product-feed

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.

magento2-module Compatibility: 2.4.7-2.4.9 Code Quality: Fail Tests: N/A Security: Pass MIT

Are you the maintainer of angeo?

Packagento pulls angeo's Composer packages from the public registry so buyers can find them here.

Claim the namespace to take ownership, publish new releases directly, and start charging for premium versions.

Claim this namespace →

OpenAI Product Feed Generator for Magento 2

Latest Version
Total Downloads
License
PHP Version
Magento
OpenAI Feed Spec

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.

  1. composer require angeo/module-openai-product-feed
  2. Run bin/magento setup:upgrade

As a module

  1. Download latest release files and extract them under app/code/Angeo/OpenAiProductFeed
  2. 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
    false in 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):
    iditem_id, enable_searchis_eligible_search, enable_checkoutis_eligible_checkout,
    image_linkimage_url, return_windowreturn_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 weight column now contains only the numeric value; the unit is exported in the
    new item_weight_unit column (lb / kg), as required by the specification.
  • Boolean flags are exported as lower-case true / false strings, as required by
    the specification.
  • The custom GenerateOpenAiFeedForStoreException class 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, with group_id, listing_has_variations,
      item_group_title and a JSON variant_dict built from the configurable
      attributes (spec "Variants" schema).
    • Virtual and downloadable products are exported with is_digital=true and 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.
  • 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.log with 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.
  • description is exported as plain text (HTML stripped, entities decoded,
    whitespace collapsed, truncated to 5,000 characters) per the specification.
  • product_category now 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_price is only exported when an active discount exists (final price below
    regular price), honoring special-price date ranges and catalog price rules.
  • is_eligible_checkout is forced to false whenever is_eligible_search is 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 throw referenced an unimported
    exception class, and the exception file name did not match its class name (PSR-4).
  • Operator-precedence bug in ProductWeightProvider that dropped the weight unit
    for products with a weight and exported 0 <unit> for products without one.
  • ProductCategoryProvider crash on products without categories (current([])
    returns false, 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:generate no 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.
Versions
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.

Compatibility matrix (Magento × PHP)
Magento PHP 8.2 PHP 8.3 PHP 8.4 PHP 8.5
2.4.7 Pass Pass
2.4.8 Pass Pass
2.4.9 Pass Pass

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.

Static analysis results
Tool Status Findings Summary
PHPCS Warning 40 40 warnings (ruleset: Magento2), 31 auto-fixable with phpcbf
PHPMD Warning 1 1 rule violation (UnusedFormalParameter:1)
Cpd Pass 0
Composer validate Info 8 valid; 8 advisory notes (composer validate --strict)

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.

PHPStan results by Magento and PHP version
Magento PHP 8.2 PHP 8.3 PHP 8.4 PHP 8.5
2.4.7 51 51
2.4.8 51 51
2.4.9 51 51

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

Unit tests results by Magento and PHP version
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

Integration tests results by Magento and PHP version
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.

Security results
Tool Status Findings Summary
Composer audit Pass 0
Malware scan Pass 0
License
MIT
Homepage
https://angeo.dev/

More from angeo

View vendor
angeo/module-llms-txt Free
magento2-module

Magento 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.

v3.2.0 1mo ago
0
angeo/module-robots-txt-aeo Free
magento2-module

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.

v3.0.0 1mo ago
0
angeo/module-aeo-brand-visibility Free
magento2-module

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.

v1.2.0 1mo ago
0
angeo/module-aeo-audit Free
magento2-module

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.

v3.2.0 6d ago
0
Make it pay

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.