The catalogue
SEO checks
Every rule the platform runs before a site can publish. Errors block. Warnings advise. Fixes run on your behalf.
Structure
- h1-counterror
Every page must have exactly one H1.
- heading-emptyerror
Heading fields in content must not be blank.
- h1-emptyerror
An H1 exists but has no text content.
- duplicate-element-iderror
Two elements share an id.
- empty-linkerror
An anchor has no text content and no aria-label.
- heading-hierarchywarning
A heading level is skipped.
- heading-orderwarning
An H2 appears before the H1.
Meta
- title-missingerror
The page title is missing.
- title-lengthwarning
Title length sits outside the target range.
- meta-description-lengthwarning
Meta description length sits outside the target range.
- title-equals-h1warning
Title and H1 are an exact match.
- title-missing-brandwarning
The business name does not appear in the title.
- title-pixel-widthwarning
Estimated title width is wider than a typical SERP display.
- title-keyword-missingwarning
The primary keyword is missing from the title.
- meta-description-no-ctawarning
The meta description has no call to action or differentiator.
- meta-description-truncated-sentencewarning
The meta description ends mid-word or without terminal punctuation.
Local SEO
- sab-address-leakerror
A street address appears on a service-area business, which is a GBP suspension risk.
- sab-schema-addresserror
PostalAddress with streetAddress is emitted while visitType is travel.
- sab-map-embederror
A map embed is pinned to an address while visitType is travel.
- nap-name-mismatcherror
The rendered business name differs from business.json or the cached Places name.
- nap-phone-mismatcherror
A phone number on the page differs from business.json.
- nap-address-mismatcherror
The street, town or postcode on the site differs from business.json or the cached Places address.
- localbusiness-schema-missingerror
No LocalBusiness JSON-LD in the build.
- opening-hours-as-imageerror
Opening hours are only present as an image.
- opening-hours-unmarkedwarning
Hours appear as text but have no openingHoursSpecification.
- areaserved-missingwarning
LocalBusiness schema has no areaServed.
- area-page-countwarning
More area pages exist than the configured maximum.
- service-area-not-in-contentwarning
A town name appears in the title or H1 but not in the body.
- phone-not-tel-linkfix
Wrap a bare phone number in a tel: anchor and strip spaces from tel: links.
- phone-format-inconsistentfix
Normalise every phone number to the format in business.json.
Schema
- schema-invalid-jsonerror
A JSON-LD script block does not parse.
- schema-missing-for-page-typeerror
Required schema is missing for this page type.
- faq-schema-content-mismatcherror
A FAQPage question does not appear in the visible body.
- aggregaterating-without-reviewserror
AggregateRating markup with no corresponding review source.
- review-schema-self-servingerror
Review markup sits on the business's own Organization or LocalBusiness entity.
- schema-required-propswarning
Type-specific required properties are absent.
- schema-orphan-entitywarning
Entities are not linked by @id.
- sameas-missingwarning
No sameAs links to a Google Business Profile or trade body.
Indexability
- noindex-on-publisherror
A robots directive contains noindex.
- sitemap-missingerror
No sitemap file in the build output.
- robots-blocks-pageerror
A built page is disallowed by robots.txt.
- canonical-missingfix
Insert a self-referential canonical.
- page-absent-from-sitemapfix
Add a built page that is missing from the sitemap.
- robots-txt-missingfix
Generate a default robots.txt with a sitemap reference.
Duplication
- duplicate-titleerror
Two pages share a title.
- broken-internal-linkerror
An internal href does not resolve to a built page or a valid fragment.
- duplicate-meta-descriptionerror
Two pages share a meta description.
- duplicate-h1error
Two pages share an H1.
- duplicate-faqerror
The same FAQ question appears on two or more pages.
- keyword-target-collisionerror
Two pages are assigned the same primary keyword.
- near-duplicate-bodywarning
Two pages have very similar body text.
- thin-pagewarning
Word count is below the floor for the page type.
Linking
- orphan-pageerror
A page in the sitemap is linked from nowhere.
- insufficient-internal-linkswarning
A service page has too few internal links.
- generic-anchor-textwarning
Anchor text is generic.
- page-missing-from-navwarning
A core page type is not reachable from the header.
- link-to-selffix
Remove an anchor pointing at the current page, keeping its text.
- external-link-no-relfix
Add rel=noopener to external links that open in a new tab.
Content
- placeholder-leakerror
A generator placeholder string was left in the content.
- unreplaced-tokenerror
A {token} was left unreplaced.
- rating-claim-without-reviewserror
A rating or review count is claimed without review data.
- em-dash-presentfix
Replace em dashes with a spaced hyphen.
- americanismfix
Replace American spellings with British ones, skipping schema and proper nouns.
- sentence-lengthwarning
Average sentence length is above 25 words.
- unsupported-superlativewarning
A superlative is used with no supporting credential.
- first-100-words-no-keywordwarning
The primary keyword is absent from the first 100 words.
- no-ctawarning
The page has no contact or telephone link.
- word-count-floorwarning
The page is below the word-count floor for its type.
AI visibility
- no-answer-blockwarning
The first paragraph does not name the service and the location.
- faq-countwarning
A service page should have five to eight FAQs.
- heading-not-questionwarning
No H2 on the page is phrased as a question.
- no-entity-corroborationwarning
No outbound link to a Google Business Profile or recognised trade body.
- table-or-list-absentwarning
A service page has no list or table.
- llms-txt-missingfix
Generate llms.txt from the site's pages and business details.
Assets
- image-alterror
An image is missing alt text.
- image-count-zeroerror
The page renders no images besides the logo.
- image-missing-dimensionsfix
Add width and height from the media table.
- image-filename-not-slugifiedfix
Rename an image file to a slug derived from its alt text.
- image-alt-too-longwarning
Alt text is longer than the configured maximum.
- image-alt-filenameerror
Alt text is a filename.
- image-alt-keyword-stuffedwarning
The same keyword appears three or more times in one alt string.
- image-oversizeerror
An image is larger than the configured byte limit after processing.
Imported sites
- imported-url-unmappederror
An old URL has no corresponding new page and no redirect.
- imported-title-changederror
A title that was already in band was rewritten.
- redirect-chainerror
A redirect destination is itself redirected.
- redirect-to-404error
A redirect points at a path that was not built.
- imported-content-lostwarning
A crawled section has no equivalent in the new content.
- imported-h1-changedwarning
The H1 differs from the original on a page that is not being retargeted.
- imported-image-lostwarning
An image from the crawled page is missing from the media library.
Privacy and consent
- legal-privacy-missingerror
The site has no privacy policy page at /privacy/.
- legal-footer-link-missingerror
The page footer does not link to the privacy policy at /privacy/.
- consent-missingerror
The page loads an analytics or marketing script before the visitor has given consent.