Overview

A page with perfect content gets no traffic if crawlers cannot reach it, the canonical points elsewhere, or the content is not in the initial HTML. Use this page as the pre-publish checklist; each topic links to its deep dive.

Serve a clean robots.txt and a real sitemap.xml

Place both at the site root. robots.txt declares crawl scope and sitemap.xml declares what exists.

# https://example.com/robots.txt
User-agent: *
Allow: /
Disallow: /admin/
Disallow: /api/

Sitemap: https://example.com/sitemap.xml

Disallow stops crawling, not indexing, and a blocked URL cannot show a noindex tag, so use noindex on a crawlable page to keep it out of the index. Generate the sitemap on build with <lastmod> taken from the page’s last_updated; never hand-edit it. Submit it once in Google Search Console and Bing Webmaster Tools, and pair it with indexnow for Bing and other participants. Google and Bing ignore changefreq and priority. See sitemaps-deep.

Declare one self-referential canonical per page

Every indexable page declares its own URL as canonical, which stops parameter and protocol drift from splitting signals.

<link rel="canonical" href="https://example.com/seo/technical" />

Variants (UTM parameters, sorted lists, paginated tails) point at the clean canonical, except paginated pages, which self-canonicalize (pagination-and-facets). Never declare two canonicals or leave the tag off an indexable page. A canonical is a hint; a 301 is stronger when URLs are truly equivalent.

Pick one URL form and enforce it

Fragmented URLs fragment rankings. 301 every other form to the chosen one.

  • HTTPS only, with every http:// request redirected.
  • One host, example.com or www.example.com.
  • One trailing-slash policy.
  • Tracking parameters stripped at the edge or canonicalized away.

See redirects for status codes and chains.

Meet the Core Web Vitals thresholds at p75

Target LCP of 2.5 s or less, INP of 200 ms or less, and CLS of 0.1 or less on field data. The levers are less JavaScript, a preloaded LCP image, reserved space for images and embeds, and deferred third-party scripts. Details are in core-web-vitals and page-speed; image work is in image-seo.

Use one H1 and headings in order

Each page has exactly one <h1> matching its intent, then <h2> and <h3> without skipped levels. Do not style a <div> as a heading; screen readers and crawlers both read the DOM.

Ship content in the initial HTML

Google indexes the mobile version (mobile-first) and renders JavaScript on a delay, so for any page that depends on search, return the content, links, canonical, and JSON-LD in the first HTML response. Use static generation (Astro, Next.js output: "export", Quartz) or server rendering (Next.js App Router, Remix, Astro output: "server"); reserve client-only rendering for authenticated surfaces. See javascript-seo and structured-data.