SEO meetings often start in the wrong room.

Someone opens a spreadsheet of keywords. Someone else debates whether the H1 should be eight words or eleven. Meanwhile the site serves the same article on three hosts, the sitemap lists 404s, and half the “blog” is noindex by accident from a staging flag that escaped to production.

Search engines are machines that discover URLs, choose a canonical, and decide whether the document deserves a place in an index. That is a systems problem. Copy quality matters — after the system is honest.

We treat technical SEO as index hygiene: crawl, canonicalize, declare intent, monitor. Keyword theater comes later, if at all.

Catalog drawers with an indigo path of light

Discovery is plumbing. Ranking arguments on broken plumbing are noise.

The only questions that matter first

  1. Can a bot fetch the URL?
  2. Which URL is the official one?
  3. What unique document lives there?
  4. Do we still know when that breaks?

If you cannot answer those for money pages, pause the content calendar.

Crawl: access without chaos

robots.txt and sitemaps

robots.txt is not a security tool. It is a crawl hint. Do not block CSS/JS the renderer needs. Do not “disallow /” on production because someone copied staging.

XML sitemaps should list indexable canonical URLs you care about — not every query-string variant and not deleted posts. When a URL dies, remove it from the sitemap and give it a deliberate redirect or 404 strategy.

Soft 404s (200 OK with “not found” body) train the index poorly. Broken internal links waste crawl budget and trust. Redirect chains (A→B→C→D) are how migrations rot.

After any IA change, crawl the key templates. Do not wait for Search Console to surprise you in six weeks.

Accidental noindex

Preview headers, env-based robots meta, and “hide from search until launch” flags that never get flipped are common. CI should fail if production builds emit noindex on routes that should rank.

Canonical: one truth per intent

Duplicates appear from:

  • www vs apex
  • http vs https
  • trailing slash policy
  • uppercase paths
  • tracking parameters
  • CMS aliases and printer views
  • pagination and facet URLs

Pick a host and slash policy. Enforce with redirects. Emit a self-referencing canonical on the chosen URL. Make internal links and the sitemap agree — three sources of truth that disagree is how the wrong variant wins.

Multi-locale sites need a deliberate hreflang map (or a simpler one-locale reality). Inventing hreflang without a locale strategy is worse than omitting it.

Intent: what the document is for

Once the URL is stable, the document must earn its slot:

  • Title and meta description that match the page (not a sitewide default)
  • One clear H1 aligned with the primary topic
  • Body that is not a thin clone of another service page with three words swapped
  • Structured data only when it is true (Organization, Article, FAQ) — fake rich results are a trust risk

Template sameness is fine for layout. Content sameness across URLs is how pages compete with themselves and lose.

Index hygiene: crawl, canonical, intent, watch

Performance is part of SEO

Core Web Vitals and page experience are not a separate religion from search. Slow LCP on mobile landings hurts users and is part of how quality is perceived in the ecosystem Google describes for page experience and Web Vitals.

You do not “do SEO” on Friday and “do performance” on Monday for the same URL. Same budget, same owners, same release gate.

JS rendering: do not make the index guess

If primary content only appears after client-side rendering, you are betting on crawlers executing your stack the way you hope. For marketing and editorial sites, HTML that contains the main content on first response is the reliable default (static generation or server render).

Use client JS for interaction, not for the paragraph that should rank.

Migrations without losing the plot

URL changes need a map:

Old URL New URL Type Owner
/services/old /services/new 301 Eng
/blog/legacy /blog/current 301 Content

Ship redirects with the deploy, not “we’ll add them if traffic drops.” Update internal links and sitemaps in the same release. Keep the map for a year; someone will ask.

Monitoring that is not vanity

Watch:

  • Coverage / indexation for critical templates
  • Spike in 404s and redirect chains
  • Field CWV on money URLs
  • Sudden title/canonical regressions after deploy (diff the head)

Search Console is necessary and late. Pair it with crawl checks in CI for robots, canonical host, and sitemap validity where you can.

Compass with indigo needle on pale stone

Orientation first. Distance rankings second.

What we refuse to call an SEO project

  • Keyword stuffing a thin page that is still a duplicate
  • Buying links while the site serves two domains
  • A blog that publishes without titles, sitemaps, or internal links
  • “SEO plugin installed” as a substitute for information architecture
  • Ranking goals with no instrumented URL list

A practical engineering checklist

  1. Single production host; HTTP→HTTPS; slash policy enforced.
  2. Money pages return 200 with unique titles and H1s.
  3. Canonicals self-point; aliases redirect or noindex.
  4. Sitemap = indexable set; robots allow that set.
  5. Main content in HTML; not locked behind client render.
  6. CWV budget on key landings (see performance budget practice).
  7. Redirect map for every retired URL.
  8. Post-deploy crawl of templates + Search Console watchlist.

Closing

SEO is not a spell you cast on copy. It is whether the right document is fetchable, unique, and stable under a single URL — and whether you notice when that stops being true.

Fix the index system. Then write. Then measure. Anything else is a debate about paint color while the door is off the hinges.


Need a technical SEO pass on a rebuild or migration? Start a project inquiry with your production host list and the ten URLs that must rank. That is enough to audit crawl and canonical truth.