CrawlCheck

Scan result

treeservicedenverllc.com

2026-08-14T04:21:08.227Z · cloudflare

Grade

CAI visibility 90/100
Reach 100 · Read 73 · Quote 93
Findings: 1 (worst: medium)
SectionScoreWeight
Machine layer100/1001.5
Server and hosting80/1000.6
Schema and entity graph78/1001.2
AI and search agents100/1001.2
Payload and render path20/1001
Machine-file trust chain100/1001.5
Claim consistency100/1001.3
Agent instruction surface100/1001
What each agent receives100/1001.5
Mobile surface100/1000.8
Local presence, citations and NAP100/1001.3
Sitemap coverage100/1001.2
Internal linking100/1001
Naming and case consistency100/1000.4

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 thisSectionCurrentlyPoints
Content ratioPayload and render path18.8%+1.3
Deferred vs blocking scriptsPayload and render path2 deferred / 2 blocking+1.3
Inline JavaScriptPayload and render path23,775B+1.3
Render-blocking resourcesPayload and render path18+1.3
Stable @id coverageSchema and entity graph78.3%+0.9
sameAs claimsSchema and entity graph17+0.9
Cache stateServer and hostingDYNAMIC+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.

AI visibility 90 out of 100

Paste this where you want it:

<a href="https://crawlcheck.io/r/7wmwglweo1"><img src="https://crawlcheck.io/badge/7wmwglweo1.svg" alt="AI visibility 90/100, measured by CrawlCheck" width="228" height="64"></a>

How the score was reached

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.

StageQuestionScore
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 pageGPTBot · 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 report’s digestf60f0e57ee9db2b9e4706afdac3dfbe137bf50142370114dd4dfd1ab01339a58
Rootthis 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.

LookupOutcomeWhose limitationWhy
Off-site presence (directories, reviews, Google Business Profile)unreachedoursthis 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 compressionunreachedoursour 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)refusedtheirs, aimed at usthe 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 apart 80 / 100
componentweight scoremeasured
Machine filesx3 100 robots.txt, llms.txt, sitemap and entitymap as scored above
Payload — content ratiox3 100 18.8% of delivered bytes are visible text (byte-level; the deep audit scores tokens per KB separately)
Render pathx2 0 18 render-blocking resources
Document structurex2 100 0 heading skips, 1 h1
User clarity — can a reader tell what this is and who it belongs to 91 / 100
componentweight scoremeasured
Entity identityx3 78 78.3% of 23 entities carry a stable @id
Declared standingx2 100 3 credential edges
Location coherencex3 one location with no street address — a service-area business, which Google asks to hide it. Not scored.
Identity claimsx2 no map identity links
Page labellingx2 100 145-char description, canonical present

2 components not measured and excluded from the score — an unmeasured component is never counted as zero.

PathStatusContent typeBytesEdge
/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.

MeasureThenNowChange
Overall score92/10092/100no change
Content ratio18.8%18.8%no change
Stable @id coverage78.3%78.3%no change
Render-blocking resources1818no change
Page size98 KB98 KBno change
Findings01+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
100 not measured
MeasureCurrentlyOptimal
robots.txt
a crawler that cannot read robots.txt often treats that as disallow-everything
200 · 1509B200, text/plain, 100–4,000B
XML sitemap
without it a crawler enumerates the site by following links only
live200, valid XML, at a path robots.txt names
llms.txt
the emerging convention for handing an LLM a curated map of the site
21882B200, text/plain, 2,000–50,000B
entitymap.json
machine-readable entity layer; optional, but it is the strongest identity signal available
171334B200, 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 correctn/a
Host agreement
a crawler resolving www must not get a different machine layer
hosts agree0 divergent files
Cost of a miss
every absent file bills the crawler for a full HTML 404
no oversized 404sa missing machine file should 404 small, not ship a full page

Hosts and URLs

/robots.txttreeservicedenverllc.com: 200 · 1,509B live
www.treeservicedenverllc.com: 301 → https://treeservicedenverllc.com/robots.txt
/llms.txttreeservicedenverllc.com: 200 · 21,882B live
www.treeservicedenverllc.com: 301 → https://treeservicedenverllc.com/llms.txt
/entitymap.jsontreeservicedenverllc.com: 200 · 171,334B live
www.treeservicedenverllc.com: 301 → https://treeservicedenverllc.com/entitymap.json
/sitemap.xmltreeservicedenverllc.com: 301 → https://treeservicedenverllc.com/sitemap_index.xml
www.treeservicedenverllc.com: 301 → https://treeservicedenverllc.com/sitemap.xml
/sitemap_index.xmltreeservicedenverllc.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
80 not measured
MeasureCurrentlyOptimal
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 herebr preferred, gzip acceptablen/a
Edge / CDN
absorbs crawler load and keeps machine files fast
Cloudflarea CDN in front of the origin
Cache state
DYNAMIC means every crawler hit reaches the origin
DYNAMICHIT or MISS on machine files, never DYNAMIC
Version disclosure
a public CMS version tells an attacker exactly which exploits to try
not disclosedno generator version in the HTML
Runtime disclosure
same reason as above
not disclosedno x-powered-by header
Vary
governs whether a cached copy is reused correctly
Accept-EncodingAccept-Encoding at minimum

Server and hosting

Edge / CDNCloudflare
what answers the request before the origin does
Origin servercloudflare
the server header the origin or edge declares
ApplicationWordPress, Elementor
detected from the delivered HTML, not from a header that can be removed
Cache stateDYNAMIC
HIT means this response never reached the origin — timings below measure the edge, not the server
Varies onAccept-Encoding
a response that varies can be cached differently per client
Schema and entity graph — 78/100
78 not measured
MeasureCurrentlyOptimal
Entity nodes
with no schema the site has no declared identity at all
23at 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
3at least 1 (licence, membership or award)
Locations missing a street
a service-area business legitimately omits this — not scored either way
10 for a premises business; expected for service-arean/a
sameAs claims
sameAs asserts identity, so a wrong target claims the business is something else
172–8, each resolving to this entity
sameAs pointing at a place
a map link in sameAs claims the business IS that location
00
H1 count
more than one h1 leaves no single subject for the page
1exactly 1
Heading skips
a skipped level breaks the document outline a parser builds
00
Canonical
without it duplicates compete with each other
presentpresent on every page
Meta description
outside that range it is truncated or too thin to be used
145 chars120–160 chars

Schema and entity graph

Entities declared23 nodes, 9 distinct types
Stable identity18 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 edges3 (memberOf, founder)
Licences, memberships and awards expressed as graph edges rather than prose.
Topic edges17
A high count with generic values usually means the graph is being used to store keywords.
Locations1 declared, 1 without a street address
sameAs claims17 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.
Document structure1 h1 · 40 headings · 0 level skips · canonical present · meta description 145 chars
AI and search agents — 100/100
100 not measured
MeasureCurrentlyOptimal
Answer engines allowed
these fetch a page while composing a live reply
14 of 14all of them
Search indexes allowed
classic index coverage still drives most discovery
10 of 10all of them
Training crawlers allowed
blocking trainers while allowing answer engines is coherent, not a defect
43 of 43your policy choice — not scoredn/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 7your policy choice — not scoredn/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 5your policy choice — not scoredn/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 13your policy choice — not scoredn/a
robots.txt groups
a second * group is invisible to parsers that stop at the first match
231 group per user-agent, no duplicate * group

AI and search agents

Answer engines — fetch at question time — 14 of 14 allowed
OAI-SearchBotallowed · ChatGPT search index · named rule
ChatGPT-Userallowed · ChatGPT live fetch · named rule
Claude-SearchBotallowed · Claude search index · named rule
Claude-Userallowed · Claude live fetch · named rule
PerplexityBotallowed · Perplexity index · named rule
Perplexity-Userallowed · Perplexity live fetch · named rule
Gemini-Deep-Researchallowed · Gemini research agent · wildcard rule
MistralAI-Userallowed · Le Chat live fetch · wildcard rule
DuckAssistBotallowed · DuckDuckGo AI assist · named rule
YouBotallowed · You.com · named rule
PhindBotallowed · Phind · wildcard rule
Kagibotallowed · Kagi · wildcard rule
Copilot-Userallowed · Microsoft Copilot fetch · wildcard rule
Meta-ExternalFetcherallowed · Meta AI live fetch · named rule
Search indexes — 10 of 10 allowed
Googlebotallowed · Google Search and AI Overviews · named rule
bingbotallowed · Bing and Copilot index · named rule
Applebotallowed · Apple and Siri · named rule
Amazonbotallowed · Amazon · named rule
DuckDuckBotallowed · DuckDuckGo · wildcard rule
YandexBotallowed · Yandex · wildcard rule
Baiduspiderallowed · Baidu · wildcard rule
Seznambotallowed · Seznam · wildcard rule
Neevabotallowed · Neeva · wildcard rule
PetalBotallowed · Huawei Petal · wildcard rule
Training / corpus crawlers — 43 of 43 allowed
Magpie-crawlerallowed · Magpie AI · wildcard rule
img2datasetallowed · img2dataset image corpus · wildcard rule
AwarioRssBotallowed · Awario RSS · wildcard rule
AwarioSmartBotallowed · Awario smart · wildcard rule
TurnitinBotallowed · Turnitin · wildcard rule
archive.org_botallowed · Internet Archive · wildcard rule
ia_archiverallowed · Internet Archive (legacy) · wildcard rule
meta-webindexerallowed · Meta web index · wildcard rule
omgiliallowed · Webz.io omgili · wildcard rule
cohere-training-data-crawlerallowed · Cohere training corpus · wildcard rule
PanguBotallowed · Huawei PanGu · wildcard rule
Ai2Bot-Dolmaallowed · Allen Institute Dolma · wildcard rule
FriendlyCrawlerallowed · FriendlyCrawler ML · wildcard rule
VelenPublicWebCrawlerallowed · Velen · wildcard rule
MyCentralAIScraperBotallowed · MyCentral AI · wildcard rule
DeepSeekBotallowed · DeepSeek · wildcard rule
ICC-Crawlerallowed · NICT ICC · wildcard rule
GoogleOtherallowed · Google non-search fetch · wildcard rule
Google-CloudVertexBotallowed · Vertex AI agent build · wildcard rule
GPTBotallowed · OpenAI training and index · named rule
ClaudeBotallowed · Anthropic training · named rule
anthropic-aiallowed · Anthropic legacy agent · named rule
Claude-Weballowed · Anthropic legacy agent · wildcard rule
Google-Extendedallowed · Gemini training · named rule
Applebot-Extendedallowed · Apple training · named rule
CCBotallowed · Common Crawl · named rule
Bytespiderallowed · ByteDance · named rule
meta-externalagentallowed · Meta AI training · named rule
FacebookBotallowed · Meta legacy · wildcard rule
cohere-aiallowed · Cohere · named rule
Diffbotallowed · Diffbot knowledge graph · wildcard rule
Omgilibotallowed · Webz.io · wildcard rule
ImagesiftBotallowed · Imagesift · wildcard rule
Timpibotallowed · Timpi · wildcard rule
AI2Botallowed · Allen Institute · wildcard rule
Scrapyallowed · Generic scraper framework · wildcard rule
SemrushBot-OCOBallowed · Semrush AI corpus · wildcard rule
Applebot-Extended-Adsallowed · Apple ads corpus · named rule
TikTokSpiderallowed · TikTok · wildcard rule
QuillBotallowed · QuillBot · wildcard rule
Webzio-Extendedallowed · Webz.io extended · wildcard rule
ProRataIncallowed · ProRata · wildcard rule
AwarioBotallowed · Awario · wildcard rule
SEO and market-research crawlers — 13 of 13 allowed
AhrefsBotallowed · Ahrefs link index · wildcard rule
SemrushBotallowed · Semrush crawler · wildcard rule
MJ12botallowed · Majestic link index · wildcard rule
DotBotallowed · Moz link index · wildcard rule
rogerbotallowed · Moz site crawler · wildcard rule
DataForSeoBotallowed · DataForSEO · wildcard rule
BLEXBotallowed · WebMeUp link index · wildcard rule
CloudflareBrowserRenderingCrawlerallowed · Cloudflare Browser Run /crawl · wildcard rule
Cloudflare-AutoRAGallowed · Cloudflare AutoRAG · wildcard rule
Peer39_Crawlerallowed · Peer39 ad context · wildcard rule
AdsBot-Googleallowed · Google Ads quality · wildcard rule
AmazonAdBotallowed · Amazon Ads · wildcard rule
AdIdxBotallowed · Microsoft Ads · wildcard rule
Regional search engines — 7 of 7 allowed
Yetiallowed · Naver · wildcard rule
YoudaoBotallowed · Youdao · wildcard rule
Exabotallowed · Exalead · wildcard rule
Sogou web spiderallowed · Sogou · wildcard rule
YisouSpiderallowed · Yisou · wildcard rule
360Spiderallowed · 360 Search · wildcard rule
Sosospiderallowed · Soso · wildcard rule
Social link previews — 5 of 5 allowed
Twitterbotallowed · X link preview · wildcard rule
LinkedInBotallowed · LinkedIn link preview · wildcard rule
facebookexternalhitallowed · Facebook link preview · wildcard rule
Pinterestbotallowed · Pinterest · wildcard rule
Slackbot-LinkExpandingallowed · 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
MeasureCurrentlyOptimal
Largest Contentful Paint (p75)
how long a real visitor waits before the main thing on the page appears
2.5s or lessn/a
Interaction to Next Paint (p75)
how long the page takes to respond after a real visitor taps something
200ms or lessn/a
Cumulative Layout Shift (p75)
how much the page moves under a reader mid-read
0.1 or lessn/a
Time to First Byte (p75)
the server half of every other number on this list
800ms or lessn/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
20 not measured
MeasureCurrentlyOptimal
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,599Bunder 500,000B
Inline JavaScript
inline JS is pure overhead to a text-extracting crawler
23,775Bunder 20,000B
Render-blocking resources
each one delays first paint and the crawler's render budget
180–5
Deferred vs blocking scripts
a blocking script stops HTML parsing dead
2 deferred / 2 blockingevery script deferred or async

Where the bytes go

Visible text18,954 B 18.8%
Inline CSS1,822 B 1.8%
Inline JavaScript23,775 B 23.6%
Structured data12,926 B 12.8%
Markup and attributes37,414 B 37.2%
Render-blocking resources18 16 stylesheets, 2 scripts
Entities with a stable @id18 / 23 78.3%
Credential edges3 memberOf, founder
Machine-file trust chain — 100/100
100 not measured
MeasureCurrentlyOptimal
robots.txt was readable
every other file in the chain is normally discovered through robots.txt
yes200, 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
namednamed 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-hostmost 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 graphnames 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
validvalid JSON
entity graph references this host
a graph that never names this site is describing something else
yesyes
Canonical points at this host
a canonical on another host hands the page's standing to that host
same hostsame host as the one serving the page
Canonical uses https
an http canonical invites a redirect chain on every crawl
httpshttps

robots.txt ✓ → sitemap ✓ → llms.txt ✓ → entitymap.json ✓

A ✗ breaks the chain at that point: everything downstream is only reachable by a crawler guessing the conventional path.

Claim consistency — 100/100
100 not measured
MeasureCurrentlyOptimal
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 organisationone 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
yesthe 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
cleanno &amp; or &#39; 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
yesthe same 10 digits
Schema locality appears on the page
a locality nobody states on the page is a claim with no support behind it
yesthe 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 yearn/a

Checked against the page’s own visible text, with no extra request. Node type: LocalBusiness, HomeAndConstructionBusiness.

Agent instruction surface — 100/100
100 not measured
MeasureCurrentlyOptimal
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 matched0 matches
No hidden block over 50 words
an agent ingests hidden copy at full weight while a reader never sees it
none0 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
404your choice — not scoredn/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
100 not measured
MeasureCurrentlyOptimal
Every identity gets a response
a request that dies is indistinguishable from a site that is down, to the agent making it
all 6 answered0 silent
No answer engine is refused
a 403 to GPTBot is the whole answer to why a site is never cited
none refused0 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
none0 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-gatedno 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
none0 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
consistentno 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 words90-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 conflicts0 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.

IdentityStatusWordsSame textWhat happened
Unnamed client20028950.84different body text
GPTBot20028950.84different body text
ClaudeBot20028950.84different body text
PerplexityBot20028950.84different body text
Googlebot20028950.84different body text
Mobile browser20028951

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.

EngineIndexLive fetchTrainingWhat the edge actually didAddressed 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
100 not measured
MeasureCurrentlyOptimal
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 1010% unsized — not scoredn/a
Viewport meta
without it a phone renders the desktop layout scaled down, and that is what a mobile crawler records
width=device-widthwidth=device-width, initial-scale=1
Zoom is not locked
locking zoom is an accessibility failure and a one-line fix
readers can zoomno user-scalable=no, no maximum-scale under 1.5
Apple touch icon
what a saved-to-homescreen shortcut and several share surfaces use
declaredone apple-touch-icon link
Theme colour
sets the browser chrome on mobile; its absence is the cheapest visible gap on this list
declareda 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 viewportnot scored — these are differentiators, not defectsn/a
Local presence, citations and NAP — 100/100
100 not measured
MeasureCurrentlyOptimal
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
yesa 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.com200 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
absentdeclared for a premises businessn/a
Geo coordinates
coordinates are how a machine ties the entity to a place without parsing an address string
declaredlatitude and longitude
Opening hours
“are they open now” is one of the most common questions an assistant is asked about a local business
declaredopeningHours or openingHoursSpecification
Telephone in the structured data
the number an assistant reads out comes from here, not from the page
declareddeclared
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 precisionin 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 pointn/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 geocodedwithin 500mn/a
Location entities declared
more location entities than real listings is the single most common way a local entity graph goes wrong
11 per real premises — not scoredn/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 Denverreported, not scoredn/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 LLCexactly 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
+17208072785exactly one number
Postal address in structured data
two addresses split the entity across two places
Denver, COone 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
14the profiles you actually own
Directory listings declared
reported, not scored — how many citations a business needs is a marketing judgement, not a measurement
6the ones that matter for your traden/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.

ProfileAnsweredYour phoneYour name
Yelp
https://www.yelp.com/biz/tree-service-denver-denver-8
not checked
Thumbtack
https://www.thumbtack.com/co/denver/tree-trimming/tree-servi
not checked
Trustpilot
https://www.trustpilot.com/review/treeservicedenverllc.com
not checked
Facebook
https://www.facebook.com/TreeServiceDenverLLC
not checked
YouTube
https://www.youtube.com/@TreeServiceDenverllc
not checked
TikTok
https://www.tiktok.com/@treeservicedenver
not checked
LinkedIn
https://www.linkedin.com/in/treeservicedenver/
not checked
Pinterest
https://www.pinterest.com/Treeservicedenverllc/
not checked
X
https://x.com/TreeServiceDenv
not checked
Apple Maps
https://maps.apple.com/place?place-id=IB72F4402C89BE2EE
not checked
Bing Places
https://www.bing.com/maps/search?mkt=en-us&ss=id.ypid%3AYNBE
not checked
Nextdoor
https://nextdoor.com/page/tree-service-denver-denver-co-1
not checked
trustindex.io
https://www.trustindex.io/reviews/treeservicedenverllc.com
not checked
local.yahoo.com
https://local.yahoo.com/info-228185559-tree-service-denver-d
not checked

Directory coverage

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 versions2 distinct, 2024-02-26 → 2024-06-12
Earliest copy named an AI crawlerno — the site names 19 today, so that policy was written after 2024-02-26
Earliest copy, first lineUser-agent: * Disallow: /wp-admin/ Allow: /wp-admin/admin-ajax.php Sitemap: https://treese
Archived llms.txtnone archived
Sitemap coverage — 100/100
100 not measured
MeasureCurrentlyOptimal
A sitemap was readable
a sitemap is the only place a crawler learns about pages nothing links to
77 URLs declaredat 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 namedevery named sitemap returns 200n/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 undeclared0 undeclared
Sampled declared URLs resolve
a sitemap that lists dead URLs spends a crawler's budget on nothing
0 of 6 broken0 broken
Sampled declared URLs are final
declaring the pre-redirect URL makes every crawl pay an extra hop
0 of 6 redirect0 redirects
URLs declared in the sitemap77
Internal links on the homepage59
Linked but not declared0
Declared URLs sampled6 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.

Naming and case consistency — 100/100
100 not measured
MeasureCurrentlyOptimal
Hostname case
hostnames are case-insensitive but mixed case splits logs and analytics
lowercasealways lowercase
Path case
paths ARE case-sensitive on most origins, so /About and /about are two URLs to a crawler
all lowercase100% lowercase
Machine file names
these filenames are fixed by convention and are not looked up case-insensitively
robots.txt, llms.txt, sitemap.xmlexact lowercase spelling
How this compares — 29 all sites measured (early benchmark)
MeasureThis siteCorpus medianRank
Overall score927995th percentile
Content ratio (% visible text)18.84.296th percentile
Stable @id coverage (%)78.355.874th percentile
Render-blocking resources18844th percentile
Delivered page size (KB)9821885th 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.

Change alerts only. Unsubscribe in one click.

Scan another domain

Export this result: JSON · CSV Same stored record as this page, so an export can never disagree with the report.