ChatGPT now processes over 50 million shopping queries per day. Appearing in those results is not automatic — it requires a deliberate application process, a spec-compliant product feed, and passing OpenAI's conformance checks.
This guide walks through the entire process: from the pre-check that determines if your store is ready, to the merchant application, to the ongoing cron setup that keeps your feed current.
Shopify and Etsy merchants already have native integrations. This guide is for Magento 2 / Adobe Commerce stores.
🔗 Originally published on angeo.dev
Before You Apply: The Pre-Check
OpenAI's conformance checks verify technical requirements before granting production access. Stores that fail the pre-check go into a review queue and receive vague rejection emails. Do the pre-check yourself first.
bin/magento angeo:aeo:audit
Expected output before you start:
✓ PASS robots.txt — OAI-SearchBot and GPTBot allowed
✓ PASS llms.txt — store content map present
✓ PASS Product Schema — JSON-LD with offers.availability
✗ FAIL AI Product Feed — no feed found
Signal #5 (AI Product Feed) will fail until Step 1 below. Signals #1, #2, and #3 must all PASS before applying at chatgpt.com/merchants.
If robots.txt is failing — most default Magento 2 installs have a User-agent: * wildcard that silently blocks OAI-SearchBot. Fix that first. It's a hard gate that invalidates everything else.
Step 1 — Install the product feed modules
composer require angeo/module-openai-product-feed \
angeo/module-openai-product-feed-api
bin/magento setup:upgrade
bin/magento cache:flush
Both modules are MIT licensed, free on Packagist. No license keys, no SaaS — runs entirely on your server.
Step 2 — Configure seller information
Go to Stores → Configuration → Angeo → Product Feed API and fill in:
- Seller name
-
Target country — ISO 3166 two-letter code (e.g.
US) - Policy URLs — privacy policy, returns, shipping, terms of service
These populate seller.links on every product record. They are merchant credibility signals in OpenAI's scoring. Missing policy URLs is a common reason for suppressed products after initial approval.
Step 3 — Generate and validate the feed
# Generate the feed file
bin/magento angeo:aeo:feed:generate
# Validate structure and required fields
bin/magento angeo:aeo:feed:validate
Confirm in the output:
- Each product has a
variantsarray - Prices are in minor units (see the price format section below)
-
availability.statusis present on every product -
seller.linkshas at least two policy URLs
Step 4 — Verify promotions output
bin/magento angeo:aeo:feed:validate --type=promotions
Active Magento cart price rules should appear automatically as ACP promotions with active_period, benefits, and status: "active". If promotions are missing here, they won't appear in ChatGPT results either.
Step 5 — Apply at chatgpt.com/merchants
Submit your store URL and business details. OpenAI tests schema compliance, HTTP response codes, and feed integrity.
Current status: Onboarding is US-only and available to approved partners — expect a waitlist. Application review typically takes 1–2 weeks.
Step 6 — Receive SFTP endpoint and push the feed
After approval, OpenAI provides a private SFTP endpoint for your store. Push your .jsonl.gz feed file to this endpoint.
⚠️ Do not host the feed publicly on your website. The feed goes to the private SFTP endpoint OpenAI provides — not a public REST endpoint on your store. Submit a sample first; after it passes validation, push the full catalog.
Step 7 — Set up 15-minute cron
# crontab — every 15 minutes
*/15 * * * * /usr/bin/php /var/www/html/bin/magento angeo:aeo:feed:generate --push
OpenAI accepts feed refreshes every 15 minutes. Full feed re-submission is required each time — there is currently no incremental update support.
⚠️ Most common post-approval failure: Stale availability data — out-of-stock products showing as available — is the #1 reason products get suppressed after initial approval. The 15-minute cron prevents this.
Feed Format: What OpenAI Actually Accepts
| Format | Extension | Notes |
|---|---|---|
| JSON Lines | .jsonl.gz |
Recommended. One product object per line. Handles nested variants cleanly. |
| CSV | .csv.gz |
Works for flat catalogs. Variant structures need to be flattened. |
Note: TSV and XML were in OpenAI's original spec announcement but have since been removed. Always check the official feed spec for the current list.
The Price Format Trap
This is the single most common implementation error across all ACP integrations.
Price must be sent in ISO 4217 minor units as an integer:
# ❌ Wrong — fails validation
"price": 14.99
"price": "14.99"
# ✅ Correct — integer minor units
"price": 1499 // €14.99
"price": 14900 // $149.00
The module handles this automatically: (int) round($price * 100). But if you are building a custom integration or mapping from a Google Shopping feed — check this field first. The validation error message for a wrong price format is non-obvious.
What OpenAI's Conformance Check Validates
| Check | What it verifies | Handled by |
|---|---|---|
| Feed schema | Required fields, correct data types, valid URIs | ProductMapper |
| Price format | Integer minor units, ISO 4217 currency code | ProductMapper |
| Availability flags |
enable_search and availability.status present |
ProductMapper |
| Promotion schema |
benefits array with type, dates, status: "active"
|
PromotionMapper |
| Seller links | At least 2 policy URLs present | Admin config → seller.links |
| Product IDs | Unique, stable, no duplicates across the feed | ProductMapper |
No Fees for Discovery
Product discovery results in ChatGPT are currently organic and unsponsored. There is no cost to submit a product feed or appear in shopping results.
The 4% transaction fee announced with Instant Checkout applied only to completed in-chat purchases — and OpenAI is moving away from that model toward merchant-owned checkout. As of April 2026, there are no fees on purchases that start in ChatGPT.
After approval, the feed needs to be indexed — typically 48–72 hours. Products with complete Product JSON-LD schema, high availability accuracy, rich descriptions, and active promotions appear first.
Checklist Before Submitting
- [ ]
bin/magento angeo:aeo:audit— robots.txt, llms.txt, Product schema all PASS - [ ] Feed generates without errors and produces valid
.jsonl.gz - [ ] Each product has
variants, correct prices in minor units,availability.status - [ ] Seller info complete: name, country (ISO 3166), at least 2 policy URLs
- [ ] Active promotions appear with
status: "active" - [ ] 15-minute cron configured and tested
All four Angeo modules are free, MIT licensed, and available on Packagist:
-
angeo/module-aeo-audit— AEO CLI audit, 8 signals -
angeo/module-llms-txt— auto-generates llms.txt -
angeo/module-openai-product-feed— ACP feed generator -
angeo/module-openai-product-feed-api— REST API, 6 endpoints
Top comments (0)