Seo

SEO

Our marketing pages share a central SEO helper so titles, descriptions and structured data stay consistent across locales. The main entry point for page metadata is createMarketingMetadata in apps/cats/src/seo/seo.tsx.

createMarketingMetadata

createMarketingMetadata(overrides?: MarketingSeoOverrides) returns a Promise that resolves to a Next.js Metadata object. It:

  • loads locale-specific copy from the marketing SEO message bundle
  • derives sensible defaults for canonical URLs, Open Graph, and Twitter cards
  • merges any overrides you provide

Basic usage in a route

import { ROUTES } from "@cats/src/constants"
import { createMarketingMetadata } from "@cats/src/seo/seo"
import { getLocale, getTranslations } from "next-intl/server"
 
export async function generateMetadata() {
  const locale = await getLocale()
  const t = await getTranslations("landing")
 
  return createMarketingMetadata({
    title: t("title"),
    description: t("description"),
    canonicalPath: ROUTES.home,
    locale
  })
}

Structured data

Global structured data (organisation details) is exposed via GlobalMarketingStructuredData. Include this component once per page to render the shared JSON-LD scripts:

import { GlobalMarketingStructuredData } from "@cats/src/seo/seo"
 
export default function MarketingPage({ params: { locale } }) {
  return (
    <>
      <GlobalMarketingStructuredData locale={locale} />
      {/* Page content */}
    </>
  )
}