How is the total score calculated?
The scanner runs 40 explicit checks across twelve dimensions. Each check is worth a fixed number of points inside its dimension. A dimension’s score is the fraction of its available points that were earned, and the total is those twelve scores combined by weight:
total = Σ ( dimension_score × dimension_weight / 100 )
where dimension_score = earned_points / available_points × 100
and Σ dimension_weight = 100
There are no score floors. A page that satisfies none of the checks scores near zero rather than being lifted to a respectable-looking minimum. Points are relative weights within a dimension: where two entries below describe the two outcomes of a single check, only one of them applies to any given scan.
There is one thing that is not a floor and is worth separating from one: a small number of checks are marked not applicable to a particular kind of page, and are removed from the calculation entirely rather than counted as a failure. A policy page is not a worse page for containing no expert quotations; the question does not apply. When a check is excluded, its points leave both sides of the fraction and the remaining dimensions are renormalised against their own sum, so the total stays a percentage of what could actually be assessed. Every exclusion is listed against the check it applies to below, and the tests assert that each one names a real check and that no exclusion applies to a homepage — which is what makes this change score-neutral for every scan the tool performed before page types existed.
What do the grades mean?
| Grade | Score | Reading |
|---|
| A | 90-100 | Excellent - highly likely to be cited |
| B | 80-89 | Good - likely to be cited |
| C | 70-79 | Average - several dimensions need work |
| D | 60-69 | Poor - significant GEO gaps |
| F | 0-59 | Critical - rarely cited by AI engines |
What the scanner cannot tell you
A score is only useful if its limits are stated. These are the ones that matter:
- It does not ask any AI engine about you. Nothing here measures whether ChatGPT currently recommends your brand. It measures whether your pages are in a state that makes being cited possible. Those are different questions, and conflating them is the most common overclaim in this category.
- A refused request is not proof of a block. Large sites verify crawlers by IP address rather than user-agent, so a scanner’s request can be refused even when real GPTBot traffic is served normally. Whether a site blocks AI crawlers is answered here by
robots.txt, which is the site’s stated intent, not by guessing from one response code. - Only the homepage is analysed. Site-wide problems on interior pages are invisible to a single-URL scan.
- Performance checks are coarse. Real Core Web Vitals need a browser; this scanner deliberately does not run one. That is why the Delivery dimension carries the lowest weight.
- Weights are a judgement, not a measurement. The dimension weights reflect published research and the fact that unreadable pages cannot be cited. They are stated in full so you can disagree with them specifically rather than vaguely.
The twelve dimensions
01AI Crawler Access
16%If a crawler cannot read the page, nothing else on this list can matter. This is the only dimension where a failure makes the rest of the score moot.
Why this weight: Highest weight of the twelve. A page that is blocked or unreadable has no path to being cited, so it dominates the total.
2 ptA request for /robots.txt returns HTTP 200 with a non-empty body. A 200 with an empty or whitespace-only body counts as not served, because it publishes no policy at all.
Not satisfied: No readable robots.txt at the domain root.
6 ptParsing robots.txt into user-agent groups, none of gptbot, claudebot, perplexitybot, oai-searchbot or google-extended is disallowed from /, AND the homepage served a crawler-shaped request with HTTP 200. An exact agent group takes precedence over the * group, the longest matching pattern wins and Allow wins ties, an empty Disallow value matches nothing, and * is treated as a wildcard. When the homepage refused the request, the verdict follows a second probe of the same URL made with a browser-shaped User-Agent: if that one returns 200 the refusal is aimed at identified crawlers, and the check fails under robots-ai-blocked; if it is refused as well, the refusal is about the scanning address rather than the site, and this check scores 2 of 6 as unverified.
Not satisfied: At least one AI crawler is disallowed from the site root, or the server refuses identified crawlers outright.
Note: A site with no robots.txt at all passes this check only when the homepage was actually served, because with no file no crawler is disallowed by it. That is a deliberate reading: absence of robots.txt is a policy gap, not a block, and the gap is reported separately by robots-present. A refusal by the server is the stronger evidence and now overrides the file: robots.txt saying nothing is not permission if the request is rejected before it is read.
6 ptThe inverse of the check above, reported by name so the blocked agents appear in the finding. It is also reported when the server refuses identified crawlers while serving a browser-shaped request, because the effect on those crawlers is the same.
1 ptrobots.txt contains a Sitemap: line.
2 ptThe homepage returns HTTP 200 to a non-browser request that identifies itself honestly.
Not satisfied: A non-200 homepage response. The access verdict itself is reported by robots-ai-allowed or robots-ai-blocked, which account for what the refusal was aimed at.
2 ptThe homepage has no meta robots directive containing noindex.
3 pt/sitemap.xml returns a body containing <urlset> or <sitemapindex>.
Not satisfied: No sitemap, or a response that is not valid sitemap markup.
1 ptrobots.txt contains a Content-Signal directive with a value on the same line, for example `Content-Signal: search=yes, ai-input=yes, ai-train=no`. The directive is matched case-insensitively at the start of any line.
Not satisfied: No Content-Signal directive in robots.txt.
Note: Weighted 1 of the 16 points in this dimension because adoption is early: the directive was proposed in 2025 and no major engine has committed to honouring it. It is scored because the convention is cheap to follow and a tool that recommends it should be able to show its own line, not because it moves a ranking.
02Machine Readability
12%JSON-LD is how a model binds your brand name, domain and product into one entity instead of inferring three unrelated strings.
Why this weight: Second highest. It is deterministic and fully in your control, and it is what makes entity disambiguation possible.
5 ptAt least one <script type="application/ld+json"> block parses as JSON and declares at least one @-keyword (@context, @type, @graph or @id). A block containing only {} parses but declares nothing, so it does not count.
4 ptParsed JSON-LD contains an @type of Organization, WebSite, Person or LocalBusiness.
3 ptParsed JSON-LD contains an @type of FAQPage, Article, BlogPosting, HowTo, Product, SoftwareApplication or BreadcrumbList.
03Content Depth
11%Generative engines select sources that answer a question thoroughly. Thin pages are rarely retrievable regardless of how well they are marked up.
Why this weight: High, because depth is a precondition for retrieval rather than a bonus on top of it.
5 ptVisible text, after removing script, style and comment content, contains at least 800 word tokens. 300-799 is a partial pass.
Not applicable to legal, contact pages. Excluded from the score rather than counted as a failure.
3 ptThe page contains at least 4 H2 elements. 2-3 is a partial pass.
3 ptThe page contains both a <ul>/<ol> and a <table>. Having only one is a partial pass. Script and style bodies are excluded first, so markup that only appears inside a string does not count.
04Citability & Evidence
11%Statistics, quotations and cited sources are the interventions with the largest measured effect in the published GEO research.
Why this weight: High and research-driven: this is the dimension most directly tied to measured visibility gains.
4 ptBody text contains at least 5 numeric claims: percentages, currency amounts, multipliers of the form 3.2x, thousands-separated figures, or raw numbers of five digits or more. A bare four-digit number is not counted, because it is a year far more often than it is a finding.
Not applicable to legal, contact pages. Excluded from the score rather than counted as a failure.
Note: Counting bare three-digit numbers used to make any page with a copyright line or a product ID look quantified, which is the opposite of what the check is for.
3 ptThe page contains at least one <blockquote> element.
Not applicable to legal, contact pages. Excluded from the score rather than counted as a failure.
3 ptThe page links to at least 2 external hosts on the authority list: arxiv.org, doi.org, nature.com, science.org, acm.org, ieee.org, springer.com, sciencedirect.com, any .gov or .edu host, wikipedia.org, github.com, developer.mozilla.org, web.dev, nih.gov, who.int or europa.eu. Own-domain links are excluded.
Not applicable to legal, contact pages. Excluded from the score rather than counted as a failure.
1 ptThe page declares a rel=canonical link.
05Answer Readiness
10%Answers are extracted as spans, not pages. A question-shaped heading followed by an immediate answer is the easiest thing for a retrieval system to lift intact.
Why this weight: Substantial, and largely mechanical to fix.
4 ptAt least 3 H2 or H3 headings either end with a question mark or begin with how, what, why, which, when, who, where, is, are, do, does, can, should or will.
3 ptParsed JSON-LD contains a FAQPage node. If instead the page uses <details>/<summary> markup without the schema, that is a partial pass.
Not satisfied: No FAQPage schema. Note that this check reads structured data, not the word "faq" or "question" appearing anywhere in the HTML.
Not applicable to legal pages. Excluded from the score rather than counted as a failure.
3 ptOf the first 30 heading-then-paragraph pairs (H2/H3 optionally followed by wrapper elements then a <p>), at least 60% have an opening paragraph of 80 words or fewer.
06Trust & Authority
10%E-E-A-T signals decide whether a model treats a claim as safe to repeat rather than something it should hedge.
Why this weight: Weighted equally with answer readiness: attribution is what separates a quote from a rumour.
2 ptThe homepage was retrieved over https://, rather than only over plain http://.
3 ptHrefs on the page include both an about-style path (about, company, team, who-we-are) and a contact-style path (contact, support) or a mailto: link.
Not applicable to article pages. Excluded from the score rather than counted as a failure.
3 ptAuthorship is signalled by any of: a Person node in parsed JSON-LD, an author property with a non-empty value in parsed JSON-LD, rel="author", or a visible byline matching "by Firstname Lastname".
2 ptParsed JSON-LD contains a sameAs property with a non-empty value.
07Semantic Structure
8%Heading hierarchy and landmark elements are how a parser locates section boundaries at all.
Why this weight: Moderate. Mostly a one-time fix.
3 ptThe page contains exactly one non-empty <h1>. Zero or several is a partial or failed result.
3 ptAt least 3 of main, article, section, header, nav and footer appear as elements.
2 ptThe raw server response contains at least 100 words of visible text without executing JavaScript.
08Metadata & Discoverability
7%Title, description and canonical control what a search or answer surface can show about the page.
Why this weight: Moderate, and cheap to satisfy.
3 pt<title> is between 15 and 65 characters long.
2 ptThe meta description is between 50 and 160 characters long.
1 ptAt least one meta property beginning with og: is present.
1 ptThe <html> element carries a lang attribute.
09AI Context Files
5%A cheap and optional signal. Google has stated it does not use llms.txt in Search, and crawler support is inconsistent.
Why this weight: Deliberately low. Most tools in this category weight llms.txt heavily and imply it is a ranking factor; the evidence does not support that, so neither does this score.
4 pt/llms.txt returns more than 20 bytes and contains an H1, a > summary line and at least 3 markdown links. Missing any of those is a partial pass.
1 ptrobots.txt is readable, so a crawler policy is published.
1 ptThe document head contains a <link> with rel="alternate" and type="text/markdown", in either attribute order.
Not satisfied: No markdown alternate is declared on the page.
Note: This reads the declaration only. The scanner fetches one URL, so it does not follow the alternate to confirm that it resolves, and a page can pass this check while pointing at a link that 404s. That limitation is stated here rather than hidden; closing it means a second request in the fetcher.
10Freshness
5%Dated content is deprioritised in generated answers, and an undated page gives an engine nothing to reason about.
Why this weight: Low to moderate: a real but secondary signal.
3 ptA machine-readable date is found in dateModified, datePublished or article:modified_time. Within 12 months is a full pass; older is a partial pass. If only the HTTP Last-Modified header carries a date, that is a partial pass.
2 ptThe current calendar year appears in the visible body text.
11International Readiness
3%Language and region markup decides which language market a page can be retrieved in at all.
Why this weight: Low for a single-market site, and the first thing to fix if you serve more than one language.
2 ptAt least 2 distinct hreflang language codes are declared. Repeated attributes for the same language do not count, and x-default is a default marker rather than a language, so a single-language site declaring `en` plus `x-default` does not satisfy this.
1 ptA language tag carrying a region subtag appears in <html lang>, in og:locale or in an hreflang attribute - for example en-GB, en_GB or de-AT. A bare language such as "en" does not satisfy this; that is what html-lang checks.
Note: This check previously ran the identical <html lang> regex as html-lang, so one attribute earned points in two dimensions while the rule promised a region.
12Delivery & Mobile
2%A slow or non-mobile-readable page is dropped before any content analysis happens.
Why this weight: Lowest. The checks here are coarse on purpose; full Core Web Vitals need a real browser, which this scanner deliberately does not run.
Primary sources
Where this method makes a judgement about what generative engines favour, it follows published research rather than folklore. Read the sources directly:
This site holds itself to the same standard it measures: it publishes its own llms.txt, declares a single Organization entity in JSON-LD, and labels its own dates. You can verify all of it by scanning this domain.
Questions about the method
Is the total an average of the twelve dimensions?
No. Each dimension is scored as the fraction of its own points that were earned, and the twelve are then combined by weight. A dimension worth 16% moves the total three times as much as one worth 5%.
Why is a context file weighted so low?
Because the published evidence for it is weak. Google has said it does not use llms.txt in Search, so it is worth 5 of the 100 points rather than being advertised as a ranking factor.
Can I reproduce a score?
Yes. A scan is a single GET against the public API, and the same inputs produce the same score. The study over 30 homepages names the exact endpoint it used.
Evidence and sources
Adding source citations produced the largest measured visibility gain for low-ranking sites, at +115%, ahead of the addition of expert quotations at +41% and statistics at +30-40%, across the strategies tested on generative engines. — Generative Engine Optimization, KDD 2024
The weightings on this site follow that measurement rather than taste, and the parts of the picture a single-URL scan cannot see are stated rather than left out.
Primary sources