# Blog Traffic & SEO Audit Runbook

**Last Updated:** 2026-03-17

Ordered steps for auditing blog traffic and SEO data, when to run (weekly vs monthly), and how to interpret results.

## Audit steps (full)

1. **Check data freshness**
   ```bash
   php v2/scripts/blog/check-data-freshness.php --all --max-age=7
   ```
   - Review output: fresh vs stale vs missing counts.
   - If many stale: run `--tier=1 --max-age=7 --auto-refresh` when API credits allow, or run `weekly-priority-refresh.php` to refresh GA4/GSC.

2. **Validate data collection**
   ```bash
   php v2/scripts/blog/validate-data-collection.php --all --stale-days=30
   php v2/scripts/blog/validate-api-data-quality.php --all
   ```
   - Note missing files and stale data; fix critical gaps for priority posts.
   - **After SISTRIX or report script changes:** Re-run these validators to ensure no regressions.

3. **Regenerate dashboards and reports**
   ```bash
   php v2/scripts/blog/generate-data-freshness-report.php
   php v2/scripts/blog/monitor-collection-health.php
   php v2/scripts/blog/generate-priority-dashboard.php
   php v2/scripts/blog/generate-traffic-seo-snapshot.php
   ```
   **Monthly (optional):** Generate SEO Action List for editorial use:
   ```bash
   php v2/scripts/blog/generate-seo-action-list.php --limit=15
   ```
   Output: [SEO_ACTION_LIST.md](SEO_ACTION_LIST.md) – top N posts with quick wins and 1–2 SISTRIX-backed actions per post.

4. **Review**
   - [DATA_FRESHNESS_REPORT.md](DATA_FRESHNESS_REPORT.md) – stale/missing file counts and recommendations.
   - [COLLECTION_HEALTH_DASHBOARD.md](COLLECTION_HEALTH_DASHBOARD.md) – GSC/GA4 errors, API status, Domain SEO health (visibility index) and Domain SEO overview (SEO kw count, ranking distribution, top 5 competitors). Run `collect-domain-seo-overview.php` weekly (~16 cr) to populate overview; see [MONITORING_RUNBOOK.md](MONITORING_RUNBOOK.md).
   - [PRIORITY_DASHBOARD.md](PRIORITY_DASHBOARD.md) – quick wins and opportunities; section 7 = Recommended actions (SISTRIX).
   - [SEO_ACTION_LIST.md](SEO_ACTION_LIST.md) – monthly action list (if generated).
   - [TRAFFIC_SEO_SNAPSHOT_*.md](TRAFFIC_SEO_SNAPSHOT_2026-02-08.md) – top posts by clicks/impressions/page views.

## Cadence

| Task | When |
|------|------|
| Freshness check | Weekly (e.g. after weekly-priority-refresh) |
| weekly-priority-refresh | Weekly (Monday 10 AM cron) |
| DATA_FRESHNESS_REPORT / COLLECTION_HEALTH_DASHBOARD | Weekly (regenerate after refresh or as separate step) |
| Full validation (validate-data-collection + validate-api-data-quality) | Weekly or bi-weekly |
| Traffic/SEO snapshot | Monthly or quarterly |
| SEO Action List (generate-seo-action-list.php) | Monthly (optional) |
| Full audit (all steps above) | Monthly or quarterly |

## Interpreting results

- **Stale data (>7 days):** Run GA4/GSC collection (e.g. weekly-priority-refresh) or Tier 1 auto-refresh. SISTRIX has a 30-day threshold and credit limits.
- **Missing files:** Expected for placeholder slugs (e.g. `{feiertagszuschlag}`). For real posts, run collection for that post or fix slug/path.
- **Zero GSC but non-zero GA4:** Possible URL mismatch or GSC delay; re-run GSC collection or check post URL in GSC.
- **High error counts in COLLECTION_HEALTH_DASHBOARD:** Check GSC/GA4 logs and API credentials; see [MONITORING_RUNBOOK.md](MONITORING_RUNBOOK.md) troubleshooting.

## Blog Image & Meta Audit (monthly or pre-release)

Ordered checklist for image alt, dimensions, and SEO meta validation. Run before major releases or monthly.

1. **Backup**
   ```bash
   python3 scripts/blog/backup-blog-content.py --manual
   python3 scripts/blog/validate-backup.py docs/backups/blog-snapshots/<timestamp>
   ```

2. **Audit featured image alt**
   ```bash
   php v2/scripts/blog/audit-blog-image-alt.php
   ```
   Exit: 0 if all OK; 1 if issues. Fix: `fix-featured-image-alt.php --all` (dry-run first).

3. **Audit inline content images**
   ```bash
   python3 v2/scripts/blog/audit-content-image-alt.py
   ```
   Exit: 0 if all OK. Fix: `fix-image-attributes.py` if needed.

4. **Audit content image dimensions**
   ```bash
   python3 v2/scripts/blog/audit-image-dimensions.py
   ```
   Exit: 0 if all OK. Fix: `fix-content-image-dimensions.py` if needed.

5. **Validate SEO meta**
   ```bash
   php v2/scripts/blog/validate-seo-meta.php
   ```
   Fix: index/category meta in `blog-meta-generator.php`; post meta via `normalize-seo-titles.php` + `sync-meta-to-posts.php`, or `seo-meta.json` overrides.

6. **Validate schema**
   ```bash
   php v2/scripts/blog/validate-schema.php
   php v2/scripts/blog/validate-faq-schema.php --all
   php v2/scripts/blog/validate-schema-speakable.php
   ```

7. **Validate (optional)**
   ```bash
   php v2/scripts/dev-helpers/validate-og-images.php --local
   php v2/scripts/blog/validate-production-comprehensive.php
   php v2/scripts/blog/validate-blog-content.php --type=all
   ```

**Exit criteria:** All audit scripts exit 0; no critical errors in validate-seo-meta.

## Related

- [MONITORING_RUNBOOK.md](MONITORING_RUNBOOK.md) – Cron setup and troubleshooting
- [SEO_DATA_MANAGEMENT.md](SEO_DATA_MANAGEMENT.md) – Data freshness and collection
- [IMAGE_ALT_AUDIT_REPORT.md](IMAGE_ALT_AUDIT_REPORT.md) – Image alt audit findings
- [BLOG_IMAGE_ALT_GUIDELINES.md](BLOG_IMAGE_ALT_GUIDELINES.md) – Alt standards
- [README.md](README.md) – Blog documentation index
