I want to give you a test you can run this afternoon, and then I want to give you the five things that fail it and how to fix each one. No frameworks, no maturity model, no five-pillar diagram. Just a test and a list.
Here is the test. Pick your most important product or service page. Now imagine something with no eyes has been sent to that page by a person who wants to buy, and it needs to come back with six facts:
- What is this, precisely enough to distinguish it from the nearly identical thing next to it
- What does it cost, right now, including the parts of the cost that are not the headline number
- Can I have it, or is it out of stock, backordered, or regional
- Will it fit or work with the thing I already have
- When does it arrive
- What happens if it is wrong
Six facts. If a parser cannot get all six from your page without a human interpreting a photograph, guessing at a phrase, or executing a checkout, you fail. Most sites fail. I have run this on client sites for years, long before anyone said the word "agentic," because these are the same six facts a comparison engine needed, a shopping feed needed, a screen reader user needed, and a partner integration needed. The audience changed. The list never did.
I wrote separately about why this stopped being theoretical. This note is the practical half: what actually breaks, and what to do about it.
Failure One: The Fact Is in a Picture
This is the most common and the most embarrassing. The specification table is a JPEG. The size chart is a PNG the designer exported from Figma. The compatibility matrix is a screenshot of a spreadsheet. The price, in the worst cases I have seen, is baked into the hero image because someone wanted a specific font.
To a human this looks identical to real content. To anything else it is a rectangle of coloured pixels. Yes, image models can read text in images now, and no, you should not rely on that, because it is slow, probabilistic, frequently skipped for cost reasons, and you have no way to know when it silently misread a 0 as an 8 in a dimension.
The fix is boring: every fact that matters exists as selectable text in the HTML. Keep the pretty image if you like, put the same information in a real table underneath it, and let the design team be annoyed with you. A useful heuristic: open the page, try to select the fact with your cursor and copy it. If you cannot copy it, a machine cannot read it.
The same applies to PDFs, which are where good information goes to become unfindable. If your return policy, spec sheet, or compatibility list only exists as a PDF, it is functionally invisible for most purposes. Put it on an HTML page. Keep the PDF for the people who want to print it.
Failure Two: Structured Data That Disagrees With the Page
Almost everyone has some schema markup now, usually because a plugin added it. Far fewer have schema markup that is true.
I audit this constantly and the pattern is always the same. The plugin was configured in 2021. The page says the product is out of stock; the JSON-LD says InStock, because the plugin hardcoded availability during setup and nobody revisited it. The page shows a sale price of 79; the markup says 99, because the markup reads the base price field and the sale is applied by a different module. The aggregate rating in the markup counts reviews that were deleted.
Understand what this costs you. Absent structured data means a machine has to work harder to parse your page. Wrong structured data means a machine confidently extracts a false fact and acts on it. An agent that tells its user your item is in stock at 99 when it is out of stock at 79 has not been mildly inconvenienced. It has produced a bad outcome with your name attached. And search engines have been penalising markup that contradicts visible content for years, so this is not a new risk with a new name.
The fix: treat structured data as generated output, never as configuration. It should be produced from the same variables that render the visible page, in the same request. If the template prints the price, the markup prints the same price object. If those two numbers can ever disagree, you have built it wrong. Then run a monthly diff: script something that pulls twenty product URLs, extracts the price and availability from both the visible HTML and the JSON-LD, and alerts you when they differ. That script takes an afternoon to write and will find things every single month.
Failure Three: Nothing Exists Until JavaScript Runs
Modern front-end frameworks make it very easy to ship a page whose HTML is an empty div, with the price, stock and description assembled client-side several hundred milliseconds later.
Google renders JavaScript, and has for years, and people use this to end the argument. It is not the end of the argument. Google renders JavaScript on a delay, at a cost, and not always to completion. And Google is now one consumer among several. Plenty of the things fetching your page do a single HTTP request and parse what comes back. They do not run a browser engine. If your price is not in that response, your price does not exist.
The fix: server-render the six facts. Everything else can hydrate client-side, that is fine, nobody needs the reviews carousel or the recently-viewed widget in the initial HTML. But identity, price, availability, specification, shipping and returns should be present in the raw document. If you are on a framework, this is usually a server-side rendering or static-generation configuration question, not a rewrite.
The test: curl -s https://yoursite.com/your-page | grep -i "79.99". If your price does not come back, you have found the problem. Do this for each of the six facts. It takes two minutes and it is more reliable than any tool, because it is exactly what a naive client sees.
Failure Four: The State Has No Address
You sell a jacket in four sizes and six colours. There is one URL. Selecting a size changes the price and the stock status, but nothing in the address bar changes, and there is no way to link to "the large in navy."
This has always been a problem. It makes the page impossible to cite precisely, impossible to link to from a review, impossible to represent in a feed without inventing identifiers, and impossible for anything to confirm that the specific variant a person asked for is available.
The fix: give every meaningfully different state a real, addressable URL, and make sure that URL renders the correct facts server-side. This does not mean you need a separate indexable page for all twenty-four combinations, and please do not do that, you will create index bloat and hate yourself. Use canonical tags to point variants at the main product page for search purposes. But the addressable state should exist and should return correct data when fetched. Search indexing and machine readability are two different requirements and you can satisfy both.
The same principle applies to anything behind an interaction: filtered category views, location-specific pricing, logged-in-only specifications. If a fact only appears after a click, decide whether that fact matters. If it does, give it an address.
Failure Five: You Never Said the Boring Thing Out Loud
This one is not technical at all and it is the one I find most often.
Your return window is thirty days. Everyone at your company knows this. It is not written anywhere on the product page. It is mentioned on a policy page, in a sentence that says "returns are accepted within our standard window," and the number lives in a customer service macro.
Or: the part is compatible with models 400 through 700 but not the 700X. Your sales team knows. Your support team knows. The page says "fits most models."
Humans tolerate this because they will email you, or they will gamble. Anything parsing your page will not gamble. It will either fail to answer, or it will pick a competitor who did write the number down. Vagueness that reads as reasonable hedging to a person reads as missing data to a machine.
The fix: go through the six facts and write the specific value. Thirty days, not "our standard window." Ships in two to three business days, not "fast dispatch." Compatible with 400, 500, 600, 700; not compatible with 700X. Free shipping above 50, not "free shipping available." This is a copywriting task, it costs nothing, and it is the single highest-yield item on this list.
The Thirty-Minute Self-Audit
Do this on three pages: your best seller, one mid-tail product, and one service or category page.
- Curl it.
curl -s URL > page.html, then grep for each of the six facts. Note which are missing from the raw HTML. - Disable JavaScript in your browser and reload. Look at what a non-executing client sees. This is the same finding as step one, but seeing it is more persuasive to stakeholders than a terminal output.
- Copy test. Try to select and copy each of the six facts. Anything you cannot select is an image or a canvas.
- Diff the markup. Extract the JSON-LD and compare price, availability and name against what the page visibly says. Any disagreement is a bug, log it.
- Read it as a stranger. For each of the six facts, is there a specific value, or a reassuring adjective? Circle every adjective.
- Fetch a variant. Pick a specific size or configuration, get its URL if one exists, curl it, and check the facts are correct for that variant rather than for the default.
Write the results in a table: six facts across, three pages down, pass or fail in each cell. That table is your backlog, in priority order, and it will fit on one slide, which matters more than it should when you are asking for engineering time.
What Not To Do
Do not build an "AI-optimised" version of your site. I am watching people spin up parallel content specifically for machine consumption and it is a bad idea for the same reason every parallel-content scheme has been a bad idea: it will drift from the real site, it will eventually contradict it, and serving different content to different clients based on what you think they are is cloaking, which has a long and unhappy history.
Do not buy a product to solve this. Every item on this list is a change to your own templates and copy. There is nothing to license.
Do not do this at the expense of the humans. The overwhelming majority of your buyers still have eyes and still respond to the persuasion layer. Nothing here asks you to remove anything. It asks you to make sure the facts exist underneath it.
And do not let anyone sell you a readiness score. Nobody has a validated benchmark for this, the measurement layer does not exist yet, and a number with no ground truth behind it is decoration.
Why This Is Worth an Afternoon
The honest case for doing this is not that agents are about to become the majority of your traffic. They are not, not this year, and anyone giving you a percentage is guessing.
The case is that the same six facts, cleanly available in your HTML, serve your shopping feed, your comparison-engine listings, your affiliate partners, your internal search, your screen-reader users, your own analytics, and whatever the next intermediary turns out to be. Every one of those has failed quietly for somebody this year because a price lived in an image or a stock status lived in a plugin setting from 2021.
It is plumbing. It has always been plumbing. Plumbing does not get you promoted and it does not photograph well in a deck.
None of this is new work. It is the work that was always supposed to be done, finally having a consequence you can see.