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 carryingrel="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) viaBlogIndexJsonLd; filtered / paginated variants deliberately skip them (seedocs/blog/seo-infrastructure.md)
Article page SEO behavior
- Metadata is built from Sanity content
seoTitleandseoDescriptionoverride title/excerpt when present- Open Graph image uses the Sanity
mainImagewhen available - Fallback OG image is
/images/og-image.png - Article pages emit:
ArticleJsonLdBreadcrumbJsonLd
- 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
linkedinUrlandxUrldestinations and open in a new tab; authorsameAsstructured 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