I run a small AI-search readiness tool, so I got curious about a concrete question: when someone asks ChatGPT or Perplexity "best med spa near me for Botox," what structured data do the businesses that surface actually have?
So I checked. I took the high-intent queries a real patient would run — "best med spa in [city]", "Botox [city]", "laser hair removal [city]" — across 8 US metros (Austin, Scottsdale, Miami, Dallas, Nashville, Los Angeles, Chicago, Denver), collected the individual-clinic pages that surfaced, fetched each one, and parsed its JSON-LD. 62 clinic URLs, 61 reachable.
The result surprised me.
The basics are common. The quotable fields are not.
Of the 61 reachable clinic pages:
- 77% have some JSON-LD structured data
-
59% have a
LocalBusiness/MedicalBusinessblock -
59% have a
telephone, 57% a postaladdress - …but only 31% have
AggregateRating - only 25% have
priceRange - only 11% mark up their services (
Service/OfferCatalog) - only 8% have
FAQPagemarkup - only 2% have
Reviewmarkup
So clinics nail the identity basics (name, address, phone) and skip the answer-rich markup — the exact fields an assistant uses to quote a business rather than just list it.
Why the distinction matters
When an LLM answers a local "best X near me" question, it's assembling facts: which businesses exist, what they offer, what it costs, how they're rated, and what people ask. A page with a bare LocalBusiness block can be named. A page that also carries Service + priceRange, FAQPage, and real Review/AggregateRating markup gives the model the actual sentences and numbers to cite.
The data says the second kind of page barely exists in this category. That's not a doom stat — it's the cheapest competitive edge in the space right now, and it's a one-time paste into your <head>.
What "good" looks like
A complete bundle for a local business is a @graph with the business entity, its services as an OfferCatalog, an FAQPage, and real ratings:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": ["MedicalBusiness", "HealthAndBeautyBusiness"],
"name": "Example Aesthetics",
"telephone": "+1-512-555-0100",
"priceRange": "$$",
"address": { "@type": "PostalAddress", "addressLocality": "Austin", "addressRegion": "TX", "addressCountry": "US" },
"hasOfferCatalog": {
"@type": "OfferCatalog",
"itemListElement": [
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Botox" } },
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Dermal Fillers" } }
]
},
"aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.9", "reviewCount": "214" }
},
{
"@type": "FAQPage",
"mainEntity": [
{ "@type": "Question", "name": "How much does Botox cost?",
"acceptedAnswer": { "@type": "Answer", "text": "Botox is priced per unit; most treatments range from $10–$18 per unit." } }
]
}
]
}
One honest caveat: put your real ratings and reviews in there. The structure is the easy part; fabricated ratings are both against Google's guidelines and pointless.
Method + caveats
This is a structured-data census of the surfaced set — it measures what makes a page eligible to be cited, not a live count of any single engine's citations (I don't have ChatGPT/Perplexity API access at scale, and I'd rather report what I can verify first-party than guess). I excluded aggregators and listicles (Yelp, etc.) from the clinic tally. Full data, the metro list, and the methodology are in the report below. I refresh it monthly.
Check your own site
Free, open-source:
npx github:epistemedeus/ai-readiness yoursite.com
Full data + a free starter-block generator (and, if you want the complete bundle generated against your live site with a gap diff, a paid option): the med-spa AI-citation schema gap report — linked as the canonical source below.
If you've measured this for another vertical, I'd love to compare notes.
Top comments (0)