SEO Auditor — crawls the audited site, breadth first and on the same host, until it finds a page that looks like a pricing or plans page: Offer structured data (JSON-LD or Microdata) or a heading, link or button that reads like a pricing label.
Buyers
A visitor who cannot find what you charge compares a competitor instead of asking.
AI assistants
Answer engines quote prices from structured data and clearly labelled pricing pages; sites without one are left out of the comparison.
How it works
- Validate — normalizes the monitored URL (adds
https://when the scheme is missing). A URL that does not parse or has no host ends the audit with501. - Fetch the start page — sends a
GETrequest to the monitored URL as 37AuditsBot. A blocked request ends the audit with590; a timeout, DNS or TLS failure, an HTTP status of 400 or more, or a body that is nottext/htmlends it with500. - Detect — on every page read, three detectors run in order: Offer structured data in JSON-LD (
Offer,AggregateOffer,PriceSpecification, or aProduct,Service,SoftwareApplication,OrganizationorLocalBusinesswithoffers,price,priceCurrencyorpriceRange), Offer structured data in Microdata (itemtypeofOffer,AggregateOfferorPriceSpecification, or anitempropofoffers,price,priceCurrencyorpriceRange), and a pricing heading (anh1–h4, link or button whose text matches labels such asPricing,Plans,Subscription,Billing,Packages,Preços,Planos,AssinaturaorValores). - Crawl — when no detector matches, every
http(s)link to the same host is queued and the crawl continues breadth first, at most 500 pages. A page that cannot be fetched, answers HTTP 400 or more (including 403) or is not HTML is skipped silently; only the start page can block or fail the audit. - Rules — a crawl that ran out of pages or reached the 500-page limit without a match fails (
400); the first match succeeds (200) and names the page, the detector and the number of pages crawled.
What it audits
Every row maps to onecheckRule* method and one CheckCode, in the order the auditor runs them. CheckCode suffixes use status ranges: 200 success, 400–499 fail, 500–599 error.
Output documentation
Every check carries the same
data fields: startUrl, host, pagesCrawled, maxPages, pricingUrl, detector (json-ld, microdata or heading), schemaDetected and headingDetected.
Risks and considerations
Why a findable pricing page matters
- Procurement teams, founders and AI assistants all look for a price before they contact sales; a site without a reachable pricing or plans page loses the comparison by default.
- Offer structured data (
Offer,AggregateOffer,priceSpecification) lets search engines show prices in rich results and lets answer engines quote them accurately.
How the crawl can miss or mislabel a page
- The crawl follows only
http(s)links to the same host, breadth first, and stops after 500 pages. A pricing page reachable only through another host (a billing subdomain, an app store), through JavaScript navigation or deeper than 500 pages is reported as missing. - The heading detector is a word match on
h1–h4, links and buttons (English and Portuguese labels). A page that mentions “plans” in another sense, or a navigation link to a pricing page, counts as a match; the message names the page and the detector so you can confirm it. - Only the first matching page is reported; the auditor does not judge whether the prices on it are complete or current.
Changes from the previous version
- An invalid start URL, or one without a host, is now an
ERROR(501) instead of aFAIL: the auditor could not run, so the result is not charged. - A start page that cannot be fetched (timeout, DNS, TLS, HTTP 400 or more, non-HTML body) is now an
ERROR(500) instead of the “no pricing page found”FAIL. - The “no pricing page found” verdict now carries a check (
400) with the pages crawled, the host and the limit, so it can be referenced and filtered like every other finding.