# Google SEO Data — Score 55/100

## Was funktioniert
- URL ist indexiert und heute aktiv gecrawlt (2026-07-19T12:27:29Z, als MOBILE)
- Lighthouse SEO-Score: 100/100 auf Desktop und Mobile (PSI Lab, Google API)
- Desktop Performance: 100/100 — FCP 0.2s, LCP 0.6s, TBT 0ms, CLS 0 (Perfekt)
- Mobile Performance: 95/100 — FCP 0.8s, TBT 0ms, CLS 0
- TTFB: 1ms (Serverlatenzen extrem niedrig — nginx direkt)
- HTTP/2 aktiv, nur 4 Netzwerk-Requests gesamt
- Robots-Meta index,follow korrekt; Googlebot-Zugriff ALLOWED
- JSON-LD ProfessionalService vorhanden und gecrawlt
- Keine JavaScript-Blocking-Zeit (TBT 0ms auf beiden Strategien)

## Findings

### [Info] GSC: 0 Klicks / 0 Impressionen — Property frisch verifiziert
**Befund:** Google API (GSC), Zeitraum 2026-06-21 bis 2026-07-16 (28 Tage): rows=0, totals={clicks:0, impressions:0, ctr:0, position:0}. Die Domain-Property sc-domain:koeseo.de wurde erst kürzlich verifiziert. Google hat die Startseite heute (12:27 UTC) gecrawlt und als 'Submitted and indexed' bestätigt — es sind schlicht noch keine Such-Impressionen aufgelaufen. Daten erscheinen typischerweise 2-4 Wochen nach erstem Crawl-Index-Zyklus.

**Fix:** In 2-4 Wochen erneut prüfen. Priorität: Sitemap einreichen (siehe Sitemap-Finding) und Canonical-Tag setzen, damit Google die kanonische URL sofort korrekt registriert.

### [Medium] CrUX: Kein Feld-Daten-Eligibility — zu wenig Chrome-Traffic
**Befund:** CrUX History API (Google API, origin https://koeseo.de): Fehler 'No CrUX history data for this origin. Insufficient Chrome traffic volume for eligibility.' PSI field_metrics ist ebenfalls leer. Keine realen LCP/INP/CLS-Werte aus dem 28-Tage-Rolling-Window verfügbar. Alle CWV-Werte basieren ausschliesslich auf PSI Lab-Daten (simulierte Umgebung, kein echter Nutzer-Traffic). Dies ist der aktuelle Status — kein Fehler in der Konfiguration.

**Fix:** Kein direkter Fix möglich. CrUX-Eligibility entsteht automatisch sobald genug Chrome-Nutzer die Seite besuchen (Richtwert: einige hundert Seitenaufrufe/Monat). Fokus auf organische Sichtbarkeit und direkte Traffic-Quellen legen, um diesen Schwellenwert zu erreichen.

### [Medium] Mobile LCP: 3.0s — 'Needs Improvement' (Schwelle: 2500ms)
**Befund:** PSI Lab-Daten (Google API, Mobile-Strategie, 2026-07-19): LCP=3011.5ms, Score 0.78. Der LCP-Wert liegt im 'Needs Improvement'-Bereich (2500–4000ms). Ursache laut Netzwerk-Trace: Die Seite hat keine Bilder — das LCP-Element ist ein Text-Block. Der Font inter-var.woff2 (352 KB) wird render-blockierend geladen und verzögert damit das LCP-Paint. Zusätzlich blockiert style.css (162ms laut render-blocking-insight). Desktop-LCP: 611ms (perfekt) — der Unterschied entsteht durch die simulierte mobile Netzwerkdrosselung.

**Fix:** 1) Font-Preload: `<link rel='preload' href='/fonts/inter-var.woff2' as='font' crossorigin>` im `<head>` — holt den Font parallel zur HTML-Parse-Phase. 2) style.css inline stellen (11 KB unkomprimiert, passt inline) oder mit `media='print' onload='this.media=\'all\''` non-blocking laden. 3) font-display:swap im @font-face setzen, damit Text sofort mit System-Font sichtbar ist. Erwartete Verbesserung: LCP unter 2500ms (Good).

### [Medium] Kein Canonical-Tag auf der Startseite
**Befund:** GSC URL Inspection (Google API, 2026-07-19): user_canonical=null. Die Seite hat keinen `<link rel='canonical'>` Tag. Google hat trotzdem https://koeseo.de als google_canonical gewählt — das ist korrekt, aber zufällig. Ohne expliziten Canonical kann Google bei Parametervarianten (/?ref=x, /index.html) unterschiedliche Kanonisierungsentscheidungen treffen. Bestätigt durch die Basis-Fakten (bereits als FEHLT markiert).

**Fix:** In den `<head>` einfügen: `<link rel='canonical' href='https://koeseo.de/'>`. Gilt analog für alle Unterseiten (leistungen, kontakt, impressum, datenschutz). Für eine statische Seite ist das ein 5-Minuten-Fix.

### [Medium] Keine Sitemap in GSC eingetragen — sitemap.xml fehlt (404)
**Befund:** GSC Sitemaps API (Google API): sitemaps=[] (leeres Array). Es ist keine Sitemap in der Search Console registriert. robots.txt (404) und sitemap.xml (404) wurden bereits in den Basis-Fakten dokumentiert. Ohne Sitemap entdeckt Googlebot Unterseiten (leistungen, kontakt, impressum) nur über interne Links — langsamer und weniger zuverlässig. Bei einer frisch verifizierten Property ist das besonders kritisch für den initialen Index-Aufbau.

**Fix:** 1) /sitemap.xml erstellen (static, alle 5-6 URLs der Site mit lastmod und changefreq). 2) /robots.txt erstellen (mindestens `User-agent: * / Allow: / / Sitemap: https://koeseo.de/sitemap.xml`). 3) In GSC unter Sitemaps einreichen. Da die Property gerade frisch ist, beschleunigt das den vollständigen Index-Aufbau erheblich.

### [Medium] 11 Kontrast-Violations — #656565 auf #0a0a0a: Ratio 3.39:1 (WCAG AA: 4.5:1)
**Befund:** PSI Accessibility Audit (Google API, Mobile): 11 Elemente mit unzureichendem Farbkontrast. Konkrete Elemente: `.section-eyebrow` (Texte 'LEISTUNGEN', 'KONTAKT'), `<dt>` Elemente ('E-MAIL', 'POSTANSCHRIFT') und weitere. Foreground #656565, Background #0a0a0a, gemessene Ratio 3.39:1. WCAG AA verlangt 4.5:1 für Normaltextgrössen (body-Schrift unter 18px). Lighthouse Accessibility-Score: 91/100 (beide Strategien) — der Punktabzug kommt direkt aus diesen Kontrast-Fehlern. Zusätzlich: Links sind nur durch Farbe unterscheidbar (`link-in-text-block`-Violation: Datenschutzerklärung-Link in Kontaktformular ohne Underline-Indikator).

**Fix:** Eyebrow/Label-Texte und dt-Elemente von #656565 auf mindestens #767676 anheben (Ratio 4.54:1 auf #0a0a0a). Idealziel: #9a9a9a oder heller für komfortables Lesen. Für den Datenschutzlink: text-decoration:underline hinzufügen (neben der Farbunterscheidung). Design-Quality-Gate-Rule beachten: gedämpfte Grau-Töne auf dunklen Flächen IMMER gegen Minimum-4.5:1 absichern.

### [High] Kein HSTS-Header (Strict-Transport-Security fehlt)
**Befund:** PSI Security Audit (Google API) + Basis-Fakten bestätigt: Kein Strict-Transport-Security Header. Lighthouse meldet 'No HSTS header found' mit Severity 'High'. Ohne HSTS kann ein Angreifer bei einer Man-in-the-Middle-Situation die HTTPS-Verbindung auf HTTP downgraden. Für eine B2B-Firmenwebsite (Verkauf von IT-Infrastruktur) ist das ein Glaubwürdigkeits- und Sicherheits-Signal. Cloudflare (der eingesetzte Proxy, erkennbar an der Referrer-URL 104.27.164.17) kann HSTS auf Proxy-Ebene setzen.

**Fix:** Im nginx-Config oder Cloudflare: `Strict-Transport-Security: max-age=31536000; includeSubDomains; preload` setzen. Cloudflare-Dashboard: SSL/TLS → Edge Certificates → HSTS aktivieren (max-age=12 Monate, includeSubDomains). Nach 6-12 Monaten stabiler HTTPS-Historie: Domain im HSTS-Preload-Register eintragen (https://hstspreload.org).

### [Low] Font inter-var.woff2: 352 KB — 98% des gesamten Seiten-Transfers
**Befund:** PSI Network-Trace (Google API): inter-var.woff2 = 352.592 Bytes (344 KB), jetbrains-mono-400.woff2 = 92.731 Bytes (90 KB). Gesamt-Seitengewicht: 452 KB — davon 98% Fonts. Das ist der alleinige Treiber des mobilen LCP-Problems. Inter Variable Font enthält alle Gewichte und Stile in einer Datei — für eine statische Seite mit nur 1-2 genutzten Gewichten deutlich überdimensioniert.

**Fix:** Font subsetten: nur die tatsächlich verwendeten Unicode-Ranges und Gewichte (z.B. weight 400 + 600, latin subset) einschliessen. Tool: `pyftsubset` (fonttools) oder online via Font Squirrel. Erwartete Reduzierung: inter-var von 352 KB auf 30-60 KB (>80% kleiner). Zusätzlich: `font-display: swap` und Preload-Link (siehe LCP-Finding).

### [Low] style.css Cache-TTL nur 1 Stunde (3.600.000ms)
**Befund:** PSI cache-insight Audit (Google API): style.css (3.7 KB) hat Cache-Control mit max-age=3600 (1 Stunde). Lighthouse schätzt potenzielle Einsparung von 3 KiB bei Folgebesuchen. Für eine statische CSS-Datei ist 1h extrem kurz — bei Wiederholungsbesuchen wird die Datei jedes Mal neu angefordert.

**Fix:** Cache-Control auf mindestens 1 Jahr setzen für statische Assets mit Fingerprint: `Cache-Control: public, max-age=31536000, immutable`. Dafür Datei-Versionierung einführen (z.B. style.css?v=20260719 oder Hash im Dateinamen). Nginx-Konfiguration: `location ~* \.(css|woff2)$ { expires 1y; add_header Cache-Control 'public, immutable'; }`

---
*Evidenz: Geprüft mit: python3 ~/.claude/skills/seo/scripts/ (venv), Tier 1 (API Key + Service Account claude-seo@koehub-seo.iam.gserviceaccount.com). Scripts: pagespeed_check.py, crux_history.py, gsc_query.py, gsc_inspect.py. Datenfrische: PSI Lab-Daten vom 2026-07-19T12:45:25Z; GSC-Zeitraum 2026-06-21 bis 2026-07-16 (2-3 Tage Lag); CrUX nicht verfügbar (Insufficient Chrome traffic). GA4 nicht konfiguriert (kein ga4_property_id in google-api.json — Tier 2 nicht verfügbar). Alle CWV-Werte sind PSI Lab-Daten (simuliert), keine CrUX-Felddaten.*
