# Content Backlog Workflow

**Last Updated:** 2026-02-08

Describes how the **Content & SEO Backlog** is built, where data lives, and how to use it for "optimize existing" vs "create new" decisions.

## Purpose

One place to decide **what to do next**: either improve existing posts (optimize) or create new content / target new keywords (create). All data and reports feed into or from this workflow.

## Data sources

### Per-post data

- **Location:** `docs/content/blog/posts/{category}/{slug}/data/`
- **Key files:** `prioritization-data.json`, `keywords-sistrix.json`, `serp-features.json`, `performance-gsc.json`, `performance-ga4.json`
- **Used for:** Priority score, quick wins, SISTRIX-backed actions (intent, PAA, competition). Feeds **optimize existing** in the backlog and [PRIORITY_DASHBOARD.md](PRIORITY_DASHBOARD.md), [SEO_ACTION_LIST.md](SEO_ACTION_LIST.md).

### Domain-level data

- **Location:** `docs/content/blog/domain-level-data/`
- **Key files:**
  - `domain-opportunities.json` – keywords where we could rank better (position, gain, traffic)
  - `content-ideas.json` – content ideas from SISTRIX
  - `competitive-gaps.json` – keywords competitors rank for that we don’t
  - `domain-competitors-seo.json` – top SEO competitors (similarity %)
- **Used for:** **Create new** section in backlog, [competitive analysis report](reports/competitive-analysis-YYYY-Q.md), and content-gap analysis.

## Scripts that generate the backlog

| Script | Output | When to run |
|--------|--------|-------------|
| [generate-content-backlog.php](v2/scripts/blog/generate-content-backlog.php) | [CONTENT_BACKLOG.md](CONTENT_BACKLOG.md) | After weekly-priority-refresh or after domain-level collection |
| [generate-seo-action-list.php](v2/scripts/blog/generate-seo-action-list.php) | [SEO_ACTION_LIST.md](SEO_ACTION_LIST.md) | Monthly or after priority refresh (optimize-only list) |
| [generate-competitive-analysis.php](v2/scripts/blog/generate-competitive-analysis.php) | [reports/competitive-analysis-YYYY-Q.md](reports/competitive-analysis-YYYY-Q.md) | Quarterly or after domain-level collection |
| [generate-priority-dashboard.php](v2/scripts/blog/generate-priority-dashboard.php) | [PRIORITY_DASHBOARD.md](PRIORITY_DASHBOARD.md) | Weekly (via weekly-priority-refresh) |

## Optimize existing vs create new

- **Optimize existing:** Use section 1 of [CONTENT_BACKLOG.md](CONTENT_BACKLOG.md) (top N posts by priority + actions). Same data as SEO_ACTION_LIST and PRIORITY_DASHBOARD. Pick posts with highest score or most quick wins; run per-post improvement (FAQ, meta, intent, PAA).
- **Already covered (optimize existing page):** Section 2a lists domain opportunities where we already rank with a **dedicated page** (tools, comparison, product, blog, industry, template, download, webinar, static). The backlog classifies each opportunity URL by **surface** (page type) so the full website is considered. Prefer optimizing that existing page over creating new content.
- **Create new (content gap):** Section 2b lists only **true content gaps** — keywords where the ranking URL is the homepage or "other" (no dedicated page yet). Consider a new blog post or new page only for these. For competitor context, use [reports/competitive-analysis-YYYY-Q.md](reports/competitive-analysis-YYYY-Q.md).

The backlog is built using a **site-surface classifier** (path prefixes and product/industry lists) so domain opportunities are labeled by surface (Tools, Comparison, Blog, Product, etc.). See `v2/scripts/blog/helpers/site-surface.php`.

## Keeping data fresh

- **Priority data (optimize):** Run `weekly-priority-refresh.php` weekly so priority scores and quick wins are current.
- **Domain-level (create new):** Run at least monthly: `collect-domain-opportunities.php`, `collect-domain-content-ideas.php`, `collect-competitor-keywords.php`. Run `collect-domain-seo-overview.php` weekly (~16 cr). See [MONITORING_RUNBOOK.md](MONITORING_RUNBOOK.md) and [DATA_COLLECTION_SCRIPTS_INVENTORY.md](DATA_COLLECTION_SCRIPTS_INVENTORY.md).

## Related docs

- [CONSOLIDATED_NEXT_STEPS.md](CONSOLIDATED_NEXT_STEPS.md) – single next-steps entry; points to CONTENT_BACKLOG for "what to do next"
- [README.md](README.md) – blog doc index; Key reports table includes CONTENT_BACKLOG
- [SISTRIX_ENDPOINTS_AND_REPORTS.md](SISTRIX_ENDPOINTS_AND_REPORTS.md) – which endpoints feed domain-level data and reports
