Scoring methodology
By the HowsMyGEO team · Published 2025-11-03 · Updated
Every HowsMyGEO scan runs 21 deterministic checks against a single URL: 14 traditional SEO checks and 7 GEO (Generative Engine Optimization) checks. Each check earns points toward a 100-point category score. The combined grade is the average of the two scores: A ≥ 90, B ≥ 80, C ≥ 70, D ≥ 60, F below 60. The tables below are generated from the same code that computes the scores, so they cannot drift from production behaviour.
SEO score — 100 points across 14 checks
These are the classic on-page and technical factors search engines weigh. Weights favour the signals with the most documented ranking impact: titles, structured data, performance and HTTPS.
| Check | Weight | What passes |
|---|---|---|
| Title tag | 10 pts | A title tag exists, is 15–60 characters, and front-loads its subject rather than the brand name — inner pages whose title leads with the brand lose points. |
| Meta description | 8 pts | A meta description exists and is 50–160 characters. |
| H1 heading | 8 pts | Exactly one H1 exists and is descriptive (more than 3 characters). |
| Heading hierarchy | 6 pts | Heading levels descend without skips (an H2 follows an H1, not an H4). |
| Image alt text | 7 pts | Percentage of <img> elements carrying a non-empty alt attribute. Full points at ≥95%, partial at ≥50%. |
| Internal links | 4 pts | Between 5 and 300 same-host links, indicating crawlable site structure. |
| Canonical tag | 5 pts | A rel=canonical link element is present and self-referencing (it points at the audited URL). A canonical aimed at a different URL earns half credit. |
| robots.txt | 6 pts | robots.txt exists and does not block all crawlers from the audited page. |
| sitemap.xml | 6 pts | A sitemap exists at /sitemap.xml or is declared in robots.txt; extra credit for the robots.txt reference. |
| HTTPS | 8 pts | The page is served over HTTPS. |
| Mobile viewport | 6 pts | A viewport meta tag is present for mobile rendering. |
| Performance | 10 pts | Server-measured time-to-first-byte (full points under 300ms) and HTML payload size (full points under 128KB). |
| Open Graph & Twitter cards | 7 pts | Five signals, all required for full credit: og:title, og:description, an absolute-URL og:image, og:url and twitter:card. |
| Structured data (JSON-LD) | 9 pts | JSON-LD parses without errors and declares at least two distinct recognized schema.org types (e.g. Organization plus a content type). A single type earns partial credit. |
| Total | 100 pts |
GEO score — 100 points across 7 checks
GEO measures whether AI answer engines — ChatGPT, Claude, Perplexity, Google AI Overviews — can find, read and cite a page. The two heaviest weights go to AI crawler access (25 points) and content extractability (20 points), because either failure makes a site effectively invisible to AI engines regardless of everything else.
| Check | Weight | What passes |
|---|---|---|
| llms.txt | 10 pts | An llms.txt file exists at /llms.txt describing the site for AI crawlers (emerging standard). |
| AI crawler access | 25 pts | robots.txt allows GPTBot, ClaudeBot, PerplexityBot, Google-Extended and CCBot (5 points each). Full credit requires explicitly naming them — default-allow (no robots.txt, or no AI groups in it) earns slightly less, because it is one blanket disallow away from vanishing. |
| Content extractability | 20 pts | The main content is present in server-rendered HTML — full credit at 300+ words of extractable text. AI crawlers largely do not execute JavaScript, so client-only rendering makes a page invisible to them. |
| Answer-shaped content | 15 pts | Question-style headings, FAQ schema, and definition sentences that answer engines can lift and cite verbatim. |
| Factual density | 10 pts | Concrete statistics, dates, percentages and named entities per 1,000 words — full credit at ≈50 per 1,000. AI engines preferentially cite specific, factual content. |
| Author & entity signals | 10 pts | Author bylines, an About page, and Person/Organization schema that feed AI attribution and trust. Full credit requires both an author signal and Organization schema. |
| Freshness signals | 10 pts | Machine-readable published/modified dates and visible dates on the page. |
| Total | 100 pts |
How measurements are taken
- Pages are fetched server-side by
HowsMyGEOBot/1.0with a 10-second timeout and a 2MB size cap. We respect the target site's robots.txt and will not scan pages it disallows. - Performance is measured as server time-to-first-byte (full points under 300ms) plus HTML payload weight (full points under 128KB). We measure directly rather than calling the PageSpeed Insights API, so scans stay fast and unthrottled.
- AI crawler access is evaluated by parsing robots.txt rules for GPTBot (OpenAI), ClaudeBot (Anthropic), PerplexityBot, Google-Extended and CCBot (Common Crawl), 5 points each, using longest-match precedence as the robots exclusion standard specifies.
- Content extractability inspects only the raw server HTML — no JavaScript is executed — because that is what most AI crawlers see. Full credit requires 300+ words of extractable text; fewer than 100 is treated as a serious deficiency and fewer than 40 as a full failure.
- Factual density counts numbers, percentages, years and multi-word proper nouns per 1,000 words of extracted text; 50+ per 1,000 earns full points.
- After the deterministic checks, the extracted content and results are analysed by Claude (Anthropic's model) to produce the narrative summary, prioritised recommendations and the "how an AI engine sees this page" simulation. The AI layer never changes the scores.
Limitations
A scan audits one URL, not a whole site. Sites that block our fetcher, respond slowly, or serve bot-specific content may receive partial reports — when that happens the report says exactly which checks could not run. Scores are a diagnostic, not a guarantee of ranking or citation.