How does XEO Agent group these checks?
XEO Agent groups on-page checks into SEO, AEO, and GEO, plus a Technical group for transport-level problems and an optional Local group for LocalBusiness pages. Each check reads a specific tag, header, or count from the delivered HTML. When a check fails, the app records a finding with a code, a severity, the evidence it saw, and a recommendation. The tables below use the same codes.
Which crawl and SEO checks are included?
These checks decide whether a search engine can fetch, index, and understand the page. They feed the SEO technical and on-page scores.
| Check | Why engines care | Pass rule | Finding when it fails |
|---|---|---|---|
| HTTP status | Error pages are dropped from the index | Status below 400 | HTTP_STATUS |
| HTTPS | Insecure pages are demoted and warned about | URL scheme is https | HTTPS_MISSING |
| Redirects | Redirect chains waste crawl budget and split signals | Audited URL is served directly | URL_REDIRECTED |
| Response time | Slow HTML delays crawling and rendering | Under 3,000 ms | RESPONSE_SLOW |
| HTML size | Oversized documents may be truncated | Under 1.5 MB | HTML_OVERSIZED |
| Content type | Missing type forces the crawler to guess | Content-Type header present | CONTENT_TYPE_MISSING |
| Title | Primary ranking and snippet text | Present, 10 to 70 characters | TITLE_MISSING, TITLE_LENGTH |
| Meta description | Snippet text and click-through | Present, 70 to 160 characters | META_DESCRIPTION_MISSING, META_DESCRIPTION_LENGTH |
| Canonical | Prevents duplicate indexing | Absolute canonical URL present | CANONICAL_MISSING, CANONICAL_INVALID |
| Robots directives | A noindex removes the page entirely | No noindex in meta robots or X-Robots-Tag | INDEXING_BLOCKED |
| Viewport | Mobile-first indexing | width=device-width present | VIEWPORT_MISSING |
| Language and charset | Correct parsing and language targeting | lang attribute and charset declared | HTML_LANG_MISSING, CHARSET_MISSING, CHARSET_CONFLICT |
| H1 | Primary topic signal | Exactly one H1 | H1_MISSING, H1_MULTIPLE |
| Heading order | Structure for readers and extractors | No skipped levels, such as H3 without H2 | HEADING_HIERARCHY |
| Internal links | Crawl paths and authority flow | At least one internal link | INTERNAL_LINKS_MISSING |
| Link text | Anchor text describes the target | No links without text | LINK_TEXT_MISSING |
| Image alt text | Accessibility and image indexing | Every image has alt | IMAGE_ALT_MISSING |
| Content depth | Thin pages rarely rank or get cited | 300 or more words of body text | CONTENT_THIN |
| Open Graph | Social previews and some AI summaries | og:title, og:description, og:image present | OPEN_GRAPH_INCOMPLETE |
| Client rendering | Crawlers that do not execute JavaScript see an empty page | Meaningful text in the source HTML | CLIENT_RENDERED_SUSPECTED |
On site crawls the app adds site-level checks: SITEMAP_MISSING, SITEMAP_COVERAGE_GAP, CANONICAL_CONFLICTS, DUPLICATE_TITLES, DUPLICATE_CONTENT, and ORPHAN_PAGES. Coverage is automatic: there is no page-count setting, and the audit stops after 30 minutes if it has not finished. Saved results show the pages checked and any coverage limits.
Which answer-engine (AEO) checks are included?
These checks decide whether an answer engine can lift a direct answer from the page. They feed the AEO schema, answer patterns, and entity coverage scores.
| Check | Why engines care | Pass rule | Finding when it fails |
|---|---|---|---|
| Structured data present | Machine-readable entities and answers | At least one JSON-LD block | STRUCTURED_DATA_MISSING |
| Structured data valid | Broken JSON is ignored | Every JSON-LD block parses | STRUCTURED_DATA_INVALID |
| Stable identifiers | Lets engines merge the same entity across pages | Schema uses @id | SCHEMA_ID_MISSING |
| Question-led headings | Matches how people ask | At least one H2 or H3 that ends in ? or starts with what, why, how, when, where, who, which, can, does, do, is, are, or should | ANSWER_STRUCTURE_MISSING |
| FAQ schema | Q&A content is eligible for rich results | Pages with question headings declare FAQPage | FAQ_SCHEMA_OPPORTUNITY |
| Answer formats | Lists and tables are the most extracted blocks | At least one list or table | ANSWER_FORMAT_LIMITED |
| Entity context | Engines need enough surrounding text to trust the answer | 300 or more words, ideally with external links | ENTITY_CONTEXT_LIMITED |
The app scores answer patterns on a scale: no question headings scores 25, one scores 60, two or three score 80, four or more score 100, with a 10 point bonus for a list or table.
Which citation (GEO) checks are included?
These checks decide whether a generative engine can attribute a claim to the page. They feed the GEO extractability, entity clarity, and source quality scores.
| Check | Why engines care | Pass rule | Finding when it fails |
|---|---|---|---|
| Self-contained passages | Engines quote a passage, not a page | Question-led headings followed by text, plus 300 or more words | Lowers extractability score |
| External references | Claims with sources are cited more often | At least one outbound link | EXTERNAL_EVIDENCE_MISSING |
| Quotations and citations | Named quotes are quotable | At least one cite or blockquote element | Lowers source quality score |
| Author | Provenance is a trust signal | meta name="author" or author, publisher, or organization in schema | SOURCE_PROVENANCE_MISSING |
| Date | Freshness and recency filters | time datetime, article:published_time, article:modified_time, or datePublished or dateModified in schema | SOURCE_PROVENANCE_MISSING |
| Entity linking | Connects the page to profiles engines already know | sameAs in schema | Lowers entity clarity score |
Which items are not checked yet?
XEO Agent does not currently score llms.txt, markdown alternates, per-crawler robots.txt groups, hreflang, or the word count of the passage directly under a heading. Those are good practice and this site follows them, but the app does not report on them in the current release. See the changelog for rubric changes.
How should you use this checklist?
Run a single-page audit on the page you care about. Fix the Error and Warning findings first, since those map to the pass rules above. Re-run the audit to confirm the finding is gone. Repeat on your highest-traffic pages, or run a site crawl to see the same checks across the whole site.