Methodology

How we score a client's site.

Five weighted checks. One formula. The same score for every client, so you can stand behind it.

What we measure

We fetch the client's site the way AI crawlers do — a plain HTTP request — and score what that fetch returns. (We also render the page in a real browser and compare, so the report can show how much of the site's content depends on JavaScript.) Then we run five checks, each scored 0–100 and weighted by how much it matters for AI visibility.

Crawler access 20%

Can AI crawlers reach the site? We read its robots.txt for the ten AI crawlers we test — GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot, Google-Extended, Applebot-Extended, CCBot, FacebookBot, and cohere-ai.

Blocked of the tenCrawler access score
None — or no robots.txt at all100
1–2 blocked40
3 or more blocked0

A crawler counts as blocked when its own rules in robots.txt — or the * rules, when it has none of its own — carry Disallow: /.

Structure 25%

A clear heading order — one main heading, no skipped levels — plus semantic landmarks (header, nav, main, footer). Best practice, not law: a page with messier structure can still be read, it just gives AI less to work with. Clean structure helps AI parse a page into answers.

Starts at 100; the deductions:

FindingPoints
No <h1>−30
More than one <h1>−20
A skipped heading level (e.g. <h1> straight to <h3>)−10
Missing <main>−10
Missing <article>, <nav>, <header>, or <footer>−5 each
Any empty heading−5
Metadata 25%

Title tag, meta description, canonical URL, OpenGraph tags, and Schema.org markup. These are the signals AI uses to understand and cite the page.

Starts at 100; the deductions:

FindingPoints
Missing <title>−20
<title> longer than 70 characters−5
Missing meta description−15
Missing canonical link−10
Missing og:title−10
Missing og:description−5
No Schema.org JSON-LD types found−20
A JSON-LD block that fails to parse−5 each
Content 15%

Is there enough substantive text for AI to work with? We measure word count, content depth, and whether key information appears in the raw HTML (not just after JavaScript runs).

Starts at 100; the deductions (word count is a band — the larger row applies):

FindingPoints
Fewer than 100 visible words−30
100–299 visible words−10
No About, Contact, or Pricing page found−10 each

Visible words are the page text with scripts, styles, noscript, inline SVG, navigation, footer, and head excluded. A key page counts as found when it is linked, or when its usual address answers; a support or help page that itself offers a way to reach a human counts as the contact page.

Performance 5%

Page weight and load characteristics. Lighter pages get crawled more thoroughly.

Starts at 100; the deductions (size and speed are bands — the larger row in each applies):

FindingPoints
Page heavier than 2 MB−30
Page heavier than 1 MB−10
Response slower than 5 seconds−20
Response slower than 2 seconds−5

The scoring formula

Let C, S, M, Co, P be the category scores (each 0–100). The weighted base score is:

Base=0.20C+0.25S+0.25M+0.15Co+0.05P\text{Base} = 0.20C + 0.25S + 0.25M + 0.15\text{Co} + 0.05P

Maximum base: 90 points (0.90 × 100)

Sites with helpful Q&A content earn a bonus; sites with none lose points:

B(s)={−10if s≤400if 41≤s≤70+10if s>70B(s) = \begin{cases} -10 & \text{if } s \le 40 \\ 0 & \text{if } 41 \le s \le 70 \\ +10 & \text{if } s > 70 \end{cases}

where s is the FAQ subscore (0–100)

The subscore s itself: starts at 100, capped at 100.

FindingPoints
No FAQPage schema−40
Three or more question-style headings+10
One or two question-style headings−10
No question-style headings−20

A question-style heading is an <h2>–<h4> that asks a question — it opens with a question word (what, why, how, when, where, who, which, can, do, does, is, are, should) and ends with a question mark.

The final score applies the FAQ adjustment, with two capping rules:

Score=min⁡(Base+B(s),100)\text{Score} = \min(\text{Base} + B(s), 100)

Capping rules:

  • If C = 0 (crawler access scores zero — three or more of the ten crawlers blocked), then Score ≤ 40 regardless of other categories.
  • Score is clamped to [0, 100]. The natural maximum is 100 (90 base + 10 FAQ bonus).

Why these weights

The weights follow what our study of 10,369 business websites showed actually separates readable sites from unreadable ones. Structure (25) and metadata (25) carry the most weight because that's where facts get lost — their study averages are 70.5 and 80.8, the widest gaps after FAQ. Crawler access (20) is weighted heavily because it's a gate: blocked crawlers make every other check moot, which is also why a site scoring zero on crawler access is capped at 40. Content (15) matters, but volume alone doesn't make facts findable. Performance (5) carries the least weight because it's nearly universal — the study average is 99.0, so it rarely separates one site from another. The FAQ adjustment sits outside the 90 points because question-and-answer content is the most directly quotable material on a site: sites that have it earn up to 10 back, sites with none give up to 10 up.

One honest limit: the score measures how completely AI systems can read a site. It does not measure — and cannot guarantee — whether an assistant will cite or recommend the business. That also depends on reviews, directories, competition, and the question asked.

Score bands

BandScoreMeaning
Ready90–100AI systems can find and fully read the site — the strongest position to be cited from, though readability alone never guarantees a citation.
Workable70–89Usable, but specific fixes would improve AI visibility.
Needs Work0–69Significant barriers prevent AI from understanding the site.

Worked example

A site scores: C=100,S=80,M=70,Co=60,P=90C=100, S=80, M=70, \text{Co}=60, P=90, FAQ subscore s=75s=75.

Base=0.20(100)+0.25(80)+0.25(70)+0.15(60)+0.05(90)=20+20+17.5+9+4.5=71\begin{aligned} \text{Base} &= 0.20(100) + 0.25(80) + 0.25(70) + 0.15(60) + 0.05(90) \\ &= 20 + 20 + 17.5 + 9 + 4.5 = 71 \end{aligned} B(75)=+10(since 75>70)B(75) = +10 \quad (\text{since } 75 > 70) Score=min⁡(71+10,100)=81→Workable\text{Score} = \min(71 + 10, 100) = \mathbf{81} \rightarrow \text{Workable}

What we don't do

  • We don't score the JavaScript-rendered page. The score reflects the plain fetch — if content only appears after JS executes, we report it as missing, because that's what simple crawlers see. A separate browser render runs only as a comparison, so the gap shows in the report.
  • We don't guess. Every finding in the report links to the exact location on the client's site where we found the issue — proof you can show the client.
  • We don't sell your data. Scan results are private to your account.

Informational checks

These don't affect the score, but we report them because they matter:

  • llms.txt — whether the site has one, and what it contains
  • Raw vs. rendered — word count comparison showing how much content lives behind JavaScript