# SEMrush Position Tracking Guide

**Last Updated:** 2026-03-18

## Purpose

This guide documents how Ordio maintains its SEMrush Position Tracking keyword list. The list is **conversion-focused BOF first**, while intentionally retaining a controlled set of **MOF/TOF monitor terms** for visibility and trend tracking. Data is derived from marketing-page SSOT plus resource-surface SSOT/reports (tools, templates, downloads, blog), and weighted with GSC/SISTRIX signals.

## Tag Taxonomy

Each keyword is tagged for filtering and segment analysis in SEMrush:

| Tag Type | Values | Purpose |
|----------|--------|---------|
| **content_type** | product, template, tool, blog, comparison, industry | Page type |
| **cluster** | zeiterfassung, dienstplan, lohnabrechnung, compliance, gastronomie, personalverwaltung, urlaub, tools | Content cluster |
| **priority** | high, medium, low | Business priority |
| **source** | product, tool, template, comparison, industry, strategy, gsc, blog | Data origin |
| **intent** | branded, unbranded | Brand vs generic |
| **bof** | bof, tof | Bottom-of-funnel (product/tool/template/commercial) vs top-of-funnel (informational) |

## Data Sources

| Source | Location | Description |
|--------|----------|-------------|
| Marketing page targets (SSOT) | `docs/content/pages/**/data/target-keywords.json` | Primary/secondary (and optional relevant/related) page keywords across product, industry, static, homepage |
| Marketing page SISTRIX metrics | `docs/content/pages/**/data/keywords-sistrix.json` | Per-keyword volume/competition/CPC used as prioritization signals |
| Tools SSOT (per tool) | `docs/content/tools/**/data/keywords-candidate.json` | Tool-level candidate keywords and intent coverage |
| Tools SISTRIX (per tool) | `docs/content/tools/**/data/keywords-sistrix.json` | Tool-level demand/competition signals |
| Tools portfolio SISTRIX | `docs/content/tools/tools-keyword-sistrix.json` | Cross-tool keyword opportunity batch |
| Template SSOT (per template) | `docs/systems/templates/template-data/**/data/target-keywords.json` | Template-level target keyword ownership |
| Template SISTRIX (per template) | `docs/systems/templates/template-data/**/data/keywords-sistrix.json` | Template-level demand/competition signals |
| Blog post SSOT | `v2/data/blog/posts/**/*.json` | `primary_keyword` + `secondary_keywords` for monitor coverage and supporting clusters |
| Downloads inventory | `v2/data/downloads_index_data.php` | Download page/topic terms for gated-resource monitoring |
| GSC | `v2/data/otterly/gsc-queries.json` | Actual search queries with impressions/clicks |
| Template candidate | `docs/systems/templates/template-candidate-keywords.json` | Primary + secondary per template |
| Template seed | `docs/systems/templates/template-seed-keywords.json` | Seed keywords (excludes off-topic) |
| Blog groups | `docs/content/blog/seo-reports/keyword-groups.json` | Topic-grouped keywords |
| Blog targets | `docs/content/blog/posts/**/data/target-keywords.json` | Per-post primary/secondary |
| Tools | `TOOLS_KEYWORD_MAPPING` in script | Slug → search keyword mapping |
| Products | `PRODUCT_KEYWORDS` in script | Product URL → keywords |
| Industry | `INDUSTRY_KEYWORDS` in script | Industry slug → keywords |
| Comparison | `v2/data/tools_data.php` | Competitor + "vergleich" |
| Strategy | Hardcoded in script | Quick wins from strategy docs |

## Output Files

| File | Purpose |
|------|---------|
| `docs/seo/semrush-position-tracking-keywords-500.txt` | SEMrush import format: `keyword, tag1, tag2, tag3` (one per line) |
| `docs/seo/semrush-keyword-candidates.json` | Full candidate data with metadata |

## How to Update

### 1. Run the aggregation script

```bash
python3 v2/scripts/seo/aggregate-semrush-keywords.py
```

Or via Makefile:

```bash
make semrush-keywords
```

### 2. Import to SEMrush

1. Open SEMrush → Position Tracking → ordio.com
2. Click "Add keywords" or "Keywords" modal
3. Delete existing keywords if replacing entirely (or add new ones)
4. Paste content from `semrush-position-tracking-keywords-500.txt`
5. Format: one keyword per line, tags separated by commas
6. Click "Add keywords to campaign" / "Save changes"

### 3. Replace vs add

- **Replace:** Delete all existing keywords, then import the new list. Use when doing a full audit.
- **Add:** Append new keywords. Use when adding keywords for new templates/tools without removing existing.

## Update Frequency

- **Quarterly:** Full refresh recommended (run script, replace list in SEMrush)
- **On new content:** When adding new templates, tools, or major blog clusters, run script and add new keywords (or do a full replace if under 500)

## Excluded Keywords

The script excludes:

- `template-seed-keywords.json` `excluded_patterns` (e.g. kündigung wohnung, tattoo vorlage)
- Irrelevant terms: harvest, jat hr, constantin schünemann, app für bestellungen
- **Pure TOF lexikon** from blog: humankapital, gewerkschaft, hiring manager, diversity management, talent management, etc. (definition-only, no product intent)

## Prioritization Logic (BOF-First)

Keywords are ranked in this order:

1. **Marketing page SSOT lanes** – `primary` first, then `secondary`/`relevant`/`slug`
2. **Product + feature terms** – Ordio core conversion topics
3. **Tools + templates SSOT** – resource surfaces that convert into product discovery
4. **Comparison + industry** – use-case and competitor conversion paths
5. **GSC BOF** – high-intent queries with existing traction
6. **MOF/TOF monitor set** – controlled inclusion of high-performing or strategically relevant supporting terms

SISTRIX signals (`volume`, `cpc`, `competition`) are incorporated into ranking for better demand/commercial weighting.

## Funnel Mix (Default)

Final 500 selection uses a quota-based mix:

- ~80% `stage_bof` (core conversion targets)
- ~15% `stage_mof` (evaluation/education support terms)
- ~5% `stage_tof` (high-value monitoring terms)

Each line includes stage + role tags:

- `stage_bof` / `stage_mof` / `stage_tof`
- `core` (conversion focus) or `monitor` (visibility tracking)

## Global Exclusions

A low-fit filter removes terms that are not suitable for this BOF list across all sources (unless branded `ordio`), including year-only noise and non-core calculator themes (e.g. generic finance/tax/tooling terms).

## Iteration Cadence (Manual)

This process is designed to run manually and iteratively:

1. Refresh SSOT files after content/keyword updates (marketing pages, tools, templates, blog posts, downloads).
2. Refresh key reports as needed (GSC exports, SISTRIX per-page/per-tool/per-template batches).
3. Run `python3 v2/scripts/seo/aggregate-semrush-keywords.py`.
4. Review `semrush-keyword-candidates.json` for stage/source balance and obvious outliers.
5. Import `semrush-position-tracking-keywords-500.txt` into SEMrush and monitor movement.
6. Repeat monthly/quarterly or after major content launches.

Pure TOF lexikon terms (e.g. humankapital, gewerkschaft, hiring manager) are excluded from blog extraction.

## Related Documentation

- [docs/strategy-2026/03-ANALYSIS/CURRENT_STATE_ANALYSIS.md](../strategy-2026/03-ANALYSIS/CURRENT_STATE_ANALYSIS.md) – Keyword opportunities
- [docs/reference/architecture/content-clusters/CLUSTER_MAPPING.md](../reference/architecture/content-clusters/CLUSTER_MAPPING.md) – Content cluster structure
- [.cursor/rules/semrush-keyword-tracking.mdc](../../.cursor/rules/semrush-keyword-tracking.mdc) – Cursor rule for updates
