Opens in a new tabSkip to content
Agent LighthouseAgent Lighthouse

    Searches the text of every published page. The evidence sources themselves are not in this index — search all of them on the trusted sources page.

    GitHub ↗
    Browse checks and page contents
    machine-discovery/agent-commerce-feed-parity

    Product pages carry the fields an agent-commerce feed needs

    What it checks

    Audits sampled product pages against the union of OpenAI’s Product Feed Spec required fields and Google Merchant Center’s required attributes. The PDP’s JSON-LD is the auditable proxy for feed eligibility. The union includes the fields that Google’s rich-result validator does not require, and that therefore no SEO tool checks.

    Why it matters

    Google’s automatic item updates repairs feed and page discrepancies ‘using the structured data markup the crawlers find on your website’. It requires price with priceCurrency, availability as a valid ItemAvailability, and itemCondition mapped to NewCondition, RefurbishedCondition or UsedCondition. It states that when extractors cannot determine those, ‘your products will be subject to item-level disapprovals’. Merchant Center separately requires that feed availability ‘must match the availability from your landing page’ and that price ‘must match landing page and checkout prices’.

    OpenAI’s Product Feed Spec requires a strictly larger per-item set than Google’s rich-result minimum. It requires a stable item_id of at most 100 characters, a brand of at most 70, a seller_name, target_countries as ISO 3166-1 alpha-2, a plain-text description of at most 5000 characters, and availability from a fixed lowercase enum, price with ISO 4217 currency, and is_eligible_search/is_eligible_checkout. Falsifiable claim: a PDP missing brand, seller, itemCondition-as-URL, a stable SKU, or a country or region signal will pass every Google rich-result test.

    It still cannot be reconciled by automatic item updates, and it provides no page-side evidence for the fields OpenAI’s feed requires. Feed rejections and item-level disapprovals are therefore silent and unattributable. A second claim is sharply testable. When the JSON-LD offers.price disagrees with the price rendered in the page HTML, automatic item updates will overwrite the feed with one of the two values. An agent reading the page will quote the other.

    Evidence

    • OpenAI Commerce — Product Feed Spec — OpenAI (vendor-doc, URL verified 2026-08-20)
    • Required per item: item_id (stable, unique per variant, max 100 chars), title, description (max 5000, plain text only), link or url (must resolve HTTP 200), image_url (JPEG or PNG). Also required are price with an ISO 4217 currency, brand (max 70), seller_name and target_countries (ISO 3166-1 alpha-2). availability is drawn from the lowercase enum {in_stock,out_of_stock,pre_order,backorder,unknown}. Two booleans complete the set: is_eligible_search, and is_eligible_checkout, which requires is_eligible_search=true. Optional/recommended: gtin (8-14 digits, no dashes), mpn (max 70), condition, item_group_id (stable across variants). sale_price must be <= price. Accepted formats are delimited files only (TSV/CSV/.txt + gzip); ‘JSON, spreadsheet, XML, RSS, and Atom sources are not part of this compatibility path.’ No documented refresh-cadence requirement.
    • OpenAI Commerce (overview) — OpenAI (vendor-doc, URL verified 2026-08-20)
    • Three feed delivery paths: API create/retrieve/upsert of product + promotion feed data, SFTP file upload, and legacy file upload. Feed conformance is what lets ‘ChatGPT accurately index and display your products with up-to-date price and availability.’ Checkout requires the Agentic Checkout Spec. Page does not document schema.org markup as an alternative ingestion path.
    • Product data specification — Google Merchant Center (vendor-doc, URL verified 2026-08-20)
    • Required attributes:
    • id — max 50 characters, unique.
    • title — max 150 characters.
    • description — max 5000 characters, ‘should match landing page content’.
    • link.
    • image_link — 500x500 minimum, enforced 2027-01-31.
    • brand — max 70 characters.
    • availability is drawn from {in_stock,out_of_stock,preorder,backorder}, and ‘must match the availability from your landing page’. price ‘must match landing page and checkout prices’.
    • gtin is strongly recommended. mpn is required when there is no manufacturer GTIN. condition is required for used or refurbished items. item_group_id is required for variants in BR/FR/DE/JP/UK/US.
    • Automatic item updates — Google Merchant Center (vendor-doc, URL verified 2026-08-20)
    • Google repairs feed/landing-page discrepancies ‘using the structured data markup the crawlers find on your website’. Required markup: price + priceCurrency (or priceSpecification), availability with valid ItemAvailability values, itemCondition mapped to NewCondition/RefurbishedCondition/UsedCondition. When markup is missing, ML ‘advanced data extractors’ run instead, and ‘if the extractors are unable to determine price availability, or condition information, your products will be subject to item-level disapprovals.’ This makes PDP structured data an auditable proxy for feed eligibility.

    How it scores

    Tier per evidence policy: scored — grade A meets the A/B bar required for scored audits.

    Example failure

    A Shopify store’s Product JSON-LD emits "availability": "InStock" — a bare token, not the schema.org URL. It omits itemCondition and offers.seller. It renders the sale price in the DOM via a currency-conversion script, so the JSON-LD says 49.00 USD while the visible price is 42.00 USD. Google’s Rich Results Test passes. Automatic item updates cannot parse availability or condition. It falls back to ML extractors, and item-level disapprovals begin. Separately, the OpenAI feed is rejected on brand and seller_name. An agent reading the page quotes 49.00 to a shopper who is charged 42.00 — or the reverse.

    Sources