We scanned 187 med spas across 10 US metros for three decision-useful facts we repeatedly see matter when clinics get compared — a price, a credentialed provider, and who the treatment is for. 55% showed no procedure price as plain text on any page we checked, and only 8.6% surfaced all three facts — about one clinic in twelve. That leaves 91% missing at least one of the three. In other words, when a patient asks ChatGPT for “the best place near me for Botox,” most clinics haven't made the full set of decision-useful facts plainly available for an assistant to read. This is our own data, and below is the full method, the corrections we made, and the limits — because a number is only worth citing if you can see how it was made.
Why a missing price is now an AI-search problem
For years a price left off the page was a conversion choice — make them call. What's changed is who else is reading the page. When an assistant compares clinics, it can only use the facts from your page that it can actually retrieve — and it tends to reach for the ones stated plainly as text. If the price lives inside a booking widget, an image, or “call for pricing,” there's often nothing for it to pull. The page can look complete to a human and still be nearly blank to a machine.
That's the lens for this scan. We weren't grading design or marketing. We checked one thing: are the three facts we measured — a price, a credentialed provider, and candidacy — present as extractable text on the page?
The three facts we measured — and how often they're there
When an assistant weighs a few clinics for a recommendation, the reasons it can give come from what the page states. In the recommendation reasons we observe, three facts show up repeatedly, so we scanned for each. Across the 187 clinics, measured in visible page text:
These overlap with what tends to matter when an assistant recommends you over the clinic next door. Only 8.6% (16 of 187) surfaced all three across the pages we checked — meaning 91% were missing at least one. Most clinics had one or two and left a machine to guess the rest.
The machine-readable layer is even thinner
You might expect the structured data — the JSON-LD that exists specifically for machines to parse — to fill the gap. It mostly doesn't.
So the part of the page built to be machine-readable usually omits the very fact a patient is asking for. Price is missing both as visible text (55%) and, nearly as often, as structured data (67% carry no price in schema).
How the 10 metros compared
Sorted by the share of clinics with no price on any page we checked (higher = worse). “Best” and “worst” refer to this price column — not to the much harder “all three facts” column, where every city clusters near the floor (see below). Counts shown as X of N because per-city samples are small.
Percentages are rounded to the nearest whole number; exact counts (X of N) are shown in each cell.
A few things stand out. Atlanta disclosed prices least often — 64% of its clinics showed no price on any page checked. Austin did best on price, at 38% missing. But “all three facts” is scarce everywhere, and it doesn't track with price at all: Austin leads on price yet, like most metros, got just one of its clinics to all three — the same count as Atlanta, the worst city on price. Only Miami reached 15%, most metros sat below 10%, and Nashville had none of its 12 clinics surface all three. Even the best cities left the large majority of their clinics short of a complete, extractable page. Because per-city samples are small, treat the city numbers as directional — the pattern across all 187 clinics is the more reliable read.
How we did it (and what this can't tell you)
We want the method on the table, because its limits — and the corrections we made — are part of the finding.
In August 2026 we pulled med-spa listings from Google Maps for each metro (query: “med spa [City] [ST]”), found each clinic's sitemap, and opened up to three procedure or pricing pages per clinic, scored by relevance (a pricing page ranked above a treatment page, which ranked above a generic service page). On those pages we used automated pattern-matching to detect three facts, with deliberately strict definitions:
Price: a procedure price like $NN–$NNNN next to a treatment term — excluding financing, membership, and discount figures.
Provider: a provider stated in visible text as a name plus credential (“Jane Smith, NP”), “Dr. First Last,” “board-certified,” or “physician-led.” Provider information found only in JSON-LD was tracked separately (see the schema section).
Candidacy: “ideal/good candidate,” “who it's for,” “not a candidate,” and similar.
The headline price, provider, candidacy, and “all three” figures are based on plain-text detection; schema coverage is reported separately.
Each clinic was counted once, and a fact was marked present if it appeared on any of the pages we checked (an OR across pages). “All three” means all three flags were true for the clinic — they may sit on different pages. The denominator is clinics that were reachable and had at least one procedure or pricing page: 187, kept from 207 parsed. National chains were excluded. An automated scan varies by a clinic or two run to run with network reachability; the figures here are a single run.
Our first provider detector was wrong in an instructive way: it matched “MD” inside base64-encoded data and “Dr” inside street addresses (“Drive”), which inflated apparent provider presence to about 90%. We tightened it to require a real name plus credential and re-ran. The corrected text figure (44%) lands within a point of the independent JSON-LD figure (45%) — two different methods agreeing, which is the cross-check we wanted before publishing. We also hand-validated 30 randomly selected clinics against their pages: the automated classification agreed in 27 of 30 clinics (87 of 90 field-level classifications). The three disagreements were false positives — a brand name containing “RN,” a job posting mentioning a “medical director,” and a promotional discount read as a price.
It's a directional automated scan, not a hand-audited census. The sample is a convenience sample from Maps results in 10 cities — not random, not nationally representative, and a single snapshot; pages change. Our scan captures plain-text (and schema) availability — not everything an AI system could potentially recover. A price inside an image, a PDF, or an interactive booking widget may still be reachable by a human or by some search systems, but our scanner didn't count it. We chose that stricter bar on purpose: plain, visible text and structured data are the most portable, directly extractable forms across search engines and AI assistants alike.
The takeaway isn't that most med spas are careless. It's that most pages were built to persuade a person after the click — not to hand a machine the facts before it.
What a clinic can do about it
Our practical recommendation — based on this scan plus the recommendation tests we run — is small and doesn't cost an ad budget: put the three facts — a real price or range, a named provider with credentials, and who the treatment is for — as plain text on each procedure page — and, where your structured-data type supports it, keep the provider and relevant pricing consistent there too — not buried in a booking widget. That's it. It helps the patient who's skimming, and it makes those facts directly available for an assistant to use or quote.