TL;DR
- AI shopping agents evaluate structured price, availability, and identifier data before a purchase decision, not headline copy or hero images; incomplete or ambiguous fields get a listing silently skipped, not flagged for review.
- OpenAI's own Agentic Commerce Protocol feed spec requires nine fields (
item_id,title,description,url,brand,seller_name,image_url,availability,price); GTIN, MPN, and condition are officially optional but still worth including. - Stale pricing or inventory data produces the exact same failure as data that was never structured: an agent has no way to flag "this number is wrong," so both get treated as a disqualifier.
- Agent-readability testing has three separate layers: does your markup validate, can shopping bots actually reach your pages, and are your products actually surfacing in agent responses, not just assuming good data equals good placement.
Agents weight data accuracy over content quality, the opposite of traditional SEO
A search ranking algorithm rewards relevance signals accumulated over time: backlinks, dwell time, topical authority, well-optimized copy. An AI shopping agent doesn't have that luxury. It's answering one specific, bounded question, "does this product match what the user asked for, and can I trust the answer enough to recommend or buy it," and it answers that by reading structured fields, not by weighing how persuasive the product description is. A beautifully written listing with a missing availability field and a listing with three flat sentences and complete Offer markup aren't competing on the same axis; only one of them gives the agent something it can act on. For the fuller readiness picture beyond product data alone, liability policy, feed architecture, and measurement, see how e-commerce brands are preparing for agentic commerce.
What agents actually check before recommending a product
Before an agent surfaces or transacts on a product, it's effectively running a checklist against structured fields: does the product match the category and attributes the shopper specified, is it currently in stock, what does it cost after any modifiers, how fast and at what cost does it ship, and what happens if the shopper wants to return it. Every one of those questions has a specific schema.org property behind it (availability, price, shippingDetails, hasMerchantReturnPolicy), and an agent has no fallback for a question it can't answer from structured data. It doesn't read a shipping FAQ to infer a return policy the way a person would; if the field isn't there, the product doesn't clear that check.

Why stale pricing/inventory data disqualifies you silently
The failure mode that trips up otherwise well-structured catalogs isn't missing data, it's wrong data that used to be right. A price field that hasn't synced with a promotion that ended last week, or an availability value still reading in_stock on a product that sold out yesterday, looks exactly like correct data to an agent: there's no error, no broken markup, nothing a validator would flag. The agent has no way to distinguish "this field was never filled in" from "this field is filled in but wrong," so it acts on what's there, which either produces a bad recommendation or a failed transaction that gets logged as your product's fault, not a sync-timing issue.
The structured data your product pages need

Schema.org's Product and Offer types are the shared vocabulary underneath essentially every agent shopping surface, but "add Product schema" undersells how specific the actual requirements are. OpenAI's own Agentic Commerce Protocol product feed specification is the most concrete, publicly documented field list available for what an agent-facing feed needs, and it maps cleanly onto schema.org properties most teams already have a home for.
Minimum viable schema for agent readability
Nine fields are required outright under OpenAI's ACP feed spec. Everything else it accepts is optional, not conditional, a real distinction worth understanding rather than assuming.
Required fields
| Schema.org property | ACP feed field |
|---|---|
| identifier (feed-level ID) | item_id |
| name | title |
| description | description |
| url | url |
| brand | brand |
| seller (organization name) | seller_name |
| image | image_url |
| offers.availability | availability |
| offers.price | price |
availability accepts five values: in_stock, out_of_stock, pre_order, backorder, unknown. Anything outside that enum doesn't get interpreted, it fails to parse.
Optional fields worth including anyway
| Schema.org property | ACP feed field |
|---|---|
| gtin (8/12/13/14-digit + check digit) | gtin |
| mpn | mpn |
| offers.itemCondition | condition |
| offers.priceValidUntil (sale pricing) | sale_price |
| Additional images | additional_image_urls |
condition accepts new, refurbished, or used. Treat this list as a floor, not a target: GTIN in particular is worth including even where it isn't required, since it's the identifier most other channels a feed likely already serves have expected for years, and skipping it costs nothing under ACP but can quietly cost you elsewhere. Shopify's own Storefront MCP documentation, which exposes catalog access through the Universal Commerce Protocol rather than ACP specifically, doesn't spell out a GTIN requirement either, which is exactly why it's worth treating as a best practice rather than waiting for a protocol to mandate it. For where MCP fits alongside ACP and AP2 more broadly, see our comparison of AP2 vs. ACP vs. MCP.
Common markup mistakes that break agent parsing
- Availability values outside the enum.
"Limited stock" or "Few left" instead of in_stock, out_of_stock, pre_order, backorder, or unknown reads as unparseable to a strict feed consumer, not as a nuance to interpret.
- Price and currency living in two places that disagree.
A price field synced from a feed and a different number rendered in on-page JSON-LD, even a few cents off from a rounding difference, is exactly the ambiguity an agent is built to treat as a disqualifier rather than resolve.
- Return and shipping policy left in prose instead of hasMerchantReturnPolicy/shippingDetails.
A well-written shipping FAQ a person could find in ten seconds is invisible to a feed parser that only reads structured fields.
- Missing or inconsistent
brandandseller_name.
Both are required fields under ACP; a generic storefront name where a specific brand belongs, or a blank brand field on private-label items, breaks a required check rather than a nice-to-have one.
- Images that don't meet basic technical requirements.
A broken image_url, a placeholder graphic, or an image behind a redirect chain fails the same way a missing image does.
Keeping your product feed accurate and fresh
How often a feed needs to sync isn't a single universal number, it depends on the surface. Third-party analysis of feed requirements across agent shopping surfaces has reported OpenAI's ACP feed accepting updates on a near-real-time cadence, as tight as roughly every 15 minutes in some reporting, against Google Merchant Center's standard daily sync. Neither specific cadence is something we've independently confirmed against a primary source, so treat the exact numbers as directional rather than official. What's not in question is the direction: surfaces built specifically for agentic checkout expect fresher data than the batch-upload cadence most catalogs were originally built around, and a feed that syncs nightly is a bigger liability for a fast-moving flash sale or a SKU that sells out mid-day than it ever was for traditional search.
A few practices close the gap between what's in the feed and what's actually true: sync price and availability from the same system of record checkout uses, rather than a separate export job that can drift out of step; treat any promotion or inventory change as an event that triggers a feed update, not something that waits for the next scheduled sync; and monitor for silent sync failures, not just malformed data, since a feed that simply stops updating produces the exact same "looks fine, is wrong" failure a bad value does.
Testing whether your listings are actually agent-readable
"Good data" and "verified good data" are different claims, and most teams only ever check the first one. Testing agent-readability means checking three separate, stackable layers, and a listing can pass one and fail another without any obvious symptom.
- Does your markup validate structurally? Google's Rich Results Test and schema.org's own Schema Markup Validator both check whether Product/Offer JSON-LD parses correctly and includes the properties it's supposed to. This is the baseline check most teams already run, but it only confirms the markup is well-formed, not that a shopping agent can reach it or is actually using it.
- Can shopping bots actually reach the pages carrying that data? Structurally perfect markup is worthless if the bot requesting it hits a 403, a bot-detection challenge, or a rate limit before it ever parses the page. Reachability at the whole-site level, the broader question of whether agent bots can crawl a site at all, is covered in our piece on agentic web optimization; here the question is narrower, once a bot reaches a product page specifically, does the data behind it hold up.

Promptwatch's AI crawler logs show crawler identity, page requested, and status code per hit, so a blocked shopping bot becomes a specific, fixable event instead of an unexplained gap in agent visibility.
- Are your products actually surfacing in agent responses? Valid, reachable data still doesn't guarantee an agent selects a product over a competitor's for a given query, so the only way to know is to check real agent responses against real buyer-intent prompts, not assume the first two checks are sufficient.
Prompt Tracking runs a brand's own buyer-intent prompts against tracked AI platforms on a repeating schedule, and ChatGPT Shopping tracking shows brand-level share of voice in shopping responses alongside which specific product pages get recommended or skipped, so a structured-data fix can be confirmed rather than assumed.
FAQ
Does this replace my existing SEO product page optimization?
No. Traditional SEO factors, page speed, backlinks, topical authority, crawlability, still determine whether product pages get indexed and surfaced in traditional search and in citation-style AI answers. What this piece covers is a separate, additional layer: whether the structured data behind that same page is complete and current enough for an agent to act on directly. A product page can be well-optimized for search and still fail every check in this piece, and the reverse is just as possible. For the fuller readiness picture beyond product data alone, liability policy, feed architecture, and measurement, see how e-commerce brands are preparing for agentic commerce.
How often do I need to update my product feed for agents?
As close to real time as your systems allow for anything that changes fast: price, availability, and active promotions in particular. There's no single mandated interval across every surface, but the direction is consistent: agent-facing surfaces are built around fresher data than the nightly batch cadence most product feeds were originally designed for, and the cost of a stale field, a bad recommendation or a failed transaction, is higher than it was when the same field only affected search ranking.
Do I need a separate feed for AI agents vs. Google Shopping?
Not necessarily a separate feed, but possibly a separate validation pass. The core fields, price, availability, brand, images, overlap heavily between Google Shopping and agent-facing feeds like ACP's, so one well-structured feed can usually serve both. Where they diverge is in the specifics: ACP's required-field list and its in_stock/out_of_stock/pre_order/backorder/unknown availability enum are protocol-specific, so a feed built only to satisfy Google Merchant Center's requirements should still be checked against each additional surface's own spec rather than assumed to be automatically compliant.
