---
title: SEO — developer runbook
description: How to fix Health / SEO issue types — where in code or CMS, and how to verify.
---

# SEO — developer runbook

After an audit in **CMS Site → Health / SEO**, the report includes:

1. **Top 5** on Overview — urgent focus only.
2. **Full plan** on **Reports** — **all** open Audit issues (no “see backlog on Audit tab”), with developer steps and acceptance.
3. **Copy runbook (MD)** — markdown with every task.

A full text appears after a **new audit** (or “Create digest”). Older reports are enriched from playbooks by `issue_type`.

See also [Site Health / SEO](/en/guides/cms-seo-health).

## How to read a report

| Field | Meaning |
| --- | --- |
| `issue_type` | Stable problem code (catalog below) |
| Owner | Landing dev / CMS editor / DevOps / content |
| Where to fix (dev) | Layer: `<head>` template, sitemap, CMS field… |
| Developer steps | Concrete checklist |
| Acceptance | Done criteria before re-audit |
| URL / CMS | Where to reproduce |

After fixes: **Run audit** and compare score / open issues.

## API

```http
GET  /v1/cms/sites/{siteId}/seo/reports/{reportId}
GET  /v1/cms/sites/{siteId}/seo/reports/{reportId}/developer-doc
POST /v1/cms/sites/{siteId}/seo/digest
POST /v1/cms/sites/{siteId}/seo/scans
```

`developer-doc` → `{ data: { markdown, items, report_id } }`.

## `issue_type` catalog

### Crawl / indexability

| Type | Owner | Where | Fix |
| --- | --- | --- | --- |
| `sitemap_unreachable` | Landing | `/sitemap.xml` or Health URL | Valid sitemap 200 |
| `robots_unreachable` | Ops | `robots.txt` | Serve over HTTPS |
| `robots_blocks_all` | Ops | prod robots | Remove `Disallow: /` on prod |
| `robots_sitemap_missing` | Landing | robots.txt | `Sitemap: https://…` |
| `noindex_in_sitemap` | Landing | robots meta + sitemap filter | Indexable XOR in sitemap |
| `missing_canonical` | Landing | canonical link / metadata | Absolute self URL |
| `canonical_to_home` | Landing | canonical template | Don’t hardcode homepage |
| `http_4xx` | Landing | routes + redirects + sitemap | 200/301 or remove URL |
| `http_5xx` | Ops | logs / deploy | Fix crashes |
| `http_unreachable` | Ops | DNS / TLS / WAF | Page must open |

### On-page

| Type | Owner | Where | Fix |
| --- | --- | --- | --- |
| `missing_title` | Dev / CMS | `<title>` or `meta_title` | 20–70 chars, unique |
| `duplicate_title` | Dev | per-route metadata | Unique titles |
| `missing_description` | Content | meta / CMS | 50–160 chars |
| `missing_h1` | Dev / CMS | one `<h1>` or `#` | Visible H1 |
| `multiple_h1` | Dev / CMS | extra h1 → h2 | Exactly one H1 |
| `thin_content` | Content | page body | 200–400+ words or noindex |
| `dirty_url_slug` | CMS | slug | ascii + hyphens |
| `images_without_alt` | CMS / Dev | `alt` / `cover_alt` | Meaningful alt |
| `missing_json_ld` | Dev | JSON-LD | Organization / WebSite / Article |
| `schema_invalid` | Dev | JSON-LD build | `JSON.stringify` + validator |

### CMS

| Type | Owner | Where | Fix |
| --- | --- | --- | --- |
| `cms_seo_readiness` | CMS editor | Blog/KB meta, H1, alt | Checklist + Generate SEO |
| `cms_no_website_url` | CMS editor | Website URL | Public HTTPS URL |

### Performance

| Type | Owner | Where | Fix |
| --- | --- | --- | --- |
| `psi_low_score` | Dev | bundle, hero, CDN | PSI Opportunities |
| `cwv_lcp` | Dev | LCP media + TTFB | Preload / WebP |
| `cwv_cls` | Dev | sizes, fonts, banners | Reserve space |
| `cwv_inp` | Dev | JS / handlers | Fewer long tasks |
| `slow_ttfb` | Ops | SSR / edge cache | TTFB &lt; ~800–1000 ms |

## Suggested order

1. **Ops:** `robots_*`, `http_5xx` / unreachable, TTFB.
2. **Landing:** sitemap, canonical, title/H1 template, JSON-LD, CWV.
3. **CMS editor:** readiness, alt, article meta (AI generate in editor).
4. Re-run audit → score up, issues closed.

## What the audit does not do

It does not scrape SERP rankings by itself. Organic and average position come from GSC / Yandex Webmaster. The to-do list is **Check site** (recommendations; you apply them on the live site).
