SEO & Analytics
En resumen
A baseline SEO and analytics layer that sits under every CMS site — per-page meta titles and descriptions with auto-derivation, Open Graph images for social sharing with cascading defaults, structured data emitted as JSON-LD (SportsClub, Event, NewsArticle, BreadcrumbList), privacy-respecting cookieless analytics, real-user Core Web Vitals tied to publish events, and crawl control via robots.txt, per-page noindex toggles and language-aware canonical URLs.
Cómo funciona
SEO is treated as a first-class concern of every CmsPage. Each page has meta_title and meta_description fields that the renderer composes into `<title>` and `<meta name="description">` tags using a configurable site-level title format (`<page> | <site>` or `<site> — <page>`) with a separator and length cap. When fields are blank, the system auto-derives — title from the page H1, description from the first text block (HTML stripped, truncated).
Open Graph data per page (og:title, og:description, og:image, og:type) feeds the social-share cards on Facebook, LinkedIn and messaging apps; a default og:image cascades from page → site → tenant logo so editors never ship a broken card. Structured data is auto-generated as JSON-LD: every site emits SportOrganization or SportsClub, events emit Event, articles emit NewsArticle, and breadcrumbs emit BreadcrumbList. Schemas validate against schema.org rules at render time.
Analytics uses a privacy-respecting provider (Plausible by default, with Umami as a self-hosted option) — no cookies, no IP storage, GDPR-friendly without a banner. Editors see top pages, referrers, geographic distribution and event tracking in a per-site dashboard, with parent-tenant rollups for federation admins. Performance monitoring captures Core Web Vitals (LCP, INP, CLS) per page from real user metrics, surfaces regressions, and ties them to the most recent publish event so editors can correlate cause and effect.
Crawl control is per site: editors flip `is_indexable` per page, the renderer emits `noindex` and the sitemap excludes the page; canonical URLs are auto-resolved with language awareness so Google never indexes duplicate content.
Capacidades clave
- Per-page meta title and description with site-level title format and length caps
- Open Graph image cascade (page → site → tenant logo) for social sharing
- JSON-LD structured data: SportsClub, Event, NewsArticle, BreadcrumbList
- Privacy-first analytics (Plausible/Umami) without cookies or banners
- Real user Core Web Vitals tied to publish events
- Per-page noindex toggle reflected in sitemap and meta tags
- Auto-resolved canonical URLs with language awareness
En la práctica
Kati at the Norwegian Federation ships a redesigned home page and notices LCP rose from 1.4s to 2.3s in the performance dashboard the next morning. The dashboard pinpoints the publish event from yesterday and shows the hero image is the LCP element. She opens the page, swaps the hero to a smaller PetanqueImage variant with `priority`, republishes, and the next ISR build cuts LCP back to 1.5s — confirmed in the dashboard within the hour.
Meanwhile the analytics view shows a 30% jump in social referrals after she set a custom og:image for the new home page. The structured-data validator confirms her SportsClub schema is recognized by Google, and the federation appears with a richer knowledge panel a week later.
Funcionalidades de este subsistema
6| ID | Status | Funcionalidades |
|---|---|---|
| F18.08.01 | Entregado | Per-page meta titles and descriptions — PL-F1808 ✅ PL-F1808 |
| F18.08.02 | Entregado | Open Graph images for social sharing — PL-F1808 ✅ PL-F1808 |
| F18.08.03 | Entregado | Structured data (JSON-LD: SportOrganization, Event, etc.) — PL-F1808 ✅ PL-F1808 |
| F18.08.04 | Entregado | Analytics integration (privacy-respecting, e.g., Plausible/Umami) — PL-F1808 ✅ PL-F1808 |
| F18.08.05 | Entregado | Page performance monitoring — PL-F1808 ✅ PL-F1808 |
| F18.08.06 | Entregado | Search engine indexing control (robots.txt, canonical URLs) — PL-F1808 ✅ PL-F1808 |