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 */}
</>
)
}