ChatGPT Product Feed: How Merchants Build and Maintain It
A product can be perfectly described in your ecommerce store and still reach an AI surface incorrectly. Its name changes between systems, a size disappears from the variant, the price retains an expired promotion, or stock updates hours late. This is not only a content problem. It is a data-contract problem.
OpenAI documents a structured feed so ChatGPT can index and display products with current price and availability. The Stable specification defines the supported file-upload path; the Google-compatible profile is available only when OpenAI confirms that a registered feed supports it. The OpenAI Merchant Feed Terms also make the merchant responsible for the content and require it to remain complete, correct, and current.
This guide does not attribute demand to an exact Google Search Console query. The topic is prioritized because the specification and terms published in 2026 create a new operational job for ecommerce teams. The broader strategy for making a store understandable to AI belongs in GEO for ecommerce; here we will build the system that delivers and maintains a valid catalog.
What a Feed Solves and What It Does Not
A feed transports product data in a format the recipient can validate. It can declare identity, description, URLs, images, price, availability, variants, and eligibility controls. It also creates an auditable point: every export can be tied to a source, timestamp, version, and processing result.
It does not replace every other system:
| Layer | Job | Do not confuse it with |
|---|---|---|
| Product page | Explain and convert on your site | The file delivered to OpenAI |
| Product schema | Mark up data on the page | A registered, processed feed |
| Feed | Deliver structured, current catalog data | A guarantee of appearance or recommendation |
| Measurement | Observe what each surface shows | Technical upload validation |
| Ads and checkout | Activate programs with their own rules | A non-Ads organic feed |
The schema markup and structured data guide covers the page layer. Keep it aligned with the feed, but do not treat a schema test as proof that OpenAI accepted an upload.
Start With the Registration and Terms Gate
Before writing an exporter, confirm through the applicable integration channel:
- that a feed is registered for the merchant;
- which format and schema that feed accepts;
- which markets and currencies are configured;
- which delivery method and cadence are agreed;
- which merchant identity will be displayed;
- which policies and terms the legal owner must review;
- which processing history or report will be available.
Do not assume that a publicly accessible CSV is onboarded just because it exists. The Google-compatible documentation explicitly requires OpenAI confirmation for the registered feed. Preserve that confirmation, the internal owner, and the specification date in the runbook.
The terms published on June 15, 2026 make the merchant responsible for content, policy compliance, and product legality. They grant OpenAI a license to use the content in its services and state that submission does not require OpenAI to display it. This is an operational guide, not a substitute for legal review of the applicable terms.
Choose One Schema Contract, Not a Mixture
OpenAI presents Stable and Draft views. Stable is the supported path for file-upload integrations; Draft is published for planning and feedback, not production. Pin the Stable revision in your internal specification and review any change before updating the exporter.
If your registered feed supports the Google-compatible profile, the documented path accepts:
- UTF-8 TXT or TSV delimited by tabs;
- UTF-8 CSV delimited by commas;
- the same extensions compressed with gzip;
- one header row with canonical lowercase field names;
- one product or variant per row.
JSON, spreadsheets, XML, RSS, and Atom are not part of that compatibility path. Your source may live in a database or spreadsheet, but it must export one of the accepted delimited formats.
The Parser Is Selected Per Upload
The specification says OpenAI samples files, checks the OpenAI schema first, and then the Google-compatible profile when applicable. One parser is selected for the whole upload; it does not switch from row to row. An accepted sample does not guarantee that every row is valid because each product is validated during processing.
Do not mix OpenAI and Google headers or export files with different contracts in the same upload. Make the preflight reject the batch when headers, delimiter, or encoding do not match the expected version.
Design the Architecture From the Source of Truth
A reliable feed does not come from copying what is visible on the website. Build a traceable chain:
PIM or master catalog -> normalization -> market rules -> validation -> versioned file -> delivery -> processing report -> reconciliation
Each stage should produce evidence:
| Stage | Minimum evidence | Typical owner |
|---|---|---|
| Extraction | Source version and time | Data or catalog |
| Normalization | Transformation rules and fields | Feed engineering |
| Validation | Errors by row and rule | Catalog QA |
| Delivery | Hash, rows, date, and destination | Operations |
| Processing | Accepted, rejected, and causes | Operations + platform |
| Reconciliation | Differences against source | Catalog + ecommerce |
Use a stable item_id or id. Title, URL, and price can change; the key must let you compare the same variant across exports and remove the correct one when it is no longer eligible.
Cover Required Fields First
In the Google-compatible profile, OpenAI requires every row to contain:
| Field | QA control | Failure it prevents |
|---|---|---|
id |
Nonempty, stable, and unique | Duplicates and lost history |
title |
Plain text and identifiable product | Ambiguous or promotional titles |
description |
Plain, factual, current text | Stale claims |
link |
Accessible canonical HTTP(S) URL | Broken or wrong-market destination |
image_link |
Public HTTP(S) product image | Broken or wrong-variant image |
availability |
Allowed and coherent value | Showing an unpurchasable item |
price |
Amount and three-letter currency | Invalid price or currency |
brand |
Real, consistent brand | Misattributed product entity |
If the product has an identifier, provide a valid GTIN or MPN. Set identifier_exists=no only when no identifier genuinely exists. Include availability_date for preorder or backorder according to the current rules.
Do not try to fill every optional field before securing required coverage. A controlled launch can begin with one category and market, but it needs measurable coverage without rows that appear successful while omitting critical data.
Model Variants Without Duplicating Products
A parent product is not always a sellable unit. Size, color, capacity, or material can change image, price, stock, and eligibility. Export one sellable variant per row and retain stable grouping.
The compatibility path maps item_group_id to group_id and indicates that the listing has variations. In the Stable schema, group_id, listing_has_variations, and variant_dict express the relationship. Define rules such as:
- a distinct
idfor every sellable variant; - one shared
group_idfor the family; - normalized values for color, size, and material;
- a variant-specific image and URL when they differ;
- independently verified stock and price;
- an explicit policy for retired variants.
Do not generate combinations that do not exist. A phantom variant can pass syntax checks and still create an incorrect experience. Compare the exported set with the sellable source set before delivery.
Treat Price, Promotion, and Availability as Volatile Data
The terms require information, including price, to remain complete, correct, and current. Turn that obligation into measurable controls.
For price:
- use a positive amount and three-letter currency code;
- verify that the currency belongs to the configured market;
- require
sale_priceto be lower thanpricein the same currency; - validate promotion start and end times;
- remove expired promotions in the next export;
- compare a sample against the destination page.
For availability:
- map only allowed states;
- require a date for preorder or backorder when applicable;
- quickly remove or update an out-of-stock SKU;
- use
expiration_datewhen the lifecycle requires it; - record the actual time of the last inventory read.
Set a freshness objective by risk. Fast-moving stock may need a shorter limit than an editorial description. The meaningful metric is accepted upload time - source change time, not only the scheduled job frequency.
Validate URLs, Images, and Factual Content
A row can be formally correct and still send a user to a poor destination. Before delivery, check:
- valid response from
linkandimage_link; - no credentials embedded in URLs;
- product-page canonical and market;
- match between image, product, and variant;
- no placeholders in title or description;
- coherent brand, model, attributes, and warnings;
- genuine, lawful, permitted product;
- sufficient rights to text, images, marks, and other content;
- no personal data except the narrow case covered by the terms.
Do not automatically copy reviews, customer names, or third-party content. The terms give the merchant obligations around rights, privacy, warnings, and compliance. Define an allowlist of sources and a specific review for fields that may contain user-generated text.
Build a Preflight That Fails Before Delivery
Run validation in layers:
- File: encoding, delimiter, header, compression, and size.
- Schema: required fields, types, enums, and dependencies.
- Row: unique ID, URLs, currency, identifiers, and dates.
- Catalog: variants, categories, market, stock, and lifecycle.
- Content: accuracy, rights, policies, and warnings.
- Reconciliation: exported rows against eligible source rows.
Produce three outputs: approved batch, quarantined rows, and error report. Do not silently drop rows to achieve a high acceptance rate. If an eligible product is excluded, the report should show its reason, owner, and correction deadline.
A minimum gate set can be:
| Gate | Blocking condition |
|---|---|
| Coverage | Eligible SKUs are missing without documented exclusion |
| Identity | Duplicate ID or incoherent variant group |
| Offer | Invalid price, currency, or stock |
| Destination | Inaccessible URL or image |
| Policy | Prohibited product or unconfirmed rights |
| Freshness | Critical data exceeds the agreed limit |
This article covers the direct feed OpenAI can ingest. If your catalog lives in Shopify, syndication and checkout are handled per channel instead: see the Shopify Agentic Storefronts runbook.
Reconcile Every Upload Result
Job success does not equal product acceptance. Preserve for each delivery:
- file ID and hash;
- schema revision;
- extraction, delivery, and processing times;
- expected, sent, accepted, and rejected rows;
- errors by code, field, category, and market;
- products removed or missing from the previous batch;
- owner and status of every quarantine.
The documentation says one malformed row can be rejected while other valid rows continue processing. A completed upload can therefore contain partial loss. Calculate coverage over the eligible catalog, not only over the rows the exporter chose to send.
Use Internal Diffs Even When Delivering Snapshots
Even if the agreed mechanism delivers a full file, calculate an internal diff against the previous version. Classify additions, identity changes, offer changes, removals, and market movements. An unexpected jump in any class should block or escalate the batch.
Keep immutable snapshots for the period needed to investigate. Without them, you cannot prove whether an incorrect price originated in the source, transformation, delivery, or processing stage.
Separate Acceptance, Eligibility, and Appearance
Do not collapse the funnel into one label:
| State | Question |
|---|---|
| Source eligible | Should the SKU have been exported? |
| Exported | Was it in the correct file? |
| Valid | Did it pass internal preflight? |
| Accepted | Did the platform process the row? |
| Eligible | Is the relevant use enabled? |
| Visible | Did it appear in a specific experience? |
| Recommended | Did an answer propose it for an intent? |
| Converted | Did it produce an attributable commercial action? |
The SKU-level AI recommendation monitoring guide starts at the later stages and observes answers. This article ends at the delivery contract and its controls. Connecting them supports investigation without claiming that acceptance caused a recommendation.
Do Not Mix Organic, Ads, and Checkout
For non-Ads feeds, follow the Required and Optional fields in the applicable specification. Ads uses the same base schema with additional requirements; OpenAI documents is_ads_eligible for products Ads should process. That control does not automatically turn an organic feed into a campaign.
In the Google-compatible profile, the documentation says accepted products enable search and disable checkout. The broader schema contains separate eligibility flags for search, checkout, and Ads. Use only the values and capabilities agreed for your registered feed.
The broader journey is covered in AI no longer just recommends, it sells. The rule here is stricter: document each program separately and never present accepted as a synonym for purchasable inside ChatGPT.
Define an Operational Dashboard
Measure the system with explicit denominators:
- exported coverage over eligible catalog;
- acceptance rate over sent rows;
- quarantine rate by cause;
- age of price and availability data;
- time to accepted upload after a change;
- feed-to-product-page discrepancies;
- retired SKUs still present;
- ungrouped variants or incomplete attributes;
- repeated errors by pipeline and owner.
Do not compress these indicators into an opaque score. A 99% acceptance rate can hide the 1% of products that drives margin or a promotion. Report absolute count, percentage, affected categories, and commercial risk.
Operate Incidents With Cause and Recovery
Open an incident when a complete upload fails, coverage drops, quarantine rises, the freshness SLO is breached, or a critical price, stock, or policy discrepancy appears.
The ticket should preserve:
- affected batch and version;
- first known time;
- impacted rows, markets, and categories;
- last healthy version;
- likely cause and evidence;
- containment action;
- owner and deadline;
- recovery proof in a later upload.
Do not close the incident because the job reran. Close it when the later batch is accepted, coverage returns to the expected level, and a sample matches the source and destination pages.
Launch Checklist
- [ ] OpenAI has confirmed the registered feed, format, and markets.
- [ ] Legal and policy owners have reviewed the applicable terms.
- [ ] The exporter uses a documented Stable revision.
- [ ] Every product or variant has a stable ID.
- [ ] Required fields have full coverage or an approved exclusion.
- [ ] GTIN, MPN, and
identifier_existsfollow verifiable rules. - [ ] Variants, groups, images, price, and stock match the source.
- [ ] URLs respond and lead to the correct market.
- [ ] Preflight produces a batch, quarantine, and report.
- [ ] Every delivery retains hash, timing, and counts.
- [ ] Processing results are reconciled by row.
- [ ] Freshness SLOs and owned alerts exist.
- [ ] Organic, Ads, and checkout are measured separately.
- [ ] Acceptance is not presented as guaranteed visibility.
FAQ
Can I reuse my Google Merchant Center feed for ChatGPT?
Only if OpenAI confirms that your registered feed supports the Google-compatible profile. That path accepts a delimited TXT, TSV, or CSV core subset, not every Google representation or program. Without that confirmation, use the field names and rules in the OpenAI stable schema.
Which minimum fields does a compatible product feed need?
In the Google-compatible profile, every row needs id, title, description, link, image_link, availability, price, and brand. You also need a GTIN or MPN when the product has an identifier and availability_date for preorder or backorder. Every URL, currency, value, and dependency must pass the current specification's validation.
Should I use OpenAI's Stable or Draft schema?
Use Stable for supported production file-upload integrations. OpenAI publishes Draft for planning and feedback but says it is not yet supported for production integrations. Version your exporter against the stable revision your registered feed actually accepts.
How often should I update price and availability?
There is no universal frequency. Set a freshness objective based on price, inventory, promotion, and market volatility, then measure the time from a source change to an accepted upload. An out-of-stock SKU or expired price should be corrected before a low-risk editorial attribute.
Does an accepted product have guaranteed visibility in ChatGPT?
No. An accepted row confirms that it passed the applicable ingestion contract, not that it will be displayed, recommended, or ranked. The Merchant Feed Terms allow OpenAI to use the content but do not require OpenAI to use or surface it. Measure acceptance, eligibility, appearance, and commercial outcome as separate stages.
How do organic feeds, Ads, and checkout differ?
They are separate controls. A non-Ads feed follows its specification's required and optional fields; Ads uses the same base schema with additional requirements such as is_ads_eligible. In the Google-compatible path, accepted products enable search and disable checkout. Do not present an organic upload as automatic activation of ads or in-ChatGPT purchasing.
This contract covers the catalog you send to OpenAI. For the transactional side with Google, the UCP ecommerce readiness audit evaluates the /.well-known/ucp profile, the checkout state machine, and the split between token and charge.
Turn the Feed Into an Observable Contract
A feed is not an export that someone reviews only after it fails. It is a data product with a source, contract, controls, versions, SLOs, and owners.
Start with one confirmed category and market. Pin the Stable schema, validate before delivery, reconcile every row, and separate acceptance from appearance. When price, stock, or catalog changes, the system should prove when it happened, which version transported it, and whether the platform accepted it.
Mentio helps observe mentions, positions, answers, and competitors after delivery. Start measuring your AI visibility and connect catalog state with what AI surfaces actually show.
Official sources reviewed on August 30, 2026: Products - Agentic Commerce, OpenAI and OpenAI Merchant Feed Terms of Service.
Want to know if AI mentions your brand?
Discover your visibility in ChatGPT, Claude and Gemini in minutes.
Related articles
GEO for Ecommerce: Get Your Store Recommended by AI
When shoppers ask ChatGPT where to buy what you sell, do you appear? GEO guide for ecommerce to get recommended in ChatGPT, Gemini and Perplexity.
GEO AnalyticsHow to Track AI Product Recommendations at SKU Level
Track SKU inclusion, position, attributes, availability and substitutes across ChatGPT, Gemini and Perplexity with a comparable protocol.
GEO / AI CommerceAI No Longer Just Recommends — It Sells: Why Your Brand Must Be Visible Before It's Too Late
ChatGPT now lets users buy without leaving the chat. Learn what agentic commerce is and how to prepare your brand before it's too late.