# Urlaubskonto — creation notes

**Last Updated:** 2026-03-23

## Summary

Lexikon post **urlaubskonto** (Abwesenheiten/Urlaub cluster): operative Saldenführung vs. Urlaubsanspruch, Resturlaub, Urlaubsrückstellung, Arbeitszeitkonto; digitale Führung; typische Fehler.

## Depth & headings (revision)

- **Applied:** Full body replace via `update-post-content.php --html=/tmp/urlaubskonto-body-v4.html` (~**2.000** Wörter, H2=10, **H3=0**): skyscraper vs. Wettbewerb; alle Sekundär-Keywords aus `data/target-keywords.json` im Fließtext; fünf-Schritte-`<ol>` unter „Wie wird … berechnet?“; explizit **Urlaubskonto vs. Resturlaub**, **Urlaubskonto Software**, **Urlaubskonto führen** / **Arbeitgeber**.
- **`meta.keywords`** im Post-JSON erweitert (Secondary + Primär); zentrale `seo-meta.json` weiterhin title/description-only.
- **Validator-Hinweise:** `validate-new-post.php --strict` kann **WARN** „0 H3s“ ausgeben — bewusst, siehe `CONTENT_OUTLINE.md` Revision + [CONTENT_CREATION_WORKFLOW_2026.md](../../../CONTENT_CREATION_WORKFLOW_2026.md) Punkt 6. `validate-content-completeness.php` kann **WARN** „width over depth“ bei 10 H2s liefern; jeder H2 erfüllt Section-Depth (PASS).
- **People-first:** Abschnitt Bank vs. Betrieb und Intro ohne SERP-Meta („In Suchergebnissen…“, „Suchbegriffe…“, „unten ordnen wir“); Abnahme: `audit-meta-intro-language.py --json-posts --path-contains lexikon/urlaubskonto --fail-on high` → 0 Treffer.
- **Depth (weitere Ausarbeitung):** u. a. Bank-H2 (+ Lohnabrechnung/Handbuch), Vergleich (+ Finance vs. HR-Sprache nach Tabelle), Digitales (+ Self-Service/Rollen), Krankheit-im-Urlaub (+ Prozesshinweise), Fazit (+ Vertrag/System/Kommunikation); **~2.261 Wörter** Gesamt.

## Commands run (high level)

- Backup: `python3 scripts/blog/backup-blog-content.py --manual` → `docs/backups/blog-snapshots/2026-03-23-134924/`
- Scaffold: `php v2/scripts/blog/create-new-blog-post.php --topic="Urlaubskonto" --category=lexikon` (long SEO title in scaffold step)
- Pipeline: `run-new-post-pipeline.php`; SISTRIX PAA weak → `data/paa-questions-manual.json`; primary keyword fix in post JSON → `collect-post-competitor-analysis.php --keywords=primary-only`
- Outline/briefs: `generate-section-briefs.php`; `validate-serp-outline-ready.php`, `validate-content-outline-quality.php`, `check-outline-h2-overlap.php`
- Body: `content-draft.html` → `update-post-content.php` (iterations for depth/word count)
- FAQs: manual `data/faq-answers-optimized.json` → `add-faqs-to-post.php`
- SEO: `v2/data/blog/seo-meta.json` key `lexikon/urlaubskonto` → `sync-meta-to-posts.php --post=urlaubskonto --category=lexikon`
- Related: curated `related_posts` (replaced noisy `suggest-related-posts` output); `add-new-post-to-related-carousels.php --write` → 9 cluster targets
- Bidirectional: `urlaubsrueckstellung` intro link **Urlaubskonto** → `/insights/lexikon/urlaubskonto/`; `resturlaub` definition → lexikon urlaubskonto
- Product mapping: `blog-product-feature-mapping.json` → `urlaubskonto`, `urlaubssaldo`, `resturlaub-saldo` → `/abwesenheiten` (+ Zeiterfassung/Schichtplan where applicable)
- Lead: `_slugToBenefit` `urlaubskonto` in `generate-lead-capture-copy.php` → `generate-lead-capture-copy.php --write`
- LLM: `php v2/scripts/llms/sync-blog-posts-to-llms.php --add --post=urlaubskonto --category=lexikon`
- Image: `IMAGE_PROMPT.md` (DESK/digital-saldo); `audit-blog-image-scene-types.py --category=lexikon --report-adjacent=3`; `generate-blog-featured-image.py --post=urlaubskonto --category=lexikon` → WebP `/insights/bilder/urlaubskonto-*w.webp`

## Validators

- `validate-section-depth`, `validate-content-completeness`, `validate-faq-quality`, `check-h2-faq-overlap`, `compare-content-to-competitors`, `validate-new-post.php --strict` (warnings: optional H3s, suggest-ordio-feature / contextual tool links — accepted)
- `validate-internal-links-exist.php --strict` — pass

## Inventory / follow-up (optional)

- **Done (2026-03-23):** `merged.json` — `urlaubskonto`: `ordio_covered: true`, `ordio_slug: "urlaubskonto"`. `LEXIKON_CONTENT_GAPS.md` — row `urlaubskonto` removed (manual edit; full regen optional via `generate-lexikon-inventory-report.py` if you use automated pipeline).

## Rich Results Test (Google)

- **Production URL** `https://www.ordio.com/insights/lexikon/urlaubskonto/` returned **404** when checked (pre-deploy) — expected until release.
- **Pre-deploy substitute:** `generate_blog_schema('post', …)` for this post yields **@graph** with **Article**, **FAQPage** (12 `mainEntity`), plus Person, WebPage, ImageObject, BreadcrumbList — JSON encodes cleanly.
- **After deploy:** run [Google Rich Results Test](https://search.google.com/test/rich-results) with the live URL (Article + FAQPage).

## Repo validate

- `make validate` still stops at **PHPStan** (~2051 repo-wide errors) — not post-specific.
- **Subset run (2026-03-23):** `npm run lint` (0 errors, warnings only), `npm run format:check` OK, `php composer.phar schema` OK.
- `php v2/scripts/blog/verify-lead-capture-copy.php --strict` fails for **31** other posts (generic `blog_hr`); **urlaubskonto is not** in the failure list.
- `python3 v2/scripts/llms/validate-llms-metadata.py --report` — OK.
- `php v2/scripts/blog/audit-blog-image-alt.php` — repo has existing mismatches; **urlaubskonto** not reported among issues.
