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.comorwww.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.