# Product feature pages — SEO improvement backlog

**Last Updated:** 2026-04-02

Data-driven follow-ups for the **10 Funktionen** URLs (registry `surface`: `product`). Refresh inputs via [DATA_COLLECTION_PRODUCT_FEATURES.md](DATA_COLLECTION_PRODUCT_FEATURES.md) and the [FEATURE_PAGE_IMPROVEMENT_WORKFLOW.md](FEATURE_PAGE_IMPROVEMENT_WORKFLOW.md), then reconcile keywords in each folder’s `data/KEYWORD_DECISION.md`.

## When to update this file

- After a full GSC/GA export shows sustained CTR or position changes on `/schichtplan`, `/arbeitszeiterfassung`, etc.
- After SISTRIX portfolio run (`product-pages-keyword-sistrix.json`) + merge table refresh ([PRODUCT_FEATURE_OPPORTUNITY_LIST.md](PRODUCT_FEATURE_OPPORTUNITY_LIST.md)).
- Before large FAQ or hero copy changes (align with `data/target-keywords.json` and related keywords in `data/keywords-sistrix.json`).

## SISTRIX SERP snapshot (top 10)

Track **`data/sistrix-keyword-serp.json`** `collected_at` per feature (git history or note here after each run). Regenerate with `bash v2/scripts/product-pages/run-feature-page-research-pipeline.sh feature-<id> --with-sistrix-serp` or `make feature-serp PAGE=feature-<id>`.

| Registry id | Last SERP snapshot (`collected_at` if committed) |
|-------------|--------------------------------------------------|
| `feature-schichtplan` | `2026-04-02T11:32:25Z` (validation run with `--limit=1`; re-run without `--limit` for full `serp_keywords_limit`) |
| `feature-arbeitszeiterfassung` | `2026-04-02T13:17:55Z` (`data/sistrix-keyword-serp.json`) |
| `feature-abwesenheiten` | `2026-04-02T13:39:17Z` (`data/sistrix-keyword-serp.json`) — FAQ + keywords refresh shipped; **28-day GSC** check `/abwesenheiten` queries (abwesenheitsverwaltung, abwesenheitsantrag clusters) |
| `feature-mitarbeiter-app` | `2026-04-02T15:37:15Z` (`data/sistrix-keyword-serp.json`; Top-10-Snippets in diesem Lauf leer) — FAQ + Keywords refresh shipped; **28-day GSC** check `/mitarbeiter-app` (ordio app / download / terminal vs. app, support queries); optional Serper PAA + Firecrawl wenn Keys gesetzt |
| `feature-digitale-personalakte` | `2026-04-02T13:49:58Z` (`data/sistrix-keyword-serp.json`) — FAQ + keywords refresh shipped; **28-day GSC** check `/digitale-personalakte` (kostenlos/freeware impressions vs. topic queries) |
| `feature-dokumentenmanagement` | `2026-04-02T14:22:20Z` (`data/sistrix-keyword-serp.json`) — FAQ + keywords refresh shipped; **28-day GSC** check `/dokumentenmanagement` (automation / web / app / gastronomie query clusters) |
| `feature-checklisten` | `2026-04-02T14:32:53Z` (`data/sistrix-keyword-serp.json`) — FAQ + keywords refresh shipped; **28-day GSC** check `/checklisten` (digitale checklisten, checkliste gestalten, tool vs. software clusters, CTR on high-impression queries) |
| `feature-payroll` | `2026-04-02T14:44:58Z` (`data/sistrix-keyword-serp.json`) — data refresh + 15 FAQs + `KEYWORD_DECISION.md`; **28-day GSC** check `/payroll` (`payroll`, `payroll software`, `digital payroll`, DATEV-Schnittstelle clusters) |
| `feature-nano-ai` | |
| `feature-appstore` | |

## Quarterly rollout calendar (2026)

Use [PRODUCT_FEATURE_OPPORTUNITY_LIST.md](PRODUCT_FEATURE_OPPORTUNITY_LIST.md) + `product-pages-performance-gsc.json` clicks to **re-prioritize** within each quarter. Default stagger (pilot first, then mix of traffic and gaps):

| Quarter | Focus (registry ids) | Notes |
|---------|----------------------|--------|
| Q2 2026 | `feature-schichtplan` (pilot done), `feature-arbeitszeiterfassung`, `feature-payroll` | Highest commercial intent cluster |
| Q3 2026 | `feature-abwesenheiten`, `feature-dokumentenmanagement`, `feature-digitale-personalakte` | HR core stack |
| Q4 2026 | `feature-mitarbeiter-app`, `feature-checklisten`, `feature-nano-ai` | App + workflow add-ons |
| Q1 2027 | `feature-appstore` + portfolio re-merge | Often lower organic volume; validate metrics first |

## PHP FAQ source inventory (stragglers / consistency)

| Page | FAQ source | Backlog |
|------|------------|---------|
| `product_shiftplan.php` (archived, no route; direct path 403) | `misc-faqs/product_shiftplan.json` | FAQ snapshot for ops; live visible FAQs: `schichtplan-neu/faq-answers-optimized.json` on `/schichtplan` — align on big changes per [PRODUCT_PAGE_FAQ_GUIDE.md](PRODUCT_PAGE_FAQ_GUIDE.md) |
| `product_payroll.php` / `product_payroll_neu.php` / webinar | misc-faqs variants | Ensure SSOT + JSON-LD parity after edits |
| `product_timetracking.php`, `product_absences.php`, `product_documents.php`, `product_personnelfile.php`, `product_checklists.php`, `product_nano_ai.php` | Inline read of `faq-answers-optimized.json` | `product_timetracking.php`: no `misc-faqs` mirror (removed broken stub 2026-04-02); others: misc-faqs migration only if schema/ops need alignment |
| `product_mobile_app.php` | `mitarbeiter-app/faq-answers-optimized.json` + head `FAQPage` | **Done (2026-04-02):** SSOT + `misc-faqs/product_mobile_app.json` parity, `faq_answer_html_to_schema_plain_text()` |
| `product_appstore.php` | `faq-answers-optimized.json` + head `FAQPage` from plain text | **Done (2026-04-02):** SSOT + `misc-faqs/product_appstore.json` parity |
| `product_events.php` | Inline `$eventsFaqs` | **Backlog:** optional docs JSON SSOT; Serper research uses legacy `events` path (not `data/`) |
| `product_schichtplan_neu.php` (`/schichtplan`) | `schichtplan-neu/faq-answers-optimized.json` | Live canonical Schichtplan page |

## Backlog (seed)

| Area | Action | Evidence |
|------|--------|----------|
| Global | Re-run `collect-product-pages-performance-gsc.php` and `collect-product-pages-performance-ga4.php` on a fixed cadence (e.g. monthly); archive previous JSON if comparing trends | `product-pages-performance-*.json` |
| Portfolio | Expand `product-pages-candidate-keywords.json` when new modules or campaigns shift head terms | Candidate file + [PRODUCT_FEATURE_OPPORTUNITY_LIST.md](PRODUCT_FEATURE_OPPORTUNITY_LIST.md) |
| Per page | For each registry id, confirm `primary` in `data/target-keywords.json` matches top GSC queries or intentional repositioning | `data/KEYWORD_DECISION.md` per slug |
| PAA | Replace `faq-research.json` placeholders with Serper output when `SERPER_API_KEY` is available | `python3 v2/scripts/marketing-pages/serper-paa-research.py --page=<id>` |
| Synthesis | Regenerate `DATA_DRIVEN_SYNTHESIS.generated.md` after data refresh | `generate-feature-page-data-synthesis.php` |
| SERP gap | Refresh `sistrix-keyword-serp.json` on cadence; use section 4 in synthesis for keywords where Ordio rank is weak or null | `collect-feature-page-keyword-serp.php` / `--with-sistrix-serp` |

## Out of scope here

Live edits to `v2/pages/product_*.php` are tracked in product page docs and release process, not in this data-only backlog.
