findable-audit report

https://findable.bordebat.fr/ · 2026-07-27
Overall score: 99 out of 100 — grade A 99 /100 · A
Grade A
Crawlers reach your pages, understand what they read, and the page holds up on its own — nothing structural stands in the way of being cited.

101 passed · 2 to fix · 6 pages

Pages audited: /en/, /fr/, /en/about/, /en/contact/, /fr/about/, /fr/contact/

100
Reachable
do crawlers get to the page?
98
Understood
do they understand what they read?
100
Usable
does the page hold up, for a human and for an agent?

Action plan

Top 2 fixes — best payoff first

  1. Identity grounded by sameAs links — List ≥2 official profile URLs in sameAs, including Wikipedia/Wikidata if available. +2 pts Moderate
  2. WebSite SearchAction — Add potentialAction SearchAction with a urlTemplate and query-input. +1 pts Moderate

Impact vs. effort

Impact vs. effort: 2 checks to fix, plotted by recoverable points and estimated effort Quick win Moderate Involved Identity grounded by sameAs links — +2 pts (Moderate) WebSite SearchAction — +1 pts (Moderate)

Moderate

half a day eachthe 2 of them: 99 → 100 (A)
Data Identity grounded by sameAs links — List ≥2 official profile URLs in sameAs, including Wikipedia/Wikidata if available. Learn more → +2 pts
How to do it
Examines the sameAs links and rewards having at least two official profiles, ideally one pointing to Wikipedia or Wikidata. Linking to these knowledge-graph anchors helps AI engines disambiguate your entity from others with the same name.
"sameAs": [
  "https://www.wikidata.org/wiki/QID",
  "https://www.linkedin.com/company/YOU",
  "https://www.google.com/maps/place/?q=place_id:PLACE_ID"
]
Data WebSite SearchAction — Add potentialAction SearchAction with a urlTemplate and query-input. Learn more → +1 pts
How to do it
For a WebSite entity, checks for a valid SearchAction whose urlTemplate contains {search_term_string} with a matching query-input. Google retired the sitelinks search box in November 2024, so this markup no longer buys a search-result feature; what it still does is declare a machine-readable entry point to your own search, which an agent can call to query the site directly.
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"WebSite","@id":"https://YOUR_DOMAIN/#website",
 "url":"https://YOUR_DOMAIN/","name":"YOUR_NAME",
 "potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint",
  "urlTemplate":"https://YOUR_DOMAIN/recherche?q={search_term_string}"},
  "query-input":"required name=search_term_string"}}
</script>

Core Web Vitals

INCONCLUSIVE CrUX field · mobile

Lighthouse lab: Perf 100/100 · FCP 961 ms · TBT 0 ms lab

Core Web Vitals are Google’s user-experience signals (loading, interactivity, visual stability). They affect both search ranking and how real visitors perceive the site. Field data reflects real Chrome users (CrUX); lab data is a single controlled test.

What these metrics mean

  • LCP (Largest Contentful Paint) — time until the main content is visible
  • INP (Interaction to Next Paint) — how quickly the page reacts to interactions
  • CLS (Cumulative Layout Shift) — visual stability (unexpected layout jumps)
  • TTFB (Time to First Byte) — server response time (a diagnostic — not one of the three official Core Web Vitals)

Every check, family by family

heuristic A bar we chose, not a standard: reasonable people can disagree, and effectiveness varies by site. Advice, not a defect.

Entity graph

The entity types your JSON-LD declares across the sampled pages, and the references between them — what an engine can assemble about you. Entities of the same type are grouped (×N); hover a box or an arrow for the detail. The uncapped per-entity graph is the --entity-graph export.

JSON-LD entity graph: 10 entity types, 12 references publisher isPartOf provider isPartOf about breadcrumb itemListElement isPartOf breadcrumb acceptedAnswer mainEntity contactPoint Organization — findable-audit — /en/, /fr/, /en/about/, /en/contact/, /fr/about/, /fr/contact/ findable-audit Organization WebSite — findable-audit — /en/, /fr/, /en/about/, /en/contact/, /fr/about/, /fr/contact/ findable-audit WebSite WebApplication — findable-audit — /en/, /fr/ findable-audit WebApplication WebPage — ×4 — /en/, /fr/, /en/contact/, /fr/contact/ WebPage ×4 BreadcrumbList — ×6 — /en/, /fr/, /en/about/, /en/contact/, /fr/about/, /fr/contact/ BreadcrumbList ×6 ListItem — ×10 — findable-audit · About · Contact — /en/, /fr/, /en/about/, /en/contact/, /fr/about/, /fr/contact/ ListItem ×10 WebPage, FAQPage — ×2 — /en/about/, /fr/about/ WebPage + FAQPage ×2 Question — ×8 — Is findable-audit free? · How is GEO different from SEO? · What do you keep about the sites I audit? — /en/about/, /fr/about/ Question ×8 Answer — ×8 — /en/about/, /fr/about/ Answer ×8 ContactPoint — ×2 — /en/contact/, /fr/contact/ ContactPoint ×2
The detail of the 8 scoring families

Category subscores

AI crawler access 100 16%
Answer-engine content 100 18%
Structured data & metadata 95 15%
Technical SEO 100 15%
On-page & content 100 12%
Performance & Core Web Vitals 100 10%
Accessibility 100 7%
Security & trust 100 7%

Where to regain points

Where to regain points Structured data & metadata: 95/100, −3 pts Data −3 pts 95/100 AI crawler access: 100/100, 0 pts AI access 0 pts 100/100 Answer-engine content: 100/100, 0 pts AI content 0 pts 100/100 Technical SEO: 100/100, 0 pts SEO 0 pts 100/100 On-page & content: 100/100, 0 pts On-page 0 pts 100/100 Performance & Core Web Vitals: 100/100, 0 pts Perf 0 pts 100/100 Accessibility: 100/100, 0 pts A11y 0 pts 100/100 Security & trust: 100/100, 0 pts Security 0 pts 100/100

AI crawler access (54/54)

For scale (Cloudflare Radar, informational only — not scored): major AI crawlers fetch far more than they ever send back as traffic — roughly 20,600 pages crawled per referral for ClaudeBot, about 1,300:1 for OpenAI’s bots. Worth weighing against the access choices below.

Everything passes in this family.

Show the 9 passing checks
PASS
A robots.txt existsrobots-exists
robots.txt found
Verifies that /robots.txt exists and is served as text/plain rather than an HTML fallback page. It is the first file search and AI crawlers request to learn what they may access, so a missing or misserved one leaves them without an explicit crawl policy or a pointer to your sitemap.
4/4
PASS
robots.txt is well-formedrobots-wellformed
robots.txt is well-formed
Checks that robots.txt is syntactically well-formed — plain text, only recognized directives (User-agent, Allow, Disallow, Sitemap…), and no Allow/Disallow before the first User-agent line. A malformed file is interpreted unpredictably by different crawlers, silently changing what they fetch.
4/4
PASS
Search crawlers allowedsearch-crawlers-allowed
search crawlers (Googlebot, Bingbot, *) allowed
Verifies that robots.txt does not block the traditional search crawlers (Googlebot, Bingbot, and the * default) from the root. A site-wide disallow on these agents removes the site from classic search, which most AI answer engines still lean on.
6/6
PASS
AI crawlers allowed in robots.txtai-crawlers-allowed
all AI crawlers (training + citation-time) allowed
Checks that robots.txt does not block AI crawlers, separating citation-time fetchers (a hard fail) from training-only bots (a softer warning). If a citation-time fetcher is disallowed, that assistant simply cannot read or cite your site in its live answers — the single highest-weighted check. Transparency note: robots.txt is honor-based — it only works if the crawler chooses to respect it. Neither this check nor any audit without server log access can confirm that a bot claiming to be "GPTBot" or "ClaudeBot" is authentic; only a server-side reverse-DNS lookup can do that. A green result here means the declared policy is correct, not that impersonation is impossible.
12/12
PASS
The homepage answershomepage-ok
homepage responds 200
Verifies the root URL responds with HTTP 200. If the homepage errors or is unreachable, crawlers have no entry point to index and assistants have nothing to cite.
6/6
PASS
robots.txt directives are sanerobots-directives
no blocking robots directives (X-Robots-Tag / meta robots)
Checks the homepage for blocking robots directives (noindex/noai) in the X-Robots-Tag header or the meta robots tag. Such a directive on the homepage tells search and AI crawlers to skip the page entirely, making it invisible in results and AI answers.
4/4
PASS
AI crawlers get the same pageai-serving-parity
same document served across 5 AI/mobile UA probe(s)
Refetches the homepage and a couple of sampled pages with AI-crawler user-agents (GPTBot, ClaudeBot) and a mobile browser, then compares HTTP status, body size, title and main content against the default fetch. It surfaces cloaking or edge bot-blocking — when a CDN/WAF hands AI crawlers a blocked, redirected or stripped-down document instead of the page a browser sees.
8/8
PASS
Snippet preview directivessnippet-preview-directives
preview directives set on 6 sampled page(s)
Checks whether pages allow full text, image and video previews (max-snippet, max-image-preview, max-video-preview) instead of restricting them with nosnippet or zero limits. Generous preview directives let search results and AI answers show rich excerpts of your content, improving click-through and citation.
4/4
PASS
Pages are indexablemeta-robots-noindex
no noindex on 6 sampled page(s)
Checks that sampled pages are not blocked from indexing by noindex/none in the meta robots tag or the X-Robots-Tag header (and flags header/meta conflicts and nofollow). A noindexed page is invisible to both search engines and AI crawlers, so it can never be found or cited.
6/6

Answer-engine content (77/77)

SKIP
Recent, machine-readable datescontent-freshness
no article-type pages to date
On article pages, checks for machine-readable, recent publish/modified dates (ISO-8601 in JSON-LD, meta tags, or <time>) no older than about 24 months. Fresh, clearly dated content signals reliability to search and AI answer engines.
0/5
SKIP
Named author (E-E-A-T)content-author-eeat
no article-type pages to attribute
On article pages, checks for a named Person author in JSON-LD plus a visible byline. Clear authorship is a core E-E-A-T signal that search and AI engines use to judge whether content is trustworthy.
0/5
Show the 19 passing checks
PASS
The /llms.txt orientation filellms-txt
llms.txt structured (summary + section + 5 descriptive links)
Checks that /llms.txt exists, is served as plain text, and is well-structured (an H1 title, a one-line summary, a "## section", and at least 5 descriptive same-origin links). This file is a curated map that helps AI answer engines discover and understand your most important pages. Honest caveat: llms.txt is a signal of unproven value — large 2025-26 studies (Ahrefs 137K sites, SE Ranking 300K, Otterly 62K, Trakkr 37.9K) measured no citation gain, adoption sits around 3.2%, and Google says it has zero ranking impact. It keeps a modest weight as a cheap bet; the value lies in the combined check set, not in this file alone. Since 2026, Chrome Lighthouse audits this file under its own "Agentic Browsing" category, and its 2026 sample found 96.8% of sites still have none — so a passing check here is a real, if modest, edge over most of the web.
10/10
PASS
The /llms-full.txt full-text filellms-full-txtheuristic
llms-full.txt has 2250 words under 30 headings
Checks that /llms-full.txt exists as plain text with substantial content (about 2000+ words under at least 2 headings). It gives AI crawlers the full text of your key pages in one clean file so they can quote and cite you accurately. Like llms.txt, it is a low-cost signal of unproven value — no large study has measured a citation gain from it — hence its small weight here.
4/4
PASS
Content visible without JavaScriptcontent-without-js
static text ≥200 chars on 6 sampled page(s)
Verifies each sampled page exposes at least 200 characters of visible text without running JavaScript. AI crawlers generally don't execute JS, so content that only appears after client-side rendering is invisible to them.
6/6
PASS
No empty client-side shellcsr-content-parity
server-rendered main content on 6 sampled page(s), no empty CSR mount roots
Inspects the raw HTML of each sampled page for an empty client-side mount root (#root, #__next, #app, <app-root>…) paired with almost no server-rendered text. Such pages only fill in once JavaScript runs, so AI crawlers — which generally don't execute JS — see a blank shell. Genuine SSR/SSG output that merely also ships framework markup is not penalized.
4/4
PASS
Enough substance per pagecontent-depthheuristic
main content above the word threshold on 6 page(s)
Checks that each page's main content meets a word-count threshold (≥300 words for articles, ≥150 for other pages). Thin pages give search and AI engines little substance to extract or cite.
5/5
PASS
A direct answer up frontcontent-lead-answerheuristic
direct-answer lead on 6 page(s)
Checks that each page opens with a concise direct answer or definition (≈40–320 characters), or a TL;DR block, right after the H1. Answer engines favor content that states the key point up front rather than burying it.
5/5
PASS
Subheadings phrased as questionsanswer-headingsheuristic
question-style subheadings on 4 long page(s)
On long pages (≥300 words), checks that at least one H2/H3 is phrased as a question (starts with what/how/why… or ends with "?"). Question-style headings mirror how people query AI assistants and make passages easy to lift as answers.
4/4
PASS
Lists and tables, not a wall of proseextractable-structureheuristic
lists/tables in main content on 6 substantial page(s)
On substantial pages (≥150 words), checks for lists (<ul>/<ol>) or data tables with <th> headers in the main content. Structured content is far easier for AI engines to parse and reuse than an unbroken wall of prose.
4/4
PASS
Outbound citations to sourcesoutbound-citationsheuristic
outbound citations on 6 substantial page(s)
On substantial pages, checks for at least one external, non-social outbound link in the main content. Citing authoritative primary sources builds the credibility that AI answer engines reward when choosing what to cite.
3/3
PASS
No near-duplicate pagescontent-uniquenessheuristic
no near-duplicate bodies across 6 pages
Compares the main text of sampled pages using shingle/Jaccard similarity to flag near-duplicate bodies (≥0.8 overlap). Duplicate content dilutes ranking and confuses AI engines about which URL to trust and cite.
3/3
PASS
About and contact pagesabout-contact
About and Contact reachable with a contact method
Checks that reachable /about and /contact pages exist and that a contact method (tel, email, or ContactPoint) is exposed. These trust signals help users and AI engines confirm that a real, accountable organization stands behind the site.
3/3
PASS
The /.well-known/ai.json manifestwell-known-ai-json
/.well-known/ai.json serves a JSON object manifest
Checks whether the site publishes a /.well-known/ai.json discovery manifest — an emerging convention letting AI agents find machine-readable facts about the site (name, description, contact, policies). Advisory: absence only warns, and a 200 answer must be a real JSON object rather than an HTML SPA fallback.
1/1
PASS
Freshness signals agreefreshness-coherence
freshness signals coherent (24h tolerance) on 6 page(s)
Cross-checks the three freshness signals a page can emit — the HTTP Last-Modified header, the JSON-LD dateModified (or article:modified_time), and the sitemap <lastmod> — and flags when they contradict each other or claim a future date. Contradictory or fake freshness makes engines distrust and ignore the signal entirely.
4/4
PASS
A committed opening, not an evasive onehedging-rateheuristic
direct, hedge-free leads on 6 page(s)
On substantial pages (≥150 words), counts hedging phrases (maybe, it seems, peut-être, il semble…) in the first two paragraphs. Generative engines preferentially quote confident, committed statements, so an evasive lead lowers the odds of being cited.
3/3
PASS
Quotable answer unitsanswer-unitsheuristic
47 liftable answer unit(s) across 4 pillar page(s)
On pillar pages (≥300 words), checks for at least one "answer unit": a short, self-contained statement (8–40 words) carrying a number, date or named entity, opening without an anaphora and hedging nothing. These are the passages a generative engine can lift and quote verbatim.
4/4
PASS
Structure survives chunkingchunk-boundaryheuristic
chunk-safe structure on 6 page(s)
On substantial pages (≥150 words), flags DOM structures that fall apart when a page is split into retrieval chunks: long tables without header cells, FAQ answers detached from their question by decorative markup, and lists orphaned from any title. A retrieval chunk loses the context outside it, so these boundaries strand meaning.
3/3
PASS
Retrieval windows stand on their ownchunk-retrieval-simheuristic
8/8 ~512-token chunk(s) survive isolated retrieval (100%)
Cuts pillar pages (≥300 words) into ~512-token windows the way a retrieval pipeline would, then measures how many of those windows still stand on their own: each needs a topic anchor (a number or a named entity, counting the heading trail a retriever prepends) and an opening that does not point back at the previous window. An engine is handed one window, never the whole page.
4/4
PASS
No hidden text, no unattributed linksinjection-hygieneheuristic
no hidden text or unattributed UGC across 6 page(s)
Looks for text an assistant ingests but a visitor never sees: copy hidden through inline styles or the hidden attribute, model-directed instructions concealed inside it, and user-contributed links that claim no rel="ugc". Hidden instructions are a prompt-injection payload, and unattributed user links let third parties speak in the site's voice.
3/3
PASS
Actionable by an agentagent-usabilityheuristic
4 form(s) submittable without JS; contact reachable on 4/6 page(s)
Asks whether an agent can ACT on the site, not just read it: every form must have a submit control that is not disabled, an action that is not JavaScript-only, and a name on every field, and the site must expose at least one machine-readable way to reach a human (mailto:, tel:, a submittable form, or email/telephone/contactPoint in the JSON-LD). An assistant acting on a visitor's behalf cannot run click handlers.
4/4

Structured data & metadata (56/59)

WARN
Identity grounded by sameAs linkssd-entity-grounding
only 1 sameAs profile URL
Examines the sameAs links and rewards having at least two official profiles, ideally one pointing to Wikipedia or Wikidata. Linking to these knowledge-graph anchors helps AI engines disambiguate your entity from others with the same name.
List ≥2 official profile URLs in sameAs, including Wikipedia/Wikidata if available. Learn more →
2/4
SKIP
LocalBusiness structured datasd-localbusiness
no LocalBusiness entity on the homepage
For a local business, verifies the NAP details (structured PostalAddress and telephone) plus geo coordinates and opening hours. Complete, structured local data is what powers map listings and lets AI assistants answer "where" and "when" questions about you.
0/3
SKIP
Article structured datasd-article
no Article/NewsArticle/BlogPosting page in the sample
Checks that pages carrying Article, NewsArticle or BlogPosting markup have complete fields — headline, a structured author, publish and modified dates, an adequately sized image and a publisher logo. Rich, complete article data helps search and AI answer engines understand, date and confidently cite your content.
0/4
SKIP
Product structured datasd-product
no Product page in the sample
Verifies that Product markup includes a valid offer (numeric price, three-letter ISO-4217 currency and an availability value), a brand, a GTIN or MPN identifier and an in-range rating. Complete product data powers rich results and lets AI engines answer price, stock and review questions accurately.
0/4
WARN
WebSite SearchActionsd-website-searchaction
WebSite present but no SearchAction (no sitelinks searchbox)
For a WebSite entity, checks for a valid SearchAction whose urlTemplate contains {search_term_string} with a matching query-input. Google retired the sitelinks search box in November 2024, so this markup no longer buys a search-result feature; what it still does is declare a machine-readable entry point to your own search, which an agent can call to query the site directly.
Add potentialAction SearchAction with a urlTemplate and query-input. Learn more →
1/2
SKIP
VideoObject structured datasd-video
no video content on the homepage
When the page embeds a video, checks for VideoObject markup with name, description, an absolute thumbnail, and an ISO upload date. Without it, search and AI engines can't index the video, so it stays invisible in video results and rich answers.
0/2
SKIP
Specialised schema.org typessd-special-types
no HowTo/Event/Recipe on the homepage
If the page marks up a HowTo, Event, or Recipe, validates the required fields for that type (steps, ISO dates and a location, or ingredients and instructions). Complete markup unlocks the rich results and step-by-step answers AI engines generate for these formats.
0/3
SKIP
Name, address and phone stay consistentnap-consistency
no NAP (phone/address) to check
Compares the business phone and address (NAP) shown in page footers across the sample and against your Organization/LocalBusiness JSON-LD, flagging divergences and conflicts. Consistent NAP builds local-SEO trust and lets search and AI engines cite your contact details with confidence.
0/3
Show the 12 passing checks
PASS
JSON-LD is presentjson-ld
1 valid JSON-LD block(s)
Checks that the homepage contains at least one valid JSON-LD block. Structured data lets search engines and AI answer engines reliably identify your business, content, and key facts instead of guessing from raw text.
10/10
PASS
A meaningful entity is declaredjson-ld-entity
relevant entity found: Organization
Confirms the JSON-LD declares a meaningful entity (Organization, LocalBusiness, or Article) and, for businesses, includes name, address, and telephone. A clear entity is what AI assistants cite when they name and describe your site.
6/6
PASS
Structured-data coverage across pagesschema-coverage
6/6 sampled pages carry valid JSON-LD
Checks how many sampled pages include valid JSON-LD structured data. Structured data helps search engines and AI assistants understand what a page is about and makes it eligible for rich results and citations.
5/5
PASS
Open Graph tagsopen-graph
Open Graph complete (core set + site_name + locale)
Checks that the homepage exposes complete Open Graph tags, including an absolute https image. These control how the site’s links look when shared or cited on social platforms and by AI assistants, boosting click-through and recognition.
5/5
PASS
Twitter Card tagstwitter-card
twitter:card=summary_large_image complete
Verifies the page declares a Twitter Card (or a complete Open Graph fallback with title, description, and an absolute HTTPS image). This controls how links to your page render as rich previews when shared, improving click-through and how AI and social tools summarize the page.
2/2
PASS
JSON-LD parses and is typedjson-ld-valid
1 JSON-LD block(s) all valid (parse + @context + @type)
Validates that every JSON-LD block parses without errors and has a schema.org @context plus an explicit @type on each node. Malformed structured data is silently ignored by crawlers, so a single syntax slip can waste all your markup.
4/4
PASS
Organization structured datasd-organization
Organization entity complete: findable-audit
Checks that an Organization or LocalBusiness node carries name, url, an absolute HTTPS logo, and sameAs profile links. These fields feed knowledge panels and let AI engines attach a verified identity and logo to your brand.
4/4
PASS
FAQPage structured datasd-faq
FAQ content backed by FAQPage/QAPage schema
Detects FAQ-style content on the page (schema question/answer pairs, expandable details blocks, or question-shaped headings) and flags it when it isn't backed by FAQPage or QAPage structured data. Marking FAQs as schema makes each question and answer machine-readable, so search and AI assistants can surface direct answers.
4/4
PASS
BreadcrumbList structured datasd-breadcrumb
breadcrumbs present on all interior pages
On interior (non-homepage) pages, checks for a valid BreadcrumbList with contiguously ordered positions and names, or a visible breadcrumb navigation element. Breadcrumbs express your site's hierarchy, improving rich results and helping search and AI engines understand where each page sits.
3/3
PASS
@graph integritysd-graph-integrity
5 @id-linked entities, no dangling references
Checks that every @id reference in the JSON-LD graph points to a node that exists and that no @id is declared twice. Broken or duplicated references confuse parsers and can make them drop entities from your structured-data graph.
3/3
PASS
Structured data matches the pagesd-consistency
1 JSON-LD value(s) confirmed visible on the page
Compares key JSON-LD values (name, headline, price, rating) against the visible page text to catch markup that describes hidden or absent content. Structured data that contradicts the page can be treated as spam and get your rich results demoted or removed.
3/3
PASS
A connected JSON-LD entity graphentity-graph-connectivity
43 entities, 52 links, no dangling references (1 component(s))
Builds the JSON-LD entity graph across the sampled pages and checks it is coherent: every @id referenced is defined (no dangling references) and the site's core identity entities (Organization, WebSite, Person, LocalBusiness) are linked into one connected graph. A clean, connected entity graph is how AI engines resolve who you are and tie your pages, brand and authors together.
4/4

Technical SEO (81/81)

SKIP
IndexNow key fileindexnow
no IndexNow key provided (use --indexnow-key to enable)
When an IndexNow key is supplied, verifies the ownership file /<key>.txt exists at the site root and contains exactly that key. IndexNow lets you instantly push new and updated URLs to search engines like Bing, so fresh content gets crawled and indexed faster.
0/4
SKIP
Paginated pages canonicalize themselvespagination-canonical
no pagination detected (single page series)
Detects paginated pages (?page=N, /page/N, or rel=next/prev) and checks that pages after page 1 canonicalize to themselves rather than to page 1. Pointing every page's canonical at page 1 tells search engines to drop the later pages, so content only listed there never gets indexed.
0/2
SKIP
Sitemap stays within size limitssitemap-index-limits
no <sitemapindex> (single urlset sitemap)
For a sitemap index, checks that each referenced child sitemap is same-origin, reachable with a 200, valid XML, and stays under the 50,000-URL limit. Broken or oversized child sitemaps prevent crawlers from reading your full set of URLs.
0/2
Show the 19 passing checks
PASS
An XML sitemap is publishedsitemap
valid sitemap, referenced in robots.txt
Checks that the site publishes a valid XML sitemap (discovered via robots.txt Sitemap lines or common paths) with a urlset/sitemapindex root and at least one <loc>, and that it is referenced in robots.txt. A sitemap lets search crawlers and AI answer engines discover every important page instead of only the ones they reach by following links.
10/10
PASS
Self-referential canonical URLcanonical
self-referential canonical on 6 sampled page(s)
Verifies each sampled page declares a single, absolute canonical URL pointing to itself on the same origin, rather than a blanket canonical to the homepage. This tells search engines and AI crawlers which URL is authoritative and prevents duplicate-content dilution.
5/5
PASS
No broken internal linksbroken-internal-links
9 internal link(s) resolve
Follows every internal link found on the sampled pages and flags any that return an error status (>= 400) or fail to load. Dead links waste crawler budget and stop search and AI engines from reaching parts of your site.
8/8
PASS
Reciprocal hreflang alternateshreflang
5 hreflang alternate(s) reachable and reciprocal
For each declared hreflang alternate, verifies that it loads (200) and links reciprocally back to the page that referenced it. Correct, reciprocal hreflang tells search and answer engines which language or region version to serve, preventing the wrong variant from surfacing.
3/3
PASS
Canonical target is live and indexablecanonical-resolves
6 declared canonical(s) resolve 200 and are indexable
Fetches every declared <link rel="canonical"> target and verifies it returns HTTP 200, is indexable (not noindex), and does not itself redirect. A canonical pointing at a broken, noindexed, or redirecting page confuses search engines and AI crawlers about which URL to index.
4/4
PASS
www and non-www consolidatedwww-consolidation
apex host serves the site; www host not live
Checks that only one host variant (www or apex) serves the site with a 200 while the other returns a single permanent 301 to it, with no redirect chains or loops. If both hosts serve content, search engines and AI crawlers see duplicate sites and split their ranking signals.
5/5
PASS
Consistent trailing slashtrailing-slash
slash-toggled variants of 6 path(s) do not duplicate
For each sampled path, fetches the opposite trailing-slash form and flags it when that variant also returns 200 (duplicate content at two URLs). Serving the same page at both /page and /page/ splits ranking signals between the two URLs.
4/4
PASS
No redirect chainsredirect-chains
no redirect chains across 7 URL(s)
Follows the redirect chain of the homepage and sampled URLs, flagging multi-hop chains, loops, or temporary redirects used for permanent moves. Extra hops slow crawlers, waste crawl budget, and can leave a page unindexed.
4/4
PASS
No soft 404ssoft-404
missing route returns 404
Requests a random non-existent path and checks the server returns a real 404/410 status instead of a 200 or a redirect to the homepage (a soft 404). Search engines rely on the HTTP status to drop missing pages; a soft 404 lets empty routes get indexed as real content.
6/6
PASS
A 404 page that offers a way outcustom-404
404 page offers a way back (links/nav/search)
Fetches a missing route and checks the returned 404 page offers a way back — internal links, a nav, or a search box — rather than being a dead end. A helpful 404 keeps visitors on the site and gives crawlers links to follow.
2/2
PASS
Readable URL structureurl-structureheuristic
9 sampled URL(s) are clean and readable
Inspects sampled and linked URLs for readability issues: excessive length, uppercase letters, underscores, deep nesting, or session/tracking query parameters. Clean, predictable URLs are easier for users and crawlers to parse, share, and de-duplicate.
3/3
PASS
No meta-refresh redirectsmeta-refresh
no meta-refresh redirects on 6 sampled page(s)
Scans pages for <meta http-equiv="refresh"> client-side redirects. These are slow and poorly understood by crawlers, which may not pass ranking signals or follow them at all — a server-side 301 is the reliable equivalent.
2/2
PASS
hreflang x-default and self-referencehreflang-x-default
hreflang set complete on 6 page(s)
On pages that use hreflang, validates the BCP-47 language codes and checks for an x-default alternate, a self-referencing entry, and absolute URLs. Correct hreflang tells search engines which language or region version to serve; gaps make the wrong version surface or the whole set be ignored.
3/3
PASS
No orphan or deeply buried pagesinternal-linking
6 sampled page(s) linked and shallow
Builds an internal link graph across sampled pages and flags pages with no outgoing internal links, orphans (nothing links to them), or pages more than 3 clicks from the homepage. Orphaned or deeply buried pages are rarely discovered, crawled, or ranked.
4/4
PASS
How internal link equity is spreadlink-equity-map
link equity well-distributed across 6 page(s) — top: /en/ (23.27%), /fr/ (23.27%), /en/contact/ (13.75%)
Builds the internal link graph over the sampled pages, then computes each page's in-degree and a sample-scoped PageRank to name the top-ranked pages plus any orphans (nothing links to them) or dead-ends (no internal outlinks). Where internal-linking flags depth and underlinking, this maps how link equity is actually distributed, exposing the winners and losers.
3/3
PASS
Navigation works without JavaScriptcrawlable-nav
66 crawlable link(s); navigation works without JavaScript
Counts navigation links and flags pages where too many require JavaScript to work (href="#", javascript:, or no href). AI answer-engine crawlers (GPTBot, ClaudeBot, PerplexityBot) and Google's first pass do not run JavaScript, so JS-only navigation hides those pages from them.
4/4
PASS
Sitemap lastmod datessitemap-lastmod
6/6 entries have valid, varied <lastmod>
Checks that sitemap entries carry real, valid ISO-8601, non-future and varied <lastmod> dates rather than none, garbage, or one shared build date. Accurate last-modified dates tell crawlers which pages actually changed so they recrawl updated content promptly.
4/4
PASS
Sitemap URLs resolvesitemap-urls-valid
6 sampled sitemap URL(s) are clean and indexable
Samples sitemap URLs and confirms each is same-origin, HTTPS, returns 200 without redirecting, is not noindexed, and is self-canonical. Listing only clean, final, indexable URLs stops crawlers from wasting budget on redirects, dead links, or pages that should not be indexed.
4/4
PASS
The sitemap covers the crawled pagessitemap-orphans
sitemap and internal links agree on 6 URL(s)
Cross-references the sitemap against the site's internal link graph, flagging sitemap URLs that nothing links to and internally-linked pages absent from the sitemap. Key pages should be both listed and internally linked so crawlers and AI engines discover and trust them.
3/3

On-page & content (38/38)

SKIP
Captions on explanatory imagesfigure-captionheuristic
no explanatory content images on sampled pages
Checks that non-decorative content images are wrapped in a <figure> with a <figcaption>. Captions give images textual context that both search engines and AI models can read and use.
0/2
Show the 10 passing checks
PASS
Homepage title and descriptiontitle-descriptionheuristic
title and meta description look good
Checks that the homepage has a `<title>` and a meta description of the right length. These are the headline and summary that search engines and AI answer engines show and rely on to understand what the page is about.
8/8
PASS
Titles are unique across pagesunique-titles
titles and descriptions unique across 6 pages
Verifies that every sampled page has a distinct <title> and meta description. Duplicate titles or descriptions make pages indistinguishable in search results and AI citations, which weakens relevance.
5/5
PASS
Title and description on every pagemeta-per-pageheuristic
title and description in range on 6 page(s)
Verifies each sampled page has a <title> of 10-70 characters and a meta description of 50-160 characters. These are what search engines and AI answer engines display and use to understand a page, so well-sized, unique ones improve click-through and how accurately your page is summarized.
5/5
PASS
A consistent title patterntitle-patternheuristic
title is topic-first with a brand suffix
Checks that the homepage <title> leads with the topic and places the brand after a separator. A topic-first title tells search engines and AI assistants what the page is about before the brand name, improving relevance in results.
3/3
PASS
Title and H1 tell the same storytitle-h1-alignmentheuristic
title and H1 share 4 meaningful token(s)
Checks that the homepage <title> and <h1> share meaningful words once the brand is excluded. When the title and main heading agree on the subject, search engines and AI models receive a consistent signal about the page topic.
2/2
PASS
One H1, no skipped levelsheadings-outline
heading outline clean on 6 page(s)
Verifies each sampled page has exactly one <h1> and never skips a heading level. A clean heading hierarchy is how crawlers and AI models parse page structure and pull out sections to cite.
5/5
PASS
Descriptive link textanchor-textheuristic
0% generic internal anchor text (0/28)
Measures the share of internal links that use generic text like "click here", "read more", or a bare URL. Descriptive anchor text tells search engines and AI what the linked page is about, helping both navigation and understanding.
3/3
PASS
Character encoding declaredcharset
UTF-8 charset declared
Checks that the homepage declares a character encoding, ideally UTF-8. Without a declared charset, browsers and crawlers can misread accented or non-Latin characters and corrupt your content.
3/3
PASS
Favicon and touch iconfavicon
favicon and apple-touch-icon present
Checks for a favicon and an apple-touch-icon on the homepage. These icons make the site recognizable in browser tabs, bookmarks, and on mobile home screens, reinforcing brand trust.
2/2
PASS
Sentences stay readablecontent-readabilityheuristic
main content reads at approximately grade 10.1
Estimates the reading grade level of the homepage main text using a Flesch-Kincaid formula. Simpler, shorter sentences are easier for readers and for AI models to summarize and quote accurately.
2/2

Performance & Core Web Vitals (47/47)

SKIP
Cache headers on static assetsasset-caching
no same-origin CSS/JS asset to sample
Samples a same-origin CSS/JS asset and checks for a Cache-Control max-age or ETag. Cache headers let browsers reuse assets on repeat visits instead of re-downloading them.
0/2
SKIP
CLS — visual stabilitycwv-cls
no CLS field data in PSI response
Checks Cumulative Layout Shift, how much the page visually jumps around while loading, from real-user field data. Google uses it as a ranking signal and a stable layout signals a well-built, trustworthy page.
0/4
SKIP
INP — reaction to interactionscwv-inp
no INP field data in PSI response (low-traffic URL)
Checks Interaction to Next Paint — how quickly the page responds to clicks and taps — from real-user field data. Sluggish interactivity is a Core Web Vitals ranking factor and frustrates visitors.
0/4
SKIP
Core Web Vitals overall verdictcwv-assessment
no CrUX overall assessment (no field data)
Reports the overall Core Web Vitals verdict (fast, average, or slow) that Google's real-user CrUX dataset assigns to your site. It's a headline signal of whether your pages clear Google's speed bar.
0/4
Show the 15 passing checks
PASS
HTML document weighthtml-weightheuristic
HTML document is 25KB
Measures the size of the HTML document, flagging anything over 100KB. Bloated HTML slows the first render and costs search and AI crawlers more to fetch and parse.
3/3
PASS
JavaScript that blocks the first paintrender-blocking-js
no render-blocking head scripts on 6 page(s)
Counts scripts in the <head> that block rendering on each sampled page. Render-blocking scripts delay when the page becomes visible, hurting perceived speed and Core Web Vitals.
4/4
PASS
CSS that blocks the first paintrender-blocking-css
0 render-blocking stylesheet(s)
Counts render-blocking stylesheets in the <head>. Each one blocks the first paint until it downloads, delaying how quickly visitors and crawlers see content.
3/3
PASS
Image dimensions declaredimg-dimensions
no <img> elements on sampled pages
Checks what share of images across sampled pages declare an explicit width/height (or a CSS aspect-ratio). Missing dimensions make the layout jump as images load, worsening the CLS metric.
4/4
PASS
Lazy loading below the fold onlyimg-lazy-loadingheuristic
no images to assess
Checks that the likely-LCP hero image loads eagerly while below-the-fold images are lazy-loaded. Lazy-loading the hero delays the largest paint, while eager-loading off-screen images wastes bandwidth.
2/2
PASS
Next-generation image formatsimg-next-genheuristic
no raster <img> elements to assess
Measures what share of raster images are offered in next-gen formats like WebP or AVIF. These formats are far smaller than JPEG/PNG, so pages load faster and cost crawlers less to fetch.
2/2
PASS
Resource hints (preconnect, preload)resource-hintsheuristic
preconnect/dns-prefetch present for 1 third-party origin(s)
Checks whether cross-origin scripts and stylesheets have a preconnect or dns-prefetch hint. These hints let the browser set up third-party connections early, shaving time off the load.
2/2
PASS
DOM size and nesting depthdom-size
DOM has 184 element(s), max nesting depth 9
Counts the number of DOM elements and the maximum nesting depth of the homepage. A large or deeply nested DOM slows rendering and makes the page harder for browsers and crawlers to parse.
2/2
PASS
Text compression enabledtext-compression
HTML served with Content-Encoding: br
Checks whether the HTML is served with Brotli, zstd, or gzip compression. Compressing text responses cuts transfer size dramatically, speeding delivery to visitors and AI crawlers alike.
3/3
PASS
Inline CSS/JS volume in the headinline-head-volumeheuristic
13KB inline <style>/<script> in <head>
Measures the volume of inline <style> and <script> in the <head>, flagging over 14KB. Excess inline code bloats every page load and cannot be cached separately.
2/2
PASS
Lighthouse performance scorelighthouse-perf
Lighthouse performance 1.00 (100/100, mobile)
Measures the Lighthouse lab performance score from PageSpeed Insights, a synthetic overall grade of page speed. A fast-loading page keeps human visitors engaged and helps AI crawlers fetch and index your content reliably.
5/5
PASS
LCP — main content speedcwv-lcp
lab LCP 1688ms (no CrUX field data)
Checks Largest Contentful Paint — how long until the page's main content renders — from real-user (CrUX) field data, falling back to lab data. Slow main content hurts search rankings and can make crawlers time out before they see it.
6/6
PASS
TTFB — server response timecwv-ttfb
lab TTFB 2ms (server-response-time, no field data)
Checks Time To First Byte — how fast your server starts responding — from real-user field data with a lab fallback. A slow server delays everything else and can make AI crawlers give up before fetching the page.
3/3
PASS
Total Blocking Time (lab)lab-tbt
Total Blocking Time 0ms (lab, mobile)
Measures Total Blocking Time from lab data — how long the main thread stays blocked and unable to respond to input — as a stand-in for interactivity when no field data exists. High blocking time means a janky, unresponsive page.
3/3
PASS
First Contentful Paint (lab)lab-fcp
lab FCP 961ms, lab LCP 1688ms (mobile)
Checks First Contentful Paint (cross-checked with lab LCP) from PageSpeed Insights lab data — how quickly the first content appears — as the speed proxy when no real-user data is available. Fast first paint reassures visitors and crawlers that the page is loading.
3/3

Accessibility (26/26)

SKIP
Alt text is a real descriptionalt-descriptiveheuristic
no non-empty alt text to assess
Checks that non-empty `alt` attributes are real descriptions rather than filenames or placeholders like "image" or "IMG_1234.jpg". Meaningful alt text helps screen readers and lets image search and AI engines understand what each picture shows.
0/3
SKIP
Every iframe is titlediframe-title
no iframes on sampled pages
Checks that every `<iframe>` has a `title` or `aria-label`. Without one, screen readers announce only a generic "frame" and users can't tell what embedded content it contains.
0/2
Show the 7 passing checks
PASS
Images carry alt textimages-alt
no <img> elements on sampled pages
Measures the share of <img> elements that carry an alt attribute across the sampled pages. Alt text lets screen readers and AI models understand images, improving accessibility and the semantic richness engines can extract from the page.
4/4
PASS
Mobile viewport declaredviewport
mobile viewport set
Checks for a mobile viewport meta tag on the homepage. Without it, pages render at desktop width on phones, hurting mobile usability, which search engines factor into ranking.
5/5
PASS
Page language declaredhtml-lang
valid <html lang> on 6 sampled page(s)
Verifies that every sampled page declares a valid BCP-47 language code in `<html lang>`. Screen readers rely on it to pronounce content correctly, and search and AI answer engines use it to serve the page to the right-language audience.
4/4
PASS
Semantic landmark regionslandmarks
semantic landmarks on 6 sampled page(s)
Verifies each page uses semantic landmarks — a single `<main>` plus at least two of `<header>`/`<nav>`/`<footer>`. These regions let assistive tech and AI crawlers tell the main content apart from navigation and boilerplate.
4/4
PASS
Every field has a labelform-labels
all 8 form control(s) have an accessible name
Checks that every input, select, and textarea (excluding hidden and button-type inputs) has an accessible name from a `<label>`, `aria-label`, or `aria-labelledby`. Without one, screen-reader users can't tell what a field is for and the form becomes unusable.
3/3
PASS
Links have an accessible namelink-text
all 66 link(s) have an accessible name
Verifies that links have an accessible name from their text, an `aria-label`, or a child image's alt. Nameless icon or image links are unusable with a screen reader and give search and AI crawlers no clue about where they lead.
3/3
PASS
Zoom is not disabledviewport-zoom
viewport allows pinch-zoom
Checks that the viewport meta doesn't block pinch-zoom via `user-scalable=no` or a `maximum-scale` below 2 (WCAG 1.4.4). Disabling zoom locks out low-vision users who need to enlarge text to read the page.
3/3

Security & trust (32/32)

Everything passes in this family.

Show the 10 passing checks
PASS
Served over HTTPShttps
served over HTTPS
Confirms the site is served over HTTPS after following redirects. Secure transport is a baseline ranking and trust signal, and many crawlers and AI agents skip or downrank pages that are not on HTTPS.
5/5
PASS
Redirect hygieneredirect-hygiene
http:// 301-redirects to https://
Checks that the http:// version of the site permanently redirects (301) to https:// by inspecting the very first hop of the redirect chain. A permanent redirect consolidates ranking signals on one secure canonical origin and keeps crawlers off an insecure or duplicate version.
4/4
PASS
No mixed content on HTTPSmixed-content
no mixed content across 6 sampled page(s)
Checks that an HTTPS page does not load subresources (scripts, stylesheets, iframes, images or media) over insecure http://. Mixed content triggers browser security warnings and can silently block resources, weakening the trust signals search and AI answer engines rely on.
4/4
PASS
HTTPS enforced (HSTS)hsts
HSTS max-age=31536000 (+includeSubDomains)
Checks for a Strict-Transport-Security header with a max-age of at least 180 days, which forces browsers to reach the site only over HTTPS. Enforced HTTPS protects visitors from downgrade attacks and reinforces the security posture that builds search and AI-engine trust.
4/4
PASS
X-Content-Type-Options: nosniffx-content-type-options
X-Content-Type-Options: nosniff
Confirms the site sends `X-Content-Type-Options: nosniff`, which stops browsers from guessing (MIME-sniffing) a file's type instead of trusting the declared one. Blocking MIME-sniffing prevents a class of injection attacks and is a baseline security signal that trustworthy sites are expected to send.
3/3
PASS
Content-Security-Policy headercsp
Content-Security-Policy present
Checks for a Content-Security-Policy that restricts which scripts, styles and connections the page may load, and warns when it still allows 'unsafe-inline' or wildcard sources. A strong CSP limits cross-site scripting and signals a well-secured, trustworthy site to search and AI engines.
3/3
PASS
Clickjacking protectionclickjacking
CSP frame-ancestors restricts framing
Verifies the page defends against being embedded in a hostile frame, via an X-Frame-Options header or a CSP frame-ancestors directive delivered over HTTP. Anti-clickjacking protection stops attackers from tricking users through an invisible overlay of your site and is a standard security signal of a trustworthy page.
3/3
PASS
Referrer-Policy headerreferrer-policy
Referrer-Policy: no-referrer
Checks for a valid, non-leaky Referrer-Policy header that controls how much of your URL is shared when visitors follow links to other sites. A privacy-preserving policy avoids leaking sensitive URLs and reflects the security hygiene that reinforces overall site trust.
2/2
PASS
Permissions-Policy headerpermissions-policy
Permissions-Policy present
Checks for a Permissions-Policy (or legacy Feature-Policy) header that disables powerful browser features such as camera, microphone and geolocation by default. Locking down unused features shrinks the attack surface and is a modern security signal of a well-maintained, trustworthy site.
2/2
PASS
security-txtsecurity-txt
security.txt published, contact and expiry valid (2027-07-27)
Checks for /.well-known/security.txt (RFC 9116), the machine-readable address a researcher uses to report a vulnerability, and verifies that its required Contact field is present and its Expires date still in the future. An expired or contactless file signals an unattended site — a trust signal search engines and security scanners both read.
2/2