Overview
Technical SEO is the floor under everything else. A page can have perfect content and zero traffic if crawlers cannot reach it, browsers cannot render it fast, or the canonical points somewhere else. Treat this page as the pre-publish checklist for any site that wants organic search to work.
Serve a clean robots.txt and a real sitemap.xml
Place both at the site root. robots.txt declares crawl scope; sitemap.xml declares what exists.
# https://example.com/robots.txt
User-agent: *
Allow: /
Disallow: /admin/
Disallow: /api/
Sitemap: https://example.com/sitemap.xml
The sitemap lists every canonical URL with <lastmod> from the page’s last_updated. Regenerate it on build; never hand-edit. Submit it once in Google Search Console and Bing Webmaster Tools; the engines refetch on their own. Pair the sitemap with indexnow for near-instant change notification on Bing and Yandex.
One canonical per page, and the canonical is self-referential
Every indexable page declares its own URL as canonical:
<link rel="canonical" href="https://example.com/seo/technical" />Self-referential canonicals prevent parameter and protocol drift from splitting ranking signals. Non-canonical variants (UTM params, sorted lists, paginated tails) point at the canonical, not at themselves. Never declare two canonicals; never leave the tag missing on indexable pages.
Pick one URL form and enforce it
URL drift fragments rankings. Pick one form per page and 301 every other form to it.
- One protocol: HTTPS only. 301 every
http://request tohttps://. - One host:
example.comorwww.example.com, not both. - One trailing-slash policy: trailing slash on directories, no slash on leaf pages, or vice versa. Whichever you pick, redirect the other.
- Strip tracking parameters at the edge or canonicalize them away.
?utm_source=should never produce a separate index entry.
Hit Core Web Vitals on the 75th percentile
Google’s field thresholds, measured on real users:
- LCP (Largest Contentful Paint) under 2.5 seconds.
- INP (Interaction to Next Paint) under 200 milliseconds.
- CLS (Cumulative Layout Shift) under 0.1.
Optimize in this order: ship less JavaScript, preload the LCP image with fetchpriority="high", reserve space for images and embeds with width and height, defer third-party scripts. Verify with PageSpeed Insights against the CrUX field data, not lab scores.
One H1, headings in order, no skips
Each page has exactly one <h1>, and it matches the page intent. Subsections use <h2>; sub-cases use <h3>. Do not skip levels (no <h2> followed by <h4>). Do not style a <div> to look like a heading; screen readers and crawlers both read the DOM.
SSR or static for content-heavy pages
Crawlers render JavaScript, but they render it on a budget and with delay. For any page that depends on search traffic, ship the content in the initial HTML response.
- Static generation (Astro, Next.js
output: "export", Quartz) for content that changes on deploy. - SSR (Next.js App Router, Remix, Astro
output: "server") for content that changes per request but must be in the HTML. - Client-only rendering only for authenticated, interactive surfaces that do not need to rank.
Pair the rendering choice with structured-data in the same HTML response so the markup and the JSON-LD stay in sync.