Skip to main content

Blog SEO and Routing

Routes

  • /blog
  • /blog/[slug]

URL contract

  • /blog?page=2
  • /blog?category=investing
  • /blog?q=retirement
  • Combinations are supported and preserved in pagination links

Index page SEO behavior

  • Canonical URL always points to /blog
  • Filtered and paginated index states are marked noindex
  • Default unfiltered page 1 remains indexable
  • Category tabs and the Previous / Next pagination controls are crawlable <a href> anchors carrying rel="prev" / rel="next" — no JS is required to reach any filter state or paginated URL
  • Search is a native GET form (<form action='/blog'>) so a search URL is bookmarkable, shareable, and crawlable
  • On the canonical index the page emits three JSON-LD schemas (Blog, ItemList, BreadcrumbList) via BlogIndexJsonLd; filtered / paginated variants deliberately skip them (see docs/blog/seo-infrastructure.md)

Article page SEO behavior

  • Metadata is built from Sanity content
  • seoTitle and seoDescription override title/excerpt when present
  • Open Graph image uses the Sanity mainImage when available
  • Fallback OG image is /images/og-image.png
  • Article pages emit:
    • ArticleJsonLd
    • BreadcrumbJsonLd
  • The visible “Back to blog” link returns to the directory. The Home → Blog → Article hierarchy remains in breadcrumb structured data. Related-post image cards are crawlable links into the full Sanity article archive.
  • Author profile links use the Sanity linkedinUrl and xUrl destinations and open in a new tab; author sameAs structured data remains unchanged.
  • Articles are authored as drafts in Sanity (Studio or MCP) and published by a human in the Studio. Sanity is the sole source for article content; the publish webhook revalidates affected routes and notifies IndexNow.
  • Editorial CTA blocks are rendered as visible article content. Their product claims and destinations must be verified, but they do not change canonical, indexability, or routing behavior.

Sitemap

app/sitemap.ts now includes:
  • /blog
  • every published Sanity blog slug when Sanity is configured
If Sanity is not configured, the sitemap excludes blog URLs to keep builds stable.