Research
Research

I Fetched 30 B2B Pricing Pages With JavaScript Off. 17 Showed a Price. Six Had Structured Data.

Aug 15, 2026 · 7 min read · by Jordan Kwan

TL;DR: Mostly yes, but far less reliably than vendors assume. On August 15, 2026 I fetched 30 named B2B GTM and AI vendors' pricing pages with curl and no JavaScript engine. 17 of 30 showed a plan price in raw HTML. Only 6 published one as JSON-LD structured data, and 3 ship a JSON-LD block too malformed to parse. Just 2 (Lusha and ZoomInfo) block a major AI crawler from /pricing in robots.txt, so permission is almost never the barrier. Agentic browsers execute JavaScript and can still read most of these pages; the 13 with no raw-HTML price are betting their number on every machine choosing the slow, expensive path.

Forrester's Lisa Singer and Beth Caplow published a post on August 5, 2026 with a blunt title: AI agents can't read your pricing, and it's becoming a revenue problem. Their argument is not that agents get annoyed, it is that agents do not give up. When the vendor page fails, the agent rebuilds the pricing story from G2, marketplace listings and comparison blogs, and, in their words, "if AI can't understand your pricing, someone else may end up defining it for you."

Gartner's October 21, 2025 predictions release sizes the stake: "by 2028, 90% of B2B buying will be AI agent intermediated, pushing over $15 trillion of B2B spend through AI agent exchanges." That is a prediction with no published methodology, not a measurement. I measured the part that is measurable today.

What did the no-JavaScript fetch actually show?

I fetched 30 named B2B GTM and AI vendors' pricing pages with curl on August 15, 2026, browser user-agent, no JavaScript executed, then stripped <script>, <style> and all tags and looked for a plan price in the remainder.

17 of 30 showed one. Amplemarket, Attio, Chili Piper, Clay, Close, Copper, Freshworks, Instantly, lemlist, Pipedrive, Regie.ai, Salesforce, Smartlead, Unify, Warmly, Zoho CRM and 11x all put a number in the HTML. Copper's $29 / $69 / $134 per seat, per month sits in the markup unrendered.

13 showed none: 6sense, Apollo, Artisan, Clari, Cognism, Demandbase, Gong, HubSpot, Lusha, Outreach, Salesloft, Seamless.ai and ZoomInfo. Eleven of the 13 offer a form where the number would be: "book a demo", "talk to sales", "get a quote".

Two deserve naming. HubSpot's sales pricing page returned 73KB whose entire <body> is 2,126 bytes of zero visible text across 32 script tags; "Starter", "Professional" and "Enterprise" appear nowhere. A non-rendering fetcher gets the <title>. ZoomInfo's never loaded, returning 403 to browser user-agent and plain curl alike behind a PerimeterX captcha.

11x has no /pricing page at all (it 404s; prices sit at /products/alice/pricing), but its sitemap carries guides titled apollo-io-pricing and artisan-pricing. The vendor with no findable pricing page publishes pricing pages about competitors.

Is client-side rendering the same as blocking an agent?

No, and this is where most writing on this topic overclaims. Agentic browsers execute JavaScript. ChatGPT's Operator, Perplexity's Comet and Claude in Chrome all run a real rendering engine. Call my 13 "invisible to AI" and any vendor engineer will rebut you in one reply.

What I measured is narrower and more defensible: no-JavaScript legibility, plus structured-data presence. That still matters. Retrieval pipelines are mostly not browsers: the index feeding a search-grounded answer is built by crawlers that fetch and parse, not headless Chrome at web scale. Rendering costs time and money, and agents budget both. A price in a rendered <div> is extractable occasionally. A price in structured data is extractable reliably.

Siteline's benchmark makes the cost concrete. I traced the number Forrester cites second-hand back to Siteline's own writeup, published June 18, 2026 by David Kaufman, which ran a Claude agent across 100 top B2B products asking for monthly pricing on all public plans. The top 10% of sites ran twice as fast at under a quarter of the bottom 10%'s cost. Nearly 1 in 3 runs hit a search or fetch error, and those runs pulled 58% of their content from third-party sources versus 12% for clean ones. Siteline sells analytics for AI agent traffic, so read it as a vendor-run study.

Who publishes a price a machine can parse?

Six of 30. Apollo, Close, Lusha, Regie.ai, Unify and Warmly ship JSON-LD carrying an Offer or price. Close's is the cleanest: an AggregateOffer with lowPrice: 9, highPrice: 139 and four nested per-plan offers.

Apollo and Lusha appear in both lists. Neither shows a plan price in visible text, yet both publish full prices in structured data. Lusha's page says "contact sales" to a reader while its JSON-LD carries price: 49.9, 399.9 and 587.16. Apollo's only visible dollar figure is $0.025 in overage fine print, while its JSON-LD holds PriceSpecification entries of 49 and 99. Structured data is doing the entire job of machine legibility on those two pages.

Apollo supplies the best artifact of the count: an Offer with "priceCurrency": "USD" and "price": "Contact for pricing". Schema.org's price expects a number. They encoded the sales gate into the field where the number belongs.

Three vendors ship JSON-LD that does not parse. Seamless.ai, Smartlead and Warmly each have a block that throws on JSON.parse. Broken structured data is worse than none: it looks like a checked box.

Does robots.txt have anything to do with it?

Barely, and this surprised me. All 30 robots.txt files returned 200. 22 name no AI agent at all, and only 2 disallow a major assistant crawler from /pricing.

Lusha is one, blocking GPTBot, ClaudeBot and Google-Extended sitewide. ZoomInfo is the other and by far the most deliberate: one group naming GPTBot, OAI-SearchBot, ChatGPT-User, PerplexityBot, ClaudeBot, Google-Extended and Operator, followed by Disallow: /p, a prefix that catches /pricing. It is the only vendor here blocking user-initiated agent fetchers by name, which pairs with the 403 to make its pricing unreadable on purpose.

Attio and Unify block only CCBot and Bytespider, scrapers rather than assistants. Chili Piper looks alarming (User-agent: * then Disallow: /) until it allowlists Googlebot, GPTBot, OAI-SearchBot, ChatGPT-User and ClaudeBot by name, the opposite of the inherited CDN blocks I found in an earlier robots.txt census.

So 28 of 30 leave /pricing open to every major AI crawler. Almost nobody is locking the door. They are writing the price in a language the visitor cannot read without paying extra to render it.

What does this not prove?

It does not prove any of these 13 vendors are absent from an AI answer. I did not run an agent against them and score the output, which is the experiment that would settle it; Siteline's is the closest public version. My sample is 30 hand-picked vendors, not random, and it skews enterprise, where "contact sales" is deliberate strategy rather than oversight. Gating price behind a conversation is defensible. Gating it by accident is not, and neither is shipping JSON-LD that throws a parse error.

Nor is this a post about whether the prices are any good. I have already priced the $100-plus AI subscription stack and done the arithmetic on Clay's credits. This is only about whether a machine can read the number.

What should a vendor actually put on a pricing page?

Four things, in priority order.

One: render a plan price in server-side HTML. Not a headline, an actual number attached to a plan name. This single change moves you from the expensive half of the sample to the cheap half, and 17 of 30 already do it.

Two: add JSON-LD with a real Offer. priceCurrency, a numeric price, unitText for the billing unit, one offer per plan. Six vendors do this. It is an afternoon of work and the only mechanism that makes the number extractable reliably rather than occasionally. Put a number in price, not a sentence. Note the narrow claim: markup makes a specific field machine-readable, and it is not the citation lever the GEO checklists sell.

Three: validate that the JSON-LD parses. Three of my 30 ship blocks that fail JSON.parse. Run yours through a parser in CI, because a broken block costs you everything a working one would have earned.

Four: if you will not publish a price, publish the shape of one. Pricing metric, units, minimum seats, what each tier gates. Forrester's recommendation is that pages be "readable without JavaScript dependencies, structured with clear package hierarchies, and explicit about pricing metrics." An agent that can state your model and say the number needs a conversation kept you on the shortlist. An agent that finds nothing asks your competitor's reviewers, and they are happy to answer.

Written by Jordan Kwan, founder of Reachium.

I build Reachium, the LinkedIn outreach platform behind the tactics you just read. Same brain, live product.

See what Reachium does ↗