News

SEO mehr Umsatz durch Performance-Improvement: Core Web Vitals, Page Speed Optimization & CDN-Setup

Von Erol Demirkoparan
11 min
SEO mehr Umsatz durch Performance-Improvement: Core Web Vitals, Page Speed Optimization & CDN-Setup - Cloudox Software Agentur Blog

1) Performance → Mehr SEO-Umsatz: der direkte Hebel

Wenn Nutzer schneller Inhalte sehen und interagieren können, steigen in der Regel Conversion Rate, Engagement und damit Umsatz. Gleichzeitig profitieren Rankings, weil Google Performance-Signale in der Praxis stark mit Nutzerzufriedenheit korrelieren. Der Kern ist: Core Web Vitals systematisch verbessern, Fortschritt mit Page Speed Insights und Google Search Console messen und technische Bottlenecks konsequent entfernen.

2) Diagnose-Setup: Messung mit Page Speed Insights & Google Search Console

2.1 Core Web Vitals als KPI-Set definieren

Core Web Vitals bestehen (Stand heute) aus:

  • LCP (Largest Contentful Paint): Wie schnell der Hauptinhalt sichtbar wird
  • INP (Interaction to Next Paint): Wie reaktionsfähig die Seite bei Interaktionen ist
  • CLS (Cumulative Layout Shift): Wie stabil das Layout beim Laden bleibt

Ziel: nicht “grün auf der Startseite”, sondern grün auf Traffic- und Money-Pages (Kategorie, Produkt, Lead-Landingpages).

2.2 Datenquellen richtig kombinieren

  • Page Speed Insights: Lab + Feld-Daten je URL (ideal für Debugging einzelner Templates)
  • Google Search Console: Aggregierte Felddaten (Chrome UX Report), ideal zur Priorisierung nach URL-Gruppen

Vorgehen: GSC identifiziert Cluster mit Problemen → PSI validiert je Template/URL → Fixes ausrollen → GSC überwacht Rollout-Effekt.

3) Page Speed Optimization: Maßnahmen mit dem größten ROI

3.1 LCP verbessern (Zeit bis Hauptinhalt sichtbar)

  • Hero-Image optimieren: AVIF/WebP, korrektes Sizing, fetchpriority="high", keine unnötigen Redirects
  • Server-TTFB senken: Caching, SSR/SSG optimieren, Datenbank-Queries reduzieren, Edge-Caching nutzen
  • Render-Blocking reduzieren: Critical CSS, CSS/JS splitten, unnötige Third-Party-Skripte entfernen

3.2 INP verbessern (Interaktivität)

  • JavaScript reduzieren: Bundle-Size runter, Code-Splitting, Dead Code entfernen
  • Long Tasks vermeiden: teure JS-Arbeit in Web Worker auslagern, Debounce/Throttle, event delegation
  • Third-Party kontrollieren: Tag Manager, Chat, A/B Testing – nur laden, wenn nötig

3.3 CLS verbessern (Layout-Stabilität)

  • Breite/Höhe für Bilder/iframes setzen
  • Keine späten Font-Swaps ohne Strategie (z.B. font-display: swap plus Preload für kritische Fonts)
  • Ads/Embeds mit reserviertem Platz rendern

4) CDN (Content Delivery Network): Was es ist & wie es SEO-Performance hebt

Ein Content Delivery Network (CDN) liefert statische (und oft auch dynamische) Inhalte über ein globales Netzwerk aus Edge-Servern aus. Nutzer bekommen Dateien vom geographisch nächsten Knoten → niedrigere Latenz, schnellere LCP, weniger Last auf Origin.

4.1 Praktische CDN-Use-Cases

  • Static Assets: Bilder, CSS, JS, Fonts mit langen Cache-Zeiten
  • Image CDN: automatische Format-/Größenanpassung (AVIF/WebP), Device-Aware
  • Edge Caching für HTML: für Marketingseiten, Kategorieseiten (mit sinnvollen Purge-Mechanismen)

4.2 CDN-Fallen, die SEO kosten können

  • Falsches Caching von HTML (z.B. personalisierte Inhalte im Cache) → inkonsistente Seiten
  • Cache-Control/ETag inkonsistent → unnötige Revalidierungen
  • Zu aggressive Bot-Protection → Crawling-Probleme

5) Priorisierung: Welche URLs zuerst (Umsatzfokus)

FeatureDetails
Money-Pages zuerstKategorie-, Produkt-, Pricing-, Lead-Landingpages priorisieren; dort zahlt Performance direkt auf Umsatz ein.
Template statt EinzelseiteFixes am Template verbessern hunderte URLs gleichzeitig (z.B. PDP, PLP, Blog-Template).
CWV-Schwellen gezielt erreichenNicht „perfekt“ optimieren, sondern systematisch von rot → gelb → grün, messbar in GSC CWV-Report.
Third-Party BudgetJedes Script braucht einen Business-Case; sonst entfernen oder nach Interaktion laden.

6) Mess-Automation: PageSpeed-Analyse als Pipeline

6.1 Python Script for Page Speed Analysis

Dieses Script ruft die PageSpeed Insights API ab, extrahiert zentrale Werte (LCP/INP/CLS, TTFB-Proxy über FCP/Requests etc. je nach API-Antwort) und schreibt eine CSV für Trend-Tracking. Ideal, um nach Releases regressions zu erkennen.

import os
import csv
import time
import json
import requests
from typing import Dict, Any, List

PAGESPEED_API = "https://www.googleapis.com/pagespeedonline/v5/runPagespeed"


def fetch_pagespeed(url: str, strategy: str, api_key: str) -> Dict[str, Any]:
    params = {
        "url": url,
        "strategy": strategy,
        "category": ["performance"],
        "key": api_key,
    }

    response = requests.get(PAGESPEED_API, params=params, timeout=60)
    response.raise_for_status()
    return response.json()


def safe_get(d: Dict[str, Any], path: List[str], default=None):
    cur: Any = d
    for key in path:
        if isinstance(cur, dict) and key in cur:
            cur = cur[key]
        else:
            return default
    return cur


def extract_metrics(payload: Dict[str, Any]) -> Dict[str, Any]:
    lighthouse = safe_get(payload, ["lighthouseResult"], {})
    audits = lighthouse.get("audits", {})

    lcp = safe_get(audits, ["largest-contentful-paint", "numericValue"])
    cls = safe_get(audits, ["cumulative-layout-shift", "numericValue"])

    # INP is not always present in Lighthouse audits depending on runtime.
    # We try common locations and fall back to None.
    inp = safe_get(audits, ["interaction-to-next-paint", "numericValue"])

    score = safe_get(lighthouse, ["categories", "performance", "score"])

    final_url = safe_get(lighthouse, ["finalUrl"])
    fetch_time = safe_get(lighthouse, ["fetchTime"])

    return {
        "finalUrl": final_url,
        "fetchTime": fetch_time,
        "performanceScore": score,
        "lcpMs": lcp,
        "inpMs": inp,
        "cls": cls,
    }


def main() -> None:
    api_key = os.environ.get("PAGESPEED_API_KEY")
    if not api_key:
        raise SystemExit("Missing env var PAGESPEED_API_KEY")

    urls = [
        "https://example.com/",
        "https://example.com/kategorie/",
        "https://example.com/produkt/",
    ]

    strategies = ["mobile", "desktop"]
    out_file = "pagespeed_report.csv"

    with open(out_file, "w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(
            f,
            fieldnames=[
                "url",
                "strategy",
                "fetchTime",
                "performanceScore",
                "lcpMs",
                "inpMs",
                "cls",
            ],
        )
        writer.writeheader()

        for url in urls:
            for strategy in strategies:
                raw = fetch_pagespeed(url=url, strategy=strategy, api_key=api_key)
                metrics = extract_metrics(raw)

                writer.writerow(
                    {
                        "url": url,
                        "strategy": strategy,
                        "fetchTime": metrics.get("fetchTime"),
                        "performanceScore": metrics.get("performanceScore"),
                        "lcpMs": metrics.get("lcpMs"),
                        "inpMs": metrics.get("inpMs"),
                        "cls": metrics.get("cls"),
                    }
                )

                time.sleep(1.0)

    print(f"Wrote {out_file}")


if __name__ == "__main__":
    main()

6.2 TypeScript: CWV-Gating im Deployment (Performance Budgets)

Damit Performance nicht “zufällig” schlechter wird, hilft ein Budget-Check in CI. Beispiel: Lade die CSV/JSON-Auswertung und fail das Deployment, wenn LCP/CLS über Schwellwerten liegt.

import fs from "node:fs";
import path from "node:path";

type Strategy = "mobile" | "desktop";

type Row = {
    url: string;
    strategy: Strategy;
    lcpMs: number | null;
    cls: number | null;
    inpMs: number | null;
    performanceScore: number | null;
};

function parseCsv(filePath: string): Row[] {
    const content = fs.readFileSync(filePath, "utf-8");
    const lines = content.split(/\r?\n/).filter(Boolean);
    const header = lines.shift();

    if (!header) {
        return [];
    }

    const cols = header.split(",");

    return lines.map((line) => {
        const values = line.split(",");
        const map: Record<string, string> = {};

        cols.forEach((c, i) => {
            map[c] = values[i] ?? "";
        });

        const toNumber = (v: string): number | null => {
            if (!v) return null;
            const n = Number(v);
            return Number.isFinite(n) ? n : null;
        };

        return {
            url: map.url,
            strategy: (map.strategy as Strategy) ?? "mobile",
            lcpMs: toNumber(map.lcpMs),
            cls: toNumber(map.cls),
            inpMs: toNumber(map.inpMs),
            performanceScore: toNumber(map.performanceScore),
        };
    });
}

function assertBudgets(rows: Row[]) {
    const budgets = {
        mobile: { lcpMs: 2500, cls: 0.1 },
        desktop: { lcpMs: 2000, cls: 0.1 },
    };

    const failures: string[] = [];

    for (const row of rows) {
        const b = budgets[row.strategy];
        if (row.lcpMs !== null && row.lcpMs > b.lcpMs) {
            failures.push(`${row.strategy} LCP too high: ${row.url} (${row.lcpMs}ms > ${b.lcpMs}ms)`);
        }
        if (row.cls !== null && row.cls > b.cls) {
            failures.push(`${row.strategy} CLS too high: ${row.url} (${row.cls} > ${b.cls})`);
        }
    }

    if (failures.length > 0) {
        const message = [
            "Performance budget failed:\n",
            ...failures.map((f) => `- ${f}`),
        ].join("\n");

        throw new Error(message);
    }
}

const reportPath = path.join(process.cwd(), "pagespeed_report.csv");
const rows = parseCsv(reportPath);
assertBudgets(rows);
console.log("Performance budgets OK");

7) Google Search Console: Config für Monitoring & Automatisierung

7.1 JSON Config for Google Search Console

Diese JSON-Konfiguration beschreibt, welche Property überwacht wird, welche URL-Gruppen relevant sind und welche CWV-/Query-Segmente du automatisch auswertest. Wichtig: Die tatsächliche API-Nutzung erfordert OAuth/Service-Account-Setup; die Config dient als stabile Schnittstelle für deine internen Jobs.

{
  "version": "1.0",
  "property": "sc-domain:example.com",
  "targets": {
    "urlGroups": [
      {
        "name": "Money Pages (PLP)",
        "match": {
          "type": "prefix",
          "value": "https://example.com/kategorie/"
        }
      },
      {
        "name": "Money Pages (PDP)",
        "match": {
          "type": "prefix",
          "value": "https://example.com/produkt/"
        }
      },
      {
        "name": "Blog",
        "match": {
          "type": "prefix",
          "value": "https://example.com/blog/"
        }
      }
    ],
    "searchAnalytics": {
      "dimensions": [
        "query",
        "page",
        "device",
        "country"
      ],
      "dateRange": {
        "type": "lastNDays",
        "value": 28
      },
      "filters": [
        {
          "dimension": "device",
          "operator": "equals",
          "expression": "mobile"
        }
      ],
      "rowLimit": 25000
    },
    "coreWebVitals": {
      "focus": [
        "LCP",
        "INP",
        "CLS"
      ],
      "severityThresholds": {
        "LCP": {
          "goodMs": 2500,
          "needsImprovementMs": 4000
        },
        "INP": {
          "goodMs": 200,
          "needsImprovementMs": 500
        },
        "CLS": {
          "good": 0.1,
          "needsImprovement": 0.25
        }
      }
    }
  },
  "alerts": {
    "enabled": true,
    "channels": [
      "slack",
      "email"
    ],
    "rules": [
      {
        "name": "CWV regression: LCP",
        "when": "mobile_lcp_p75_ms > 3000",
        "windowDays": 7
      },
      {
        "name": "CWV regression: CLS",
        "when": "mobile_cls_p75 > 0.12",
        "windowDays": 7
      }
    ]
  }
}

7.2 YAML: Beispiel-Workflow für täglichen CWV/PSI-Check

YAML eignet sich als deklaratives Setup für CI/Jobs (z.B. nightly run). Dieser Workflow führt das Python-Script aus und lässt anschließend den TypeScript Budget-Check laufen.

name: performance-monitoring

on:
  schedule:
    - cron: "0 3 * * *"
  workflow_dispatch: {}

jobs:
  pagespeed:
    runs-on: ubuntu-latest
    env:
      PAGESPEED_API_KEY: ${{ secrets.PAGESPEED_API_KEY }}

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: Install Python deps
        run: |
          python -m pip install --upgrade pip
          pip install requests

      - name: Run PageSpeed collection
        run: |
          python scripts/pagespeed_report.py

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: "20"

      - name: Install Node deps
        run: |
          npm ci

      - name: Enforce performance budgets
        run: |
          npm run perf:check

      - name: Upload report artifact
        uses: actions/upload-artifact@v4
        with:
          name: pagespeed_report
          path: pagespeed_report.csv

8) Umsetzungspaket (kompakt): Von “rot” zu “grün” in 30–45 Tagen

  1. Woche 1: GSC Core Web Vitals report clustern, Money-Templates identifizieren, PSI Deep-Dive je Template.
  2. Woche 2: LCP-Fokus: Bildpipeline (AVIF/WebP), Caching/TTFB, Critical CSS, Render-Blocking reduzieren.
  3. Woche 3: INP/JS-Fokus: Third-Party Audit, Code-Splitting, Long Tasks eliminieren, Interaktions-Skripte nachgelagert laden.
  4. Woche 4–6: CDN-Optimierung: Asset-Caching, Image-CDN, Edge-Caching (wo sinnvoll), Regression-Checks (TS Budgets) + Monitoring über GSC.

Wenn du dafür ein Team suchst, das Performance und SEO gemeinsam verantwortet: SEO Agentur.

Performance-Workflow (Übersicht)

flowchart TD
  A[GSC: Core Web Vitals Report] --> B[Cluster: Templates & Money-Pages]
  B --> C[Page Speed Insights: Lab Debugging]
  C --> D[Fixes: LCP / INP / CLS]
  D --> E[CDN Setup: Caching + Image Optimization]
  E --> F[CI Gate: Performance Budgets]
  F --> G[GSC Monitoring: Regression & Trend]
  G --> B

Screenshot von Google Search Console „Core Web Vitals“ Report mit markierten URL-Gruppen und Priorisierung nach „schlecht“/„optimierungsbedürftig“
Screenshot von Google Search Console „Core Web Vitals“ Report mit markierten URL-Gruppen und Priorisierung nach „schlecht“/„optimierungsbedürftig“

Screenshot von Page Speed Insights mit hervorgehobenen Diagnostics (Render-blocking resources, LCP element, unused JavaScript)
Screenshot von Page Speed Insights mit hervorgehobenen Diagnostics (Render-blocking resources, LCP element, unused JavaScript)

Häufig gestellte Fragen

Autor

Erol Demirkoparan

Erol Demirkoparan

Senior Software Architect

Full-Stack & Cloud-Native Systems Expert. Spezialisiert auf AWS, Next.js und skalierbare SaaS-Architekturen. Building the future of automated SEO.

AWSNext.jsScalable SaaSSystem Architecture

Veröffentlicht am

29. Dezember 2025

Das könnte Sie auch interessieren