The full checklist is run once for the project. These are the ones that can be right on the home page and wrong on the news archive, so they get run per template - and a template is any page that renders differently, not any URL.

Each item here is the same rule under the same id as on the checklist, not a second copy of it.

Every template 21 items

  • Images carry alt text that earns its place empty alt on decorative, never "image of" blocker

    Every image has an alt attribute, decorative ones are empty, and reading the alt text of a page aloud conveys the same information as seeing it.

    Without it, a screen reader reads out the filename instead, and a client-filled media library passes the scanner with alt text nobody wrote.

    Standard Web Content Accessibility Guidelines (WCAG) 2.1 1.1.1 (A), in part

  • Every indexable page declares a self-referencing canonical one, absolute, on the live host blocker

    Each sampled page returns one canonical, absolute, on the live host, equal to the URL that was requested once redirects have resolved.

    Without it, one rename leaves 87 URLs canonicalising somewhere else, and the crawler consolidates the whole set onto the wrong address.

    Automated check: seo-status:canonical

    Vendor documentation Google Search Central documentation crawling-indexing/consolidate-duplicate-urls, in part

  • Production is indexable and staging is not driven by environment, never a checkbox blocker

    The production home page carries no noindex in the meta robots or the X-Robots-Tag header, and its robots.txt does not disallow the whole site. Staging carries noindex everywhere.

    Without it, a database pull from staging carries blog_public=0 into production and the site goes dark after a deploy that reported success.

    Automated check: seo-status:home-index, seo-status:robots

    Vendor documentation Google Search Central documentation crawling-indexing/block-indexing, in part

  • The page survives 200 percent zoom and a 320px viewport no loss at 200%, no h-scroll at 320px, body text 16 px+ required

    At 200 percent zoom no content is lost or overlapping, at 320px wide the page scrolls vertically only, and body text computes to at least 16 px at every sampled width.

    Without it, body overflow-x hidden suppresses the measurable instead of passing it, and the clipped content is unreachable, not just off-screen.

    Standard Web Content Accessibility Guidelines (WCAG) 2.1 1.4.10; 1.4.4 (AA), in part

  • Every page below the home page shows one breadcrumb trail one trail, root in page language, BreadcrumbList mirrors it required

    Each sampled page below the home page shows exactly one trail, its root item in the page's language, its last item not a link, and its BreadcrumbList lists the same items in the same order under the same names. The Rich Results Test reports 0 BreadcrumbList errors.

    Without it, the breadcrumb Google prints in the result is not the one on the page - wrong language, a level short, on every result for the site.

    Vendor documentation Google Search Central documentation structured-data/breadcrumb#list-item, in part

  • The content that must rank is in the server HTML h1, copy and links present with JavaScript off required

    curl on one URL of each template returns HTML containing the h1 text, the first paragraph of body copy and every link in the main navigation. Nothing that has to rank appears only once JavaScript has run.

    Without it, the copy that has to rank waits in a render queue that may never come round, and DevTools shows it present the whole time.

    Vendor documentation Google Search Central documentation javascript-seo-basics#how-googlebot-processes-javascript, in part

  • Slugs are readable, hyphenated and in the page's language no ids, no dates, under 115 chars, page's language required

    Every URL in the crawl is under 115 characters, separates words with hyphens rather than underscores, carries no numeric id or date segment, and is in the same language as the page it serves. 0 exceptions across the sampled templates.

    Without it, an English page ends up served on a French slug, or /?cat=38 in the results, and fixing it after launch means redirects and a fresh crawl.

    Client document Technical SEO control grid row 60not public

  • Every template is opened in all three browser engines Blink, Gecko and desktop WebKit - three passes required

    Every template on the template list has been opened in Chrome, Firefox and desktop Safari - three engines, none checked in fewer - and each difference found is either fixed or written down.

    Without it, a Firefox-only break ships because every check ran in Chromium, and the client's own team is the one that finds it.

    Client document Website Design and Development Checklist section 15, item 4, in partnot public

  • Form inputs are 16 pixels so iOS does not zoom on focus 16 px computed at 390 px, and pinch-zoom still works required

    Only when the project has a form that collects data from a visitor.

    At a 390px viewport, every input, select and textarea computes to 16px or more, focusing one does not change the page scale, and the viewport meta sets neither user-scalable=no nor a maximum-scale.

    Without it, tapping the email field on an iPhone zooms the page in and leaves the rest of the form off the right edge with no way back.

    Client document Website Design and Development Checklist section 4, item 1, in partnot public

  • One h1 per page, and no skipped heading levels required

    Each sampled page has exactly one h1, no two sampled pages share an h1, and the heading outline never jumps a level going down, for example h2 straight to h4.

    Without it, a screen-reader user skimming by heading level hits an h3 under an h1 and cannot tell which section it belongs to.

    Standard Web Content Accessibility Guidelines (WCAG) 2.1 1.3.1 (A), in part

  • Structured data says what the page actually says type fits the page, values match the rendered copy required

    On three sampled pages every emitted value matches the rendered page: headline equals the visible title, author is a name rather than a language code, dates match, and no rating, price or count is emitted that the page itself does not show.

    Without it, Google is told the article is 8 words long when 659 are on screen, and the validator that would catch a typo reports it all green.

    Automated check: seo-status:org-brand, seo-status:org-sameas

    Vendor documentation Google Search Central documentation appearance/structured-data/sd-policies, in part

  • Images ship in a modern format at the size they display WebP or AVIF with srcset and sizes, 200 KB per image at most required

    No image transfers more than twice the bytes needed at its displayed size, the image audits report no meaningful savings from format or sizing, no single image exceeds 200 KB on the wire, and no animated GIF is served.

    Without it, a phone on mobile data downloads the 2000px desktop hero to paint it 390px wide, several times the bytes it needed.

    Vendor documentation Web Vitals choose-the-right-image-format, in part

  • Each template has a transfer and DOM budget under 2 MB without video, 1400 elements or measured required

    First-load transfer is under 2 MB per sampled template, video excluded, and anything over names its three largest resources. Element count is under 1400, or over it with a median mobile TBT at or under 200 ms recorded on the largest page that template renders.

    Without it, a template renders 2774 DOM elements against a 1400 budget, and every style recalc and scroll handler pays for all of them.

    Client document Technical SEO control grid rows 134, 139, in partnot public

  • The layout survives the phone's real viewport nothing clipped by the toolbar or notch, landscape usable required

    On a real phone at 390x844: no section clipped by the browser toolbar in either orientation, no text or control under the notch or home indicator, and a sticky header at 15 percent of viewport height or less in landscape.

    Without it, the phone's home indicator sits on top of the fixed CTA bar, and the visitor cannot tap the one button that matters.

    Client document Website Design and Development Checklist section 11, item 5, in partnot public

  • The layout holds at every width, not just the design widths 320 to 2560, no h-scroll, no overlap required

    No horizontal scrollbar at any width from 320 up, no clipped or overlapping content, and no layout that only works at the exact design breakpoints.

    Without it, a 900px laptop sits between two drawn widths, and nobody opens one before launch, so that is where the heading lands on the image.

    House rule Delivered reference builds, audited together one breakpoint map plus body overflow-x hidden, both buildsnot public

  • Open Graph and Twitter card tags are complete 8 tags, absolute og:image at 1200x630 required

    All eight tags are present on a sampled page, og:url matches the canonical, and the og:image URL is absolute and returns an image of at least 1200 by 630.

    Without it, the client shares the launch post on LinkedIn and gets a grey box with a bare URL where the brand image should be.

    Standard The Open Graph protocol og:title, og:type, og:image, og:url, in part

  • The sitemap lists every indexable URL and nothing else one generated sitemap, all 200, none noindex required

    The sitemap index returns 200, every child returns 200, a sample of ten listed URLs returns 200 with no redirect, and no listed URL carries noindex. Only one sitemap source answers; the other returns 404, and robots.txt names the one that does.

    Without it, seven URLs in one live sitemap answer 404, six of them category archives with no template, and the crawler is handed them on purpose.

    Automated check: seo-status:sitemap, seo-status:tax-sitemaps

    Vendor documentation Google Search Central documentation crawling-indexing/sitemaps/build-sitemap, in part

  • Structured data is present, valid and singular one node per type per page, no errors required

    Google's Rich Results Test reports no errors on the home page and one interior page, and exactly one Organization node exists per page with a name matching the brand.

    Without it, two Organization nodes give Google two different names for the brand, and nobody decides which one it takes.

    Automated check: seo-status:org-one, seo-status:org-brand, seo-status:org-sameas

    Vendor documentation Google Search Central documentation appearance/structured-data/intro-structured-data, in part

  • Titles and descriptions are present, unique and the right length titles 30-60, descriptions 70-160, one of each per page required

    No sampled page is missing a title or description, no two sampled pages share either, lengths sit in range, and each page carries exactly one title element, one description and one robots meta.

    Without it, two templates share one title, so the results give no way to tell the pages apart and Google rewrites the title link itself.

    Vendor documentation Google Search Central documentation appearance/title-link, in part

  • The current page is marked in the navigation exactly one aria-current=page per navigation required

    On five pages including one section landing page, the main navigation carries exactly one aria-current="page" and it is the item for the URL loaded. No other navigation on the page carries more than one.

    Without it, a screen-reader user tabbing through the menu gets nothing saying which item is the page they are already standing on.

    Client document Website Design and Development Checklist section 3, item 7, in partnot public

The golden minimum

One piece of content, one indexable URL, self-canonical to a 200, in the sitemap only if it is indexable, utility pages noindex without a Disallow, at least one real HTML link pointing at it, and no two signals saying different things.