Not scored, and therefore excluded rather than counted as zero: Core Web Vitals (real visitors).
The grade follows the AI visibility score: reach, then read, then quote, in the order an engine hits a site. The flat average of every scored section is 92/100 — shown for completeness, not as a second grade. A section whose inputs were not measured is excluded rather than counted as zero.
Score alone would have graded higher — held at C by a medium-severity finding. A defect that changes what a crawler receives outranks an average.
Optimisation headroom
92 now → 100 with the 7 failing measure(s) fixed — a gain of 8 points. Each number below is the weighted contribution of that one row to the overall score; it is arithmetic on measurements already taken, not a forecast. The LETTER is separately capped at C by finding severity, so clearing that finding lifts the grade independently of the score. 23 measure(s) could not be measured; they are excluded, not counted against the site, and are not headroom.
Fix this
Section
Currently
Points
Content ratio
Payload and render path
18.8%
+1.3
Deferred vs blocking scripts
Payload and render path
2 deferred / 2 blocking
+1.3
Inline JavaScript
Payload and render path
23,775B
+1.3
Render-blocking resources
Payload and render path
18
+1.3
Stable @id coverage
Schema and entity graph
78.3%
+0.9
sameAs claims
Schema and entity graph
17
+0.9
Cache state
Server and hosting
DYNAMIC
+0.8
medium
Working, with findings worth reviewing.
Nothing here blocks crawling outright.
11
passing
2
needs work
1
failing
1
not measurable
Sections, not individual checks. Not measurable is counted separately and never as a pass — a section we could not read is not a section that passed.
Every figure here was measured with no cookies and no session. That is deliberate: it is what an answer engine gets. If you open your own site while logged into its admin, you are looking at a different document — caching plugins, page builders and membership tools routinely skip their output filters for signed-in users, and admin bars and edit links are added on top.
To see what this report describes, open your site in a private window. If the two disagree, the private window is the one a crawler sees.
Show this on your site
The badge renders the number as measured, whatever it is — it updates when this report is re-run. It is keyed on this report’s id, so only someone holding this link can produce it.
An engine can reach this site, read it, and quote a specific fact about it. That is the whole job.
Higher than 93% of the 30 sites measured here. That is this corpus, not the web — sites people chose to scan, which skews toward ones somebody already suspected.
Stage
Question
Score
Reach 40% of the score
Can a named answer-engine crawler get your pages at all? Every named crawler was served the same page a browser gets.
100
Read 30% of the score
Once it has the bytes, can it find the words? The content is buried in markup, or the files that guide a crawler are missing.
73
Quote 30% of the score
Is there a specific fact it can state and attribute? The facts an assistant is asked for are declared and consistent.
93
Which engines, by name
From the probes in this scan — the same fetch each engine’s crawler makes, from our address.
Served the page
GPTBot · ClaudeBot · PerplexityBot · Googlebot
Fix the 6 items this report already lists and the same arithmetic reads 97. That is addition on the table below, not a forecast — every point has a named component behind it:
Content ratio — now 18.8%, worth 1.3 points
Deferred vs blocking scripts — now 2 deferred / 2 blocking, worth 1.3 points
Inline JavaScript — now 23,775B, worth 1.3 points
Render-blocking resources — now 18, worth 1.3 points
The stage to fix first is read, because the three run in order: an engine cannot read what it was refused, and it cannot quote what it could not read.
What this number covers. Everything above was measured on pages this scan fetched from your own domain. An answer engine also reads sources you do not control — directory listings, review corpora, and your Google Business Profile — and none of those are in this score. The profiles this site declares are listed below but were not fetched on this scan, so nothing here reflects what those listings actually say. A site can score well here and still be described wrongly by an engine reading a listing that disagrees with it.
What this number is not. It does not measure whether ChatGPT, Perplexity or Google’s AI answers actually cite you. No server can measure that, and a score that implied otherwise would be invented. This measures whether an engine can — reach, read, quote — which is the part you control and the part that has to be true first.
Timestamp proof — sealing tonight
This report is fingerprinted over its measurements, and every day’s fingerprints are folded into one root that is submitted to the OpenTimestamps calendars and from there into a Bitcoin transaction. It proves this report existed in this form at this time and has not been altered. It does not prove the measurement was correct — that is a different claim, and no timestamp can settle it. How this works.
this day is sealed after it closes — the digest above is already recorded
What we could not measure — 3
Every row in this report is either a measurement of your site or nothing at all. These lookups did not return a measurement, so they were left unscored rather than counted against you. They are listed because a silent absence is indistinguishable from a clean result, and that is the difference this tool exists to keep.
This covers the third-party and enrichment lookups only — CrUX, the Google profile link, the Internet Archive, the geocoder, and the two well-known files. Your own server’s refusals are never listed here: a 403 to GPTBot is the finding, not a gap in our instrument, and it is reported as a finding above.
Lookup
Outcome
Whose limitation
Why
Off-site presence (directories, reviews, Google Business Profile)
unreached
ours
this scan reads your site, not the sources an engine also reads about you. Listings the site does not declare cannot be discovered from here, and no score above reflects them
Response compression
unreached
ours
our fetch decompresses the body and drops the content-encoding header before we can read it — check it in a browser network panel or with curl --compressed -I
Core Web Vitals (CrUX)
refused
theirs, aimed at us
the CrUX API refused our request: NOT_FOUND: chrome ux report data not found
How to read this
The two scores are not a grade
Crawl clarity is whether a machine can fetch, read and tell your pages apart. User clarity is whether a reader can tell what this is and who it belongs to. They fail independently, so read them separately rather than averaging them.
A dash means not measured, not zero
2 components are shown as — and excluded from the score. If a scan was rate-limited or the pages render with JavaScript, that measurement is withheld. A false clean bill of health is more dangerous than a false defect.
Unconfirmed findings are separated on purpose
Anything that could describe our access rather than your site — a refusal, a timeout — is listed apart and never counted toward the grade.
Content ratio is bytes, not tokens
The share of delivered bytes that are visible text. The deep audit measures tokens per KB with a real tokenizer; the two are named differently because they are different measurements.
What to do with it
Prefer fixes that are one setting over ones that need a sprint. Inline CSS is usually the largest cheap win, because it cannot be cached between pages — a crawler pays for it again on every URL.
Crawl clarity — can a machine fetch, read and tell pages apart80 / 100
component
weight
score
measured
Machine files
x3
100
robots.txt, llms.txt, sitemap and entitymap as scored above
Payload — content ratio
x3
100
18.8% of delivered bytes are visible text (byte-level; the deep audit scores tokens per KB separately)
Render path
x2
0
18 render-blocking resources
Document structure
x2
100
0 heading skips, 1 h1
User clarity — can a reader tell what this is and who it belongs to91 / 100
component
weight
score
measured
Entity identity
x3
78
78.3% of 23 entities carry a stable @id
Declared standing
x2
100
3 credential edges
Location coherence
x3
—
one location with no street address — a service-area business, which Google asks to hide it. Not scored.
Identity claims
x2
—
no map identity links
Page labelling
x2
100
145-char description, canonical present
2 components not measured and
excluded from the score — an unmeasured component is never counted as zero.
Path
Status
Content type
Bytes
Edge
/robots.txt
200
text/plain
1,509
HIT
ok
/sitemap.xml
200
text/xml
694
DYNAMIC
ok
/sitemap_index.xml
200
text/xml
694
DYNAMIC
ok
/wp-sitemap.xml
200
text/xml
694
DYNAMIC
ok
/llms.txt
200
text/plain
21,882
DYNAMIC
ok
Findings
medium/
Visitors and crawlers are being served an old copy of this page
the copy served to us was built 3 hours 58 min ago
The page handed to us carried a cache age older than an hour. Nothing is broken today — the copy matches what the origin produces. It matters the moment you change something: an edit, a new price, a corrected phone number stays invisible to every visitor and every crawler for about that long, and nothing in your dashboard says so.
Change since last scan — 24 scans on record
Comparing against 2026-08-14T03:07:58.647Z.
Measure
Then
Now
Change
Overall score
92/100
92/100
no change
Content ratio
18.8%
18.8%
no change
Stable @id coverage
78.3%
78.3%
no change
Render-blocking resources
18
18
no change
Page size
98 KB
98 KB
no change
Findings
0
1
+1 ✗
New: STALE_CACHE_SERVED
History keeps the last 24 scans of this domain. A finding that comes and goes is the pattern worth acting on: a permanent failure gets noticed, an intermittent one only shows up if something is looking at the right moment.
Machine layer — 100/100
100not measured
Measure
Currently
Optimal
robots.txt a crawler that cannot read robots.txt often treats that as disallow-everything
200 · 1509B
200, text/plain, 100–4,000B
✓
XML sitemap without it a crawler enumerates the site by following links only
live
200, valid XML, at a path robots.txt names
✓
llms.txt the emerging convention for handing an LLM a curated map of the site
21882B
200, text/plain, 2,000–50,000B
✓
entitymap.json machine-readable entity layer; optional, but it is the strongest identity signal available
171334B
200, application/json
✓
How rare is what this site publishes adoption counts are third-party aggregates read in August 2026 and count sites in that index rather than the whole web; they are here to size the opportunity, not to score the site
llms.txt — published by roughly 70,200 sites, and this is one of them. entitymap.json — no third-party adoption figure exists for it at all, and it has not appeared on any site scanned outside this portfolio. for scale, about 107,200 sites now disallow GPTBot outright, so an AI policy is mainstream while a machine-readable map of the site is not.
publish what almost nobody publishes, and keep it correct
n/a
Host agreement a crawler resolving www must not get a different machine layer
hosts agree
0 divergent files
✓
Cost of a miss every absent file bills the crawler for a full HTML 404
no oversized 404s
a missing machine file should 404 small, not ship a full page
✓
Hosts and URLs
/robots.txt
treeservicedenverllc.com: 200 · 1,509B live www.treeservicedenverllc.com: 301 → https://treeservicedenverllc.com/robots.txt
/llms.txt
treeservicedenverllc.com: 200 · 21,882B live www.treeservicedenverllc.com: 301 → https://treeservicedenverllc.com/llms.txt
/entitymap.json
treeservicedenverllc.com: 200 · 171,334B live www.treeservicedenverllc.com: 301 → https://treeservicedenverllc.com/entitymap.json
treeservicedenverllc.com: 200 · 694B live www.treeservicedenverllc.com: 301 → https://treeservicedenverllc.com/sitemap_index.xml
Probed with redirects not followed, so a 200 here means the file is served at that exact URL — a followed redirect would report a file that lives somewhere else.
Server and hosting — 80/100
80not measured
Measure
Currently
Optimal
Compression our fetch decompresses the body and drops the content-encoding header before we can read it — this is our limitation, not a finding about the site. Check it in a browser’s network panel, or with curl --compressed -I
not visible from here
br preferred, gzip acceptable
n/a
Edge / CDN absorbs crawler load and keeps machine files fast
Cloudflare
a CDN in front of the origin
✓
Cache state DYNAMIC means every crawler hit reaches the origin
DYNAMIC
HIT or MISS on machine files, never DYNAMIC
✗
Version disclosure a public CMS version tells an attacker exactly which exploits to try
not disclosed
no generator version in the HTML
✓
Runtime disclosure same reason as above
not disclosed
no x-powered-by header
✓
Vary governs whether a cached copy is reused correctly
Accept-Encoding
Accept-Encoding at minimum
✓
Server and hosting
Edge / CDN
Cloudflare what answers the request before the origin does
Origin server
cloudflare the server header the origin or edge declares
Application
WordPress, Elementor detected from the delivered HTML, not from a header that can be removed
Cache state
DYNAMIC HIT means this response never reached the origin — timings below measure the edge, not the server
Varies on
Accept-Encoding a response that varies can be cached differently per client
Schema and entity graph — 78/100
78not measured
Measure
Currently
Optimal
Entity nodes with no schema the site has no declared identity at all
23
at least 3 typed nodes
✓
Stable @id coverage without an @id every page declares a brand-new unrelated entity
78.3%
80–100%
✗
Credential edges the machine-readable form of why this business is qualified
3
at least 1 (licence, membership or award)
✓
Locations missing a street a service-area business legitimately omits this — not scored either way
1
0 for a premises business; expected for service-area
n/a
sameAs claims sameAs asserts identity, so a wrong target claims the business is something else
17
2–8, each resolving to this entity
✗
sameAs pointing at a place a map link in sameAs claims the business IS that location
0
0
✓
H1 count more than one h1 leaves no single subject for the page
1
exactly 1
✓
Heading skips a skipped level breaks the document outline a parser builds
0
0
✓
Canonical without it duplicates compete with each other
present
present on every page
✓
Meta description outside that range it is truncated or too thin to be used
145 chars
120–160 chars
✓
Schema and entity graph
Entities declared
23 nodes, 9 distinct types
Stable identity
18 of 23 carry an @id (78.3%) Without an @id a node cannot be referenced or merged — every page re-declares a new, unrelated entity.
Credential edges
3 (memberOf, founder) Licences, memberships and awards expressed as graph edges rather than prose.
Topic edges
17 A high count with generic values usually means the graph is being used to store keywords.
Locations
1 declared, 1 without a street address
sameAs claims
17 total · 0 map links · 0 resolve to this entity · 0 resolve to a place sameAs asserts identity. A map link pointing at a city claims the business is that city. No validator reports this — it only appears if the targets are resolved.
Answer engines allowed these fetch a page while composing a live reply
14 of 14
all of them
✓
Search indexes allowed classic index coverage still drives most discovery
10 of 10
all of them
✓
Training crawlers allowed blocking trainers while allowing answer engines is coherent, not a defect
43 of 43
your policy choice — not scored
n/a
Regional search engines allowed Naver, Sogou, 360 and Yisou matter if you sell into those markets and are irrelevant if you do not; that is a business fact we cannot read off the page
7 of 7
your policy choice — not scored
n/a
Social link previews allowed blocking these does not touch answer engines, it just makes your links render as bare URLs when anyone shares them
5 of 5
your policy choice — not scored
n/a
SEO and research crawlers allowed blocking a link-index crawler costs you competitor visibility, not answer-engine visibility — a different trade from the one above
13 of 13
your policy choice — not scored
n/a
robots.txt groups a second * group is invisible to parsers that stop at the first match
23
1 group per user-agent, no duplicate * group
✓
AI and search agents
Answer engines — fetch at question time — 14 of 14 allowed
OAI-SearchBot
allowed · ChatGPT search index · named rule
ChatGPT-User
allowed · ChatGPT live fetch · named rule
Claude-SearchBot
allowed · Claude search index · named rule
Claude-User
allowed · Claude live fetch · named rule
PerplexityBot
allowed · Perplexity index · named rule
Perplexity-User
allowed · Perplexity live fetch · named rule
Gemini-Deep-Research
allowed · Gemini research agent · wildcard rule
MistralAI-User
allowed · Le Chat live fetch · wildcard rule
DuckAssistBot
allowed · DuckDuckGo AI assist · named rule
YouBot
allowed · You.com · named rule
PhindBot
allowed · Phind · wildcard rule
Kagibot
allowed · Kagi · wildcard rule
Copilot-User
allowed · Microsoft Copilot fetch · wildcard rule
Meta-ExternalFetcher
allowed · Meta AI live fetch · named rule
Search indexes — 10 of 10 allowed
Googlebot
allowed · Google Search and AI Overviews · named rule
bingbot
allowed · Bing and Copilot index · named rule
Applebot
allowed · Apple and Siri · named rule
Amazonbot
allowed · Amazon · named rule
DuckDuckBot
allowed · DuckDuckGo · wildcard rule
YandexBot
allowed · Yandex · wildcard rule
Baiduspider
allowed · Baidu · wildcard rule
Seznambot
allowed · Seznam · wildcard rule
Neevabot
allowed · Neeva · wildcard rule
PetalBot
allowed · Huawei Petal · wildcard rule
Training / corpus crawlers — 43 of 43 allowed
Magpie-crawler
allowed · Magpie AI · wildcard rule
img2dataset
allowed · img2dataset image corpus · wildcard rule
AwarioRssBot
allowed · Awario RSS · wildcard rule
AwarioSmartBot
allowed · Awario smart · wildcard rule
TurnitinBot
allowed · Turnitin · wildcard rule
archive.org_bot
allowed · Internet Archive · wildcard rule
ia_archiver
allowed · Internet Archive (legacy) · wildcard rule
SEO and market-research crawlers — 13 of 13 allowed
AhrefsBot
allowed · Ahrefs link index · wildcard rule
SemrushBot
allowed · Semrush crawler · wildcard rule
MJ12bot
allowed · Majestic link index · wildcard rule
DotBot
allowed · Moz link index · wildcard rule
rogerbot
allowed · Moz site crawler · wildcard rule
DataForSeoBot
allowed · DataForSEO · wildcard rule
BLEXBot
allowed · WebMeUp link index · wildcard rule
CloudflareBrowserRenderingCrawler
allowed · Cloudflare Browser Run /crawl · wildcard rule
Cloudflare-AutoRAG
allowed · Cloudflare AutoRAG · wildcard rule
Peer39_Crawler
allowed · Peer39 ad context · wildcard rule
AdsBot-Google
allowed · Google Ads quality · wildcard rule
AmazonAdBot
allowed · Amazon Ads · wildcard rule
AdIdxBot
allowed · Microsoft Ads · wildcard rule
Regional search engines — 7 of 7 allowed
Yeti
allowed · Naver · wildcard rule
YoudaoBot
allowed · Youdao · wildcard rule
Exabot
allowed · Exalead · wildcard rule
Sogou web spider
allowed · Sogou · wildcard rule
YisouSpider
allowed · Yisou · wildcard rule
360Spider
allowed · 360 Search · wildcard rule
Sosospider
allowed · Soso · wildcard rule
Social link previews — 5 of 5 allowed
Twitterbot
allowed · X link preview · wildcard rule
LinkedInBot
allowed · LinkedIn link preview · wildcard rule
facebookexternalhit
allowed · Facebook link preview · wildcard rule
Pinterestbot
allowed · Pinterest · wildcard rule
Slackbot-LinkExpanding
allowed · Slack unfurl · wildcard rule
Blocking training crawlers while leaving answer engines allowed is a coherent policy, not a defect — it opts out of model training without costing live citations. Blocking an answer engine is a different decision and is reported separately.
Core Web Vitals (real visitors) — not scored
Measure
Currently
Optimal
Largest Contentful Paint (p75) how long a real visitor waits before the main thing on the page appears
—
2.5s or less
n/a
Interaction to Next Paint (p75) how long the page takes to respond after a real visitor taps something
—
200ms or less
n/a
Cumulative Layout Shift (p75) how much the page moves under a reader mid-read
—
0.1 or less
n/a
Time to First Byte (p75) the server half of every other number on this list
—
800ms or less
n/a
CrUX holds no field data for this origin, which means too few Chrome visits to publish — not a verdict on speed These are the 75th percentile of what real Chrome users experienced over the last 28 days, not a test run from here — the thresholds are Google’s published ones, the only ones that are. Nothing is scored from an absent measurement.
Payload and render path — 20/100
20not measured
Measure
Currently
Optimal
Content ratio the rest is markup a model must read and discard
18.8%
20–100% of delivered bytes are visible text
✗
Delivered bytes large pages are fetched less often and truncated more
100,599B
under 500,000B
✓
Inline JavaScript inline JS is pure overhead to a text-extracting crawler
23,775B
under 20,000B
✗
Render-blocking resources each one delays first paint and the crawler's render budget
18
0–5
✗
Deferred vs blocking scripts a blocking script stops HTML parsing dead
2 deferred / 2 blocking
every script deferred or async
✗
Where the bytes go
Visible text
18,954 B
18.8%
Inline CSS
1,822 B
1.8%
Inline JavaScript
23,775 B
23.6%
Structured data
12,926 B
12.8%
Markup and attributes
37,414 B
37.2%
Render-blocking resources
18
16 stylesheets, 2 scripts
Entities with a stable @id
18 / 23
78.3%
Credential edges
3
memberOf, founder
Machine-file trust chain — 100/100
100not measured
Measure
Currently
Optimal
robots.txt was readable every other file in the chain is normally discovered through robots.txt
yes
200, text/plain
✓
robots.txt names a sitemap a crawler that has to guess the sitemap path often does not find it
2 Sitemap: line(s)
at least one
✓
robots.txt points at llms.txt an llms.txt nothing links to is only reachable by guessing the conventional path
named
named when the file exists
✓
llms.txt links stay on this host an off-host URL in your llms.txt sends the model to someone else's page as if it were yours
78 links · 0 off-host
most links on this host
✓
llms.txt points onward the chain should keep going: llms.txt is a map, not a terminus
names sitemap or entity graph
names the sitemap or the entity graph
✓
entitymap.json parses as JSON a machine file that does not parse is worth less than one that is absent, because it looks present
valid
valid JSON
✓
entity graph references this host a graph that never names this site is describing something else
yes
yes
✓
Canonical points at this host a canonical on another host hands the page's standing to that host
same host
same host as the one serving the page
✓
Canonical uses https an http canonical invites a redirect chain on every crawl
A ✗ breaks the chain at that point: everything downstream is only reachable by a crawler guessing the conventional path.
Claim consistency — 100/100
100not measured
Measure
Currently
Optimal
The schema declares an entity for this site an entity graph that names only other companies gives an answer engine nothing to attach this site to
yes, an organisation
one Organization, LocalBusiness or Person whose url is this host
✓
Schema business name appears on the page an answer engine ingests the assertion and never compares it to the page, so a stale one is repeated for months
yes
the name the schema asserts is the name a reader sees
✓
Schema strings are not HTML-escaped a JSON string is not an HTML context: the entity is read literally, so the business name contains the characters a-m-p
clean
no & or ' inside a JSON-LD value
✓
Schema phone appears on the page a phone number that exists only in the markup is the one an assistant will read out
yes
the same 10 digits
✓
Schema locality appears on the page a locality nobody states on the page is a claim with no support behind it
yes
the declared town or city is named in the copy
✓
Experience claim is backed by the schema a datable claim in the copy that the structured data contradicts is the cheapest thing in an audit to disprove
—
the copy and foundingDate agree within a year
n/a
Checked against the page’s own visible text, with no extra request. Node type: LocalBusiness, HomeAndConstructionBusiness.
Agent instruction surface — 100/100
100not measured
Measure
Currently
Optimal
No agent-directed instructions in machine-only surfaces hidden text, comments, alt attributes and llms.txt are read by a machine and proofread by nobody
16 surface(s) read, nothing matched
0 matches
✓
No hidden block over 50 words an agent ingests hidden copy at full weight while a reader never sees it
none
0 blocks
✓
Agent-instruction file (agents.md) the file agents are told to obey, as distinct from llms.txt which is the content map. Every Shopify store now ships one; adoption elsewhere is early, so its absence is not a defect — but if you publish one, everything in it is read as instruction
404
your choice — not scored
n/a
This reports EXPOSURE, not intent. Most hidden text is an old SEO habit or a collapsed menu, and a match here is a prompt to go and read it — not a finding that someone attacked the site. llms.txt was included in the scan.
What each agent receives — 100/100
100not measured
Measure
Currently
Optimal
Every identity gets a response a request that dies is indistinguishable from a site that is down, to the agent making it
all 6 answered
0 silent
✓
No answer engine is refused a 403 to GPTBot is the whole answer to why a site is never cited
none refused
0 refusals
✓
No answer engine is handed an interstitial a challenge at HTTP 200 looks fine to a status check and contains no content at all
none
0 challenge pages
✓
Crawlers get what an unnamed client gets these fetches send a crawler's user-agent from OUR address, which is not in the range that operator publishes — so a split has two readings, cloaking or correct spoof-rejection, and only the operator can settle which
browser-gated, not identity-gated
no identity split
✓
No identity is sent to a different URL a bot-only redirect quietly removes the page an answer engine was asked to read
none
0 redirected
✓
Same x-robots-tag for every identity a bot-only noindex removes the page from search while the site looks perfectly fine in a browser, and nothing else checks it
consistent
no identity-specific header
✓
Answer engines get the same text as a browser the page a browser renders is not evidence about the page an answer engine was given
100% of the browser's words
90-100%
✓
Stated robots policy matches actual behaviour robots.txt is a promise and the edge is the behaviour; neither one on its own can tell you they disagree
no conflicts
0 conflicts
✓
One URL, seven fetches in the same second — an unnamed client, four named crawlers, a mobile browser, and the browser again as a control. The control fetches agreed (self-similarity 1), so text differences below are differences, not noise. A user-agent is a claim, including when we are the one making it.
crawler and unnamed client agree with each other and both differ from the browser: this is browser-vs-non-browser, not crawler cloaking. Blocking or unblocking user-agents will not change it.
Identity
Status
Words
Same text
What happened
Unnamed client
200
2895
0.84
different body text
GPTBot
200
2895
0.84
different body text
ClaudeBot
200
2895
0.84
different body text
PerplexityBot
200
2895
0.84
different body text
Googlebot
200
2895
0.84
different body text
Mobile browser
200
2895
1
Per-engine retrieval. Each answer engine reads through named crawlers with different jobs — one builds the index, one fetches live when a user asks, one collects training data. They are separate permissions and a site commonly grants one and refuses another. Nothing here is scored: these same facts are already scored once above, and this measures what an engine is permitted and given — never what a model has retained or would cite, which no scanner can see from outside.
Engine
Index
Live fetch
Training
What the edge actually did
Addressed by name
ChatGPT
✓ allowed
✓ allowed
✓ allowed
✓ served 2895 words
— not named
Claude
✓ allowed
✓ allowed
✓ allowed
✓ served 2895 words
— not named
Perplexity
✓ allowed
✓ allowed
— —
✓ served 2895 words
— not named
Google AI Overviews / Gemini
✓ allowed
✓ allowed
✓ allowed
✓ served 2895 words
— not named
Microsoft Copilot
✓ allowed
✓ allowed
— —
— not probed
— not named
Apple Intelligence
✓ allowed
— —
✓ allowed
— not probed
— not named
Meta AI
✓ allowed
✓ allowed
✓ allowed
— not probed
— not named
Amazon
✓ allowed
— —
— —
— not probed
— not named
DuckAssist
✓ allowed
— —
— —
— not probed
— not named
Mistral
— —
✓ allowed
— —
— not probed
— not named
Common Crawl (feeds many models)
— —
— —
✓ allowed
— not probed
— not named
A blocked training column beside an allowed index column is coherent policy, not a defect: it says "answer with me, do not train on me." The last column is whether your llms.txt or agents.md addresses that engine by name — robots.txt is a permission, those two files are where an operator actually talks to an agent. Naming nobody is the norm and is not scored.
Mobile surface — 100/100
100not measured
Measure
Currently
Optimal
Images and embeds with dimensions declared Media without width and height reserves no space, so everything below it moves when the image lands. This is read from the markup and is a risk indicator, not a measured CLS value — the real number needs a real page load.
9 of 10
10% unsized — not scored
n/a
Viewport meta without it a phone renders the desktop layout scaled down, and that is what a mobile crawler records
width=device-width
width=device-width, initial-scale=1
✓
Zoom is not locked locking zoom is an accessibility failure and a one-line fix
readers can zoom
no user-scalable=no, no maximum-scale under 1.5
✓
Apple touch icon what a saved-to-homescreen shortcut and several share surfaces use
declared
one apple-touch-icon link
✓
Theme colour sets the browser chrome on mobile; its absence is the cheapest visible gap on this list
declared
a theme-color meta
✓
Beyond the basics almost every site declares a viewport and almost none declare the rest, so this row is where a site separates itself rather than a place it loses points
none beyond viewport
not scored — these are differentiators, not defects
n/a
Local presence, citations and NAP — 100/100
100not measured
Measure
Currently
Optimal
Links to its Google Business Profile the profile and the site are one entity to an answer engine, and this link is the only bridge between them it can see
yes
a g.page, maps.app.goo.gl or maps place URL
✓
That profile link resolves a dead profile link is worse than none: it asserts an identity that cannot be checked. A 429 or 403 here is Google throttling our check, not a fault on your site, and is left unscored
200 → www.google.com
200 on a Google host
✓
Street address in the structured data a service-area business legitimately omits this, so an absence is reported and not scored against you
absent
declared for a premises business
n/a
Geo coordinates coordinates are how a machine ties the entity to a place without parsing an address string
declared
latitude and longitude
✓
Opening hours “are they open now” is one of the most common questions an assistant is asked about a local business
declared
openingHours or openingHoursSpecification
✓
Telephone in the structured data the number an assistant reads out comes from here, not from the page
declared
declared
✓
Coordinates are usable two decimal places is about a kilometre — fine for a city, useless for a storefront someone is being driven to
1 pair(s), full precision
in range, not 0,0, at least 3 decimal places
✓
Each location has its own coordinates one centroid copied onto every branch tells an assistant they are all the same place
—
no two locations share a point
n/a
Coordinates match the declared address the address and the point are two independent claims about one place, and nothing else on the web compares them
no Mapbox token is set, so the address was not geocoded
within 500m
n/a
Location entities declared more location entities than real listings is the single most common way a local entity graph goes wrong
1
1 per real premises — not scored
n/a
City on the page vs declared address the place a page markets and the place it declares are the same, so an engine has nothing to reconcile
both say Denver
reported, not scored
n/a
Business name in structured data two spellings of a legal name are two entities to a retrieval system, and it cannot tell which one you are
Tree Service Denver LLC
exactly one spelling
✓
Phone numbers a machine can read an assistant dictating a number has to pick one; a second number is usually an old one that still rings somewhere
+17208072785
exactly one number
✓
Postal address in structured data two addresses split the entity across two places
Denver, CO
one address, or none for a service-area business
✓
Profiles the site claims sameAs is an identity claim: every link says this business IS the thing at that URL
14
the profiles you actually own
✓
Directory listings declared reported, not scored — how many citations a business needs is a marketing judgement, not a measurement
6
the ones that matter for your trade
n/a
Checked because this site declares a local business entity (LocalBusiness, HomeAndConstructionBusiness). This measures the site side of Google Business Profile alignment — whether the business points at its own profile and carries the fields a profile is matched on. It does not read the profile itself: that needs an API key, and inventing facts about a listing we cannot see would be worse than reporting nothing. Profile link found: https://www.google.com/maps?cid=14749103202244858660.
Every profile below is one the site itself declares in sameAs. Nothing here was discovered by guessing at directories — undeclared listings need an index this scan does not have.
Ten sources an answer engine is likely to reach for when asked about a local business, checked against what this site declares. Declared means the site names the profile in its own structured data — the only thing this scan can verify. A listing that exists but is not declared will read as missing here, and that is itself worth fixing: an engine reading your site has no way to find it either.
Yelp the single most-cited local source in AI answers after Google itself
declared
BBB trust signal, and one of the few directories with a verification process an engine can lean on
not declared
Facebook carries hours and phone, and is read by several engines as a primary source
declared
Nextdoor hyperlocal, and disproportionately cited for home services
declared
Thumbtack category-specific lead surface for trades
declared
Angi category-specific, still heavily indexed
not declared
Bing Places feeds Copilot and, historically, several ChatGPT retrievals
declared
Apple Maps the default map on every iPhone, and invisible to most SEO tooling
declared
Trustpilot review corpus that answer engines quote directly
declared
Yellow Pages low value alone, but a cheap consistency anchor
not declared
3 of 10 are not declared. Each one is a place a retrieval system could have found a second, independent statement of your name, address and phone — and the agreement between those statements is what makes any of them trustworthy.
Machine layer over time. Our own history of a site starts the first time we scanned it; the Internet Archive holds what came before. Nothing here is scored — a site’s past is not a defect, and the Archive’s coverage is uneven, so a missing snapshot says nothing about the site.
Archived robots.txt versions
2 distinct, 2024-02-26 → 2024-06-12
Earliest copy named an AI crawler
no — the site names 19 today, so that policy was written after 2024-02-26
A sitemap was readable a sitemap is the only place a crawler learns about pages nothing links to
77 URLs declared
at least one sitemap resolves and parses
✓
Sitemaps named in robots.txt resolve a robots.txt pointing at a dead sitemap sends every crawler to a 404
none named
every named sitemap returns 200
n/a
Homepage links are declared in the sitemap a page missing from the sitemap is still findable by following links; a page missing from both is findable by nothing
0 linked but undeclared
0 undeclared
✓
Sampled declared URLs resolve a sitemap that lists dead URLs spends a crawler's budget on nothing
0 of 6 broken
0 broken
✓
Sampled declared URLs are final declaring the pre-redirect URL makes every crawl pay an extra hop
0 of 6 redirect
0 redirects
✓
URLs declared in the sitemap
77
Internal links on the homepage
59
Linked but not declared
0
Declared URLs sampled
6 checked · 0 did not resolve · 0 redirected
This compares the sitemap against the links on the homepage only, so it finds pages the sitemap omits — it cannot prove a declared page is unreachable, because that needs a full crawl. The reverse gap (declared but linked from nowhere) is real and is not measured here. A page missing from the sitemap is still findable by following links; a page missing from both is findable by nothing.
Internal linking — 100/100
100not measured
Measure
Currently
Optimal
Internal links on this page a page that links nowhere is a dead end for a crawler following your own structure
138
enough to reach the pages that matter
✓
Distinct destinations a navigation repeated in a header and a footer counts twice and reaches the same places
60 of 138 links
most links going somewhere different
✓
Anchor text that says nothing anchor text is the one description of a destination that a machine reads before deciding to follow it
0
zero
✓
Links with no words at all an icon or bare image link is silent — a screen reader and a crawler both get nothing
0
zero
✓
Internal links marked nofollow telling a crawler not to follow your own pages is almost always a plugin default nobody chose
0
zero
✓
External links outbound links are an editorial choice, not a defect
8
reported, not scored
n/a
Naming and case consistency — 100/100
100not measured
Measure
Currently
Optimal
Hostname case hostnames are case-insensitive but mixed case splits logs and analytics
lowercase
always lowercase
✓
Path case paths ARE case-sensitive on most origins, so /About and /about are two URLs to a crawler
all lowercase
100% lowercase
✓
Machine file names these filenames are fixed by convention and are not looked up case-insensitively
robots.txt, llms.txt, sitemap.xml
exact lowercase spelling
✓
How this compares — 29 all sites measured (early benchmark)
Measure
This site
Corpus median
Rank
Overall score
92
79
95th percentile
Content ratio (% visible text)
18.8
4.2
96th percentile
Stable @id coverage (%)
78.3
55.8
74th percentile
Render-blocking resources
18
8
44th percentile
Delivered page size (KB)
98
218
85th percentile
Percentiles come from sites this scanner has measured itself, not from a published study — so they describe this corpus, not the web. The corpus is not a random sample and is weighted toward sites that were submitted or seeded, which is why the rank is shown next to the raw number rather than instead of it. A metric is left blank rather than ranked when fewer than 8 peers carry it. Only 3 comparable site(s) of this kind have been measured, which is below the 8 needed for a cohort rank, so this is ranked against the whole corpus of 29 instead. The pool is still under 30 sites, so treat the rank as an early benchmark rather than a settled percentile.
Watch this site
These break silently and come back on their own. We re-check this site every week and record every change against a fingerprint of the last result, so nothing is missed between visits.
Email delivery is not connected yet — changes are being recorded now and the first alert goes out the day it is. We would rather say that than promise an email we cannot send.