# Product feature pages — content & SEO hub

**Last Updated:** 2026-04-02 (mitarbeiter-app misc-faqs + schema plain-text note in registry table)

Single entry point for the **10 Funktionen** (`surface: product` in [`marketing-pages-registry.json`](../marketing-pages-registry.json)): data collection, synthesis, FAQ workflow, validators, and backlog.

## Registry vs legacy scripts

| Registry id (`feature-*`) | `docs_dir` folder | Primary PHP | FAQ source pattern |
|---------------------------|-------------------|-------------|---------------------|
| `feature-schichtplan` | `schichtplan/` | `product_schichtplan_neu.php` (`/schichtplan`); archived `product_shiftplan.php` (no URL) | FAQs: `schichtplan-neu/faq-answers-optimized.json` (SSOT Live); **misc-faqs** `product_shiftplan.json` (snapshot / tooling). Registry lists the same path in `faq_answers_optimized_json`; keep `docs_dir` on `schichtplan/` for `data/*` + synthesis. |
| `feature-arbeitszeiterfassung` | `arbeitszeiterfassung/` | `product_timetracking.php` | Inline JSON from `faq-answers-optimized.json` |
| `feature-abwesenheiten` | `abwesenheiten/` | `product_absences.php` | Inline JSON |
| `feature-mitarbeiter-app` | `mitarbeiter-app/` | `product_mobile_app.php` | Inline JSON (`faq-answers-optimized.json`); halte **`v2/data/misc-faqs/product_mobile_app.json`** synchron; FAQPage im `<head>` nutzt `faq_answer_html_to_schema_plain_text()` für `acceptedAnswer.text` |
| `feature-digitale-personalakte` | `digitale-personalakte/` | `product_personnelfile.php` | Inline JSON |
| `feature-dokumentenmanagement` | `dokumentenmanagement/` | `product_documents.php` | Inline JSON (`faq-answers-optimized.json`); keep **`v2/data/misc-faqs/product_documents.json`** in sync for `faq-jsonld.php` parity audits |
| `feature-checklisten` | `checklisten/` | `product_checklists.php` | Inline JSON (`faq-answers-optimized.json`); keep **`v2/data/misc-faqs/product_checklists.json`** in sync for `faq-jsonld.php` parity audits |
| `feature-payroll` | `payroll/` | `product_payroll.php` | **misc-faqs** `product_payroll.json` (+ `payroll_neu`, webinar variants) |
| `feature-nano-ai` | `nano-ai/` | `product_nano_ai.php` | Inline JSON |
| `feature-appstore` | `appstore/` | `product_appstore.php` | Inline JSON from `faq-answers-optimized.json`; keep **`v2/data/misc-faqs/product_appstore.json`** in sync; registry `faq_answers_optimized_json` set |

**Legacy-only (not in registry as product):**

- **`product_events.php` / `/events`:** FAQs inline in PHP (`$eventsFaqs`); Serper legacy path only: `python3 v2/scripts/product-pages/serper-paa-research.py --page=events` (writes `product-pages/events/faq-research.json` at page root, not `data/`).
- **`v2/scripts/product-pages/run-research-workflow.sh`:** Phase-2 helper (context + Serper + Firecrawl + CSV reminder); prefer **`run-feature-page-research-pipeline.sh`** for registry-backed features.

**Canonical Serper implementation:** `v2/scripts/marketing-pages/serper-paa-research.py` → `{docs_dir}/data/faq-research.json`.  
**Wrapper (compat):** `v2/scripts/product-pages/serper-paa-research.py` delegates to marketing for all `feature-*` / mapped legacy keys; keeps **events-only** legacy writer.

## Orchestrator (blog parity)

```bash
bash v2/scripts/product-pages/run-feature-page-research-pipeline.sh feature-schichtplan
bash v2/scripts/product-pages/run-feature-page-research-pipeline.sh feature-payroll --with-firecrawl --skip-serper
bash v2/scripts/product-pages/run-feature-page-research-pipeline.sh feature-schichtplan --with-sistrix-serp
bash v2/scripts/product-pages/run-feature-page-research-pipeline.sh feature-schichtplan --with-sistrix-serp --with-sistrix-domain-kw
bash v2/scripts/product-pages/run-feature-page-research-pipeline.sh feature-schichtplan --dry-run
```

Steps: SISTRIX (metrics + ideas) → GSC queries (`collect-tool-gsc-queries.php`) → **optional** SISTRIX SERP top 10 (`--with-sistrix-serp`) → **optional VIP** domain-keyword SERP (`--with-sistrix-domain-kw`, ~100 cr/kw, cap 5; [VIP_MARKETING_SEO_DATA_TIERS.md](../marketing-pages/VIP_MARKETING_SEO_DATA_TIERS.md)) → Serper (optional) → Firecrawl competitor scrape (optional). Prints global GSC/GA/split + synthesis commands.

**Make:** `make feature-research PAGE=feature-schichtplan` · `make feature-serp PAGE=feature-schichtplan` · `make feature-synthesis PAGE=feature-schichtplan`

## Synthesis

```bash
php v2/scripts/product-pages/generate-feature-page-data-synthesis.php --page=feature-schichtplan
```

Default: `{docs_dir}/DATA_DRIVEN_SYNTHESIS.generated.md` (does not overwrite a hand-maintained `DATA_DRIVEN_SYNTHESIS.md` if you add one).

## Core docs

| Topic | File |
|-------|------|
| Data collection & credit notes | [DATA_COLLECTION_PRODUCT_FEATURES.md](DATA_COLLECTION_PRODUCT_FEATURES.md) |
| VIP SISTRIX / domain SERP / utilization | [VIP_MARKETING_SEO_DATA_TIERS.md](../marketing-pages/VIP_MARKETING_SEO_DATA_TIERS.md) |
| Improvement pipeline (phases) | [FEATURE_PAGE_IMPROVEMENT_WORKFLOW.md](FEATURE_PAGE_IMPROVEMENT_WORKFLOW.md) |
| FAQ structure, misc-faqs, `*-neu` parity | [PRODUCT_PAGE_FAQ_GUIDE.md](PRODUCT_PAGE_FAQ_GUIDE.md) |
| Page list | [PRODUCT_PAGES_INVENTORY.md](PRODUCT_PAGES_INVENTORY.md) |
| Portfolio / opportunity table | [PRODUCT_FEATURE_OPPORTUNITY_LIST.md](PRODUCT_FEATURE_OPPORTUNITY_LIST.md) |
| Backlog & rollout | [PRODUCT_FEATURE_SEO_IMPROVEMENT_BACKLOG.md](PRODUCT_FEATURE_SEO_IMPROVEMENT_BACKLOG.md) |

## Scripts (`v2/scripts/product-pages/`)

| Script | Role |
|--------|------|
| `run-feature-page-research-pipeline.sh` | Registry product orchestrator |
| `collect-feature-page-keyword-serp.php` | `keyword.seo` top 10 → `data/sistrix-keyword-serp.json` |
| `generate-feature-page-data-synthesis.php` | Metrics → `DATA_DRIVEN_SYNTHESIS.generated.md` |
| `scrape-competitor-faqs.py` | Firecrawl; `--page=feature-*` uses registry `competitor_urls` |
| `serper-paa-research.py` | Thin wrapper → marketing Serper (+ events legacy) |
| `collect-product-pages-performance-gsc.php` | Global GSC |
| `split-product-gsc-to-registry-pages.php` | Per-page `data/performance-gsc.json` |
| `collect-product-pages-performance-ga4.php` | Global GA4 |
| `merge-product-opportunity-data.php` | Portfolio markdown table |
| `validate-faq-answers.py` | `--page=feature-*` or legacy key |
| `run-research-workflow.sh` | Legacy multi-step helper (see above) |

Shared: `v2/scripts/marketing-pages/collect-page-keywords-sistrix.php`, `v2/scripts/marketing-pages/collect-marketing-page-domain-kw-serp.php` (VIP domain SERP; also Branchen/static registry ids), `v2/scripts/marketing-pages/serper-paa-research.py`, `v2/scripts/tools/collect-tool-gsc-queries.php`.

## Validators

```bash
python3 v2/scripts/product-pages/validate-faq-answers.py --page=feature-schichtplan
php v2/scripts/dev-helpers/verify-faq-jsonld-parity.php --all-misc-faqs
```

After publish: [Google Rich Results Test](https://search.google.com/test/rich-results) on the live URL.

## Agent skill

`.cursor/skills/ordio-feature-page-seo-workflow/SKILL.md` — routes to this hub and commands.

## Related rules

- `.cursor/rules/marketing-pages-seo-data.mdc`
- `.cursor/rules/product-pages.mdc`
- `.cursor/rules/product-pages-faq.mdc`
