53 Prozent der E-Commerce-Seiten verlieren Nutzer, wenn die Ladezeit 3 Sekunden überschreitet (Google 2025 Daten). Performance Budget — numerische Obergrenzen wie „LCP darf 2,5s nicht überschreiten" — ist zur obligatorischen Disziplin geworden, um diese Verluste zu verhindern. Aber die meisten Teams lassen diese Budgets in Dokumenten liegen. Regressionen sollten die Deploy-Pipeline automatisch stoppen, RUM-Dashboards sollten in wöchentlichen Sprint Reviews Platz haben. Web-Performance ist nicht mehr „Aufgabe des Frontend-Teams", sondern eine Datenschicht, die Produktentscheidungen formt.
Was ein Performance Budget ist — und was nicht
Ein Performance Budget macht akzeptable Verlangsamungsschwellen zu numerischen Verpflichtungen. Statt des abstrakten Ziels „die Seite sollte schnell sein" wird aus „LCP < 2,5s, FID < 100ms, CLS < 0,1" ein bindendes Versprechen. Ein PR, das das Budget überschreitet, wird nicht mergewiziert — die CI schlägt fehl.
Budget-Typen:
| Metrik-Typ | Beispiel-Budget | Messmethode |
|---|---|---|
| Core Web Vitals | LCP < 2,5s | Lighthouse CI, RUM (CrUX) |
| Timing | TTI < 3,5s, TBT < 200ms | Lighthouse, WebPageTest |
| Ressource | JS-Bundle < 200KB (gzip), Gesamtgröße < 1MB | Webpack Bundle Analyzer |
| Anzahl | HTTP-Anfragen < 50, Third-Party-Skripte < 5 | Netzwerk-Panel |
Ein Budget ist nicht ein Werkzeug zum „Blockieren von Performance", sondern zum „Erfassen von Performance als Kostenfaktor". Wenn ein Developer eine neue Analytics-Bibliothek hinzufügt, kalkuliert er: „Das kostet uns 15KB + 200ms Main-Thread-Zeit". Wenn ein PM ein neues Carousel-Widget anfordert, erhält er das Feedback: „Das erhöht CLS um 0,08, wir haben noch 0,02 vom Budget übrig".
Ohne Budget arbeitet das Team nach „gefühlter" Performance. Gefühl ist subjektiv, Budget ist objektiv.
Mit Lighthouse CI eine Regression-Schranke errichten
Lighthouse CI führt bei jedem Commit automatisch Lighthouse-Scores aus und lässt die CI fehlschlagen, wenn Budgets überschritten werden. Es integriert sich mit GitHub Actions, GitLab CI, Jenkins. Das Setup dauert 10 Minuten — der Ertrag ist eine 10 Jahre andauernde Performance-Kultur.
Beispiel GitHub Actions Workflow:
name: Lighthouse CI
on: [pull_request]
jobs:
lighthouse:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- run: npm ci && npm run build
- run: npm install -g @lhci/cli
- run: lhci autorun
env:
LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_TOKEN }}
Budget-Definition in .lighthouserc.json:
{
"ci": {
"collect": {
"url": ["http://localhost:3000/", "http://localhost:3000/product/123"],
"numberOfRuns": 3
},
"assert": {
"preset": "lighthouse:no-pwa",
"assertions": {
"first-contentful-paint": ["error", {"maxNumericValue": 2000}],
"largest-contentful-paint": ["error", {"maxNumericValue": 2500}],
"cumulative-layout-shift": ["error", {"maxNumericValue": 0.1}],
"total-blocking-time": ["error", {"maxNumericValue": 200}],
"interactive": ["error", {"maxNumericValue": 3500}]
}
},
"upload": {
"target": "temporary-public-storage"
}
}
}
Diese Konfiguration nimmt einen Durchschnitt aus 3 Durchläufen (Lighthouse zeigt ±15% Varianz in einzelnen Läufen). Wenn LCP 2,5s überschreitet, wird das PR rot markiert. Der Developer kann nicht mergen. Alert im Slack: „PR #432 LCP 2,8s — Budget 2,5s — bitte optimieren oder Exception vom PM einholen."
Bei Roibase integrieren wir die technische Kostendimension von Produktentscheidungen in die Headless-Commerce-Infrastruktur, um den Performance-Footprint jedes Features sichtbar zu machen. Lighthouse CI trägt diese Zahlen an den Entscheidungspunkt.
Mit RUM echte Nutzerdaten in die Entscheidungsfindung bringen
Lighthouse Lab-Daten — Messung in kontrollierten Umgebungen — legen Rahmenbedingungen fest, zeigen aber nicht die ganze Realität. RUM (Real User Monitoring) erfasst Web Vitals aus Produktionstraffic. Bei 10% der langsamen Verbindungen kann LCP 5s sein. Das siehst du im Lab nicht.
Beispiel RUM-Stack:
// web-vitals Library erfasst alle Core Web Vitals
import {onCLS, onFID, onLCP} from 'web-vitals';
function sendToAnalytics({name, value, id}) {
fetch('/api/vitals', {
method: 'POST',
body: JSON.stringify({name, value, id, url: location.href}),
keepalive: true
});
}
onCLS(sendToAnalytics);
onFID(sendToAnalytics);
onLCP(sendToAnalytics);
Der Backend /api/vitals Endpoint schreibt diese Daten in BigQuery. Ein wöchentliches Dashboard wird zum Sprint Review hinzugefügt:
| Metrik | p50 | p75 | p90 | Budget | Status |
|---|---|---|---|---|---|
| LCP | 2,1s | 2,8s | 4,2s | 2,5s (p75) | ⚠️ 0,3s Überschuss |
| FID | 12ms | 45ms | 120ms | 100ms (p75) | ✅ |
| CLS | 0,05 | 0,09 | 0,18 | 0,1 (p75) | ✅ |
Bei p75 wird das LCP-Budget überschritten — der PM entscheidet: „Dieser Sprint: Homepage-Slider-Optimierung rückt an die Spitze der Agenda. Solange wir LCP nicht von 2,8s auf 2,3s bringen, frieren wir neue Features ein."
Wenn man RUM-Daten mit Sprint-Velocity verknüpft, produziert man Metriken wie „200ms LCP-Verbesserung pro Sprint". Das Team misst seine Geschwindigkeit nicht mehr in Feature-Counts, sondern in „versandtem Wert + Performance-Verbesserung".
Regression-Alarmsystem: Performance-Verschlechterung in Echtzeit erkennen
Performance-Regressions nach einem Deploy innerhalb von 2 Stunden zu erkennen ist kritisch. Beispiel: Ein neues A/B-Test-Tool erhöht LCP um 1,2s, ein Traffic-Segment sieht %8 Conversion Drop. Ein frühzeitiger Alarm = 1 Rollback löst das Problem. Späterkennung = 1 Woche Revenue-Verlust.
Alarm-Regeln (BigQuery + Cloud Monitoring):
-- p75 LCP letzte 1 Stunde vs. Durchschnitt der letzten 24 Stunden
WITH current AS (
SELECT APPROX_QUANTILES(lcp, 100)[OFFSET(75)] AS lcp_p75
FROM vitals_table
WHERE timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
),
baseline AS (
SELECT APPROX_QUANTILES(lcp, 100)[OFFSET(75)] AS lcp_p75
FROM vitals_table
WHERE timestamp BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 25 HOUR)
AND TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
)
SELECT
c.lcp_p75 AS current_lcp,
b.lcp_p75 AS baseline_lcp,
(c.lcp_p75 - b.lcp_p75) / b.lcp_p75 * 100 AS pct_change
FROM current c, baseline b
WHERE (c.lcp_p75 - b.lcp_p75) / b.lcp_p75 > 0.15; -- %15 Erhöhung Alarm
Diese Query läuft alle 10 Minuten vom Cloud Scheduler. Bei Überschreitung der Schwelle fällt sie in den Slack-Kanal #perf-alerts. Das On-Call-Team beginnt innerhalb von 30 Minuten mit der Root-Cause-Analyse.
Typische Regression-Szenarien:
- Third-Party-Skript hinzugefügt: Analytics-Vendor blockiert Main Thread 180ms → TBT-Budget überschritten
- Image Lazy-Load kaputt: LCP-Kandidatenbild wird lazy-geladen → LCP 1,2s → 3,1s
- Schlechtes JS-Bundle-Split: Kritisches CSS wird verschoben → FCP 900ms → 2,4s
Zweck des Alarmsystems ist Attribution — „welches Deploy hat welche Metrik kaputt gemacht" in 10 Minuten beantworten können.
Das Budget mit dem Product Backlog verbinden
Performance Budget nicht nur als Developer-Constraint, sondern als Produktentscheidung einrichten. Der PM denkt jetzt so: „Dieses Feature braucht 40KB JS, wir haben noch 25KB Budget — welches alte Feature entfernen wir?"
Tradeoff-Template:
Feature: Homepage product carousel (8 Slots)
Performance-Auswirkung:
- JS: +32KB (gzip)
- LCP: +180ms (Slider-Animation)
- CLS: +0,04 (Lazy-Image-Shift)
Budget VORHER:
- JS: 168KB / 200KB (32KB verbleibend)
- LCP: 2,3s / 2,5s (200ms verbleibend)
- CLS: 0,06 / 0,1 (0,04 verbleibend)
Budget NACHHER:
- JS: 200KB / 200KB ⚠️ VOLL
- LCP: 2,48s / 2,5s ⚠️ 20ms verbleibend
- CLS: 0,10 / 0,1 ⚠️ VOLL
Entscheidung: Genehmigt (Carousel A/B-Test zeigte +3% CTR Gewinn).
Bedingung: Alten Banner-Rotator von Homepage entfernen (-28KB).
Der PM trifft diesen Tradeoff datengesteuert: „Ist der +3% CTR-Gewinn die 180ms LCP-Kostenfaktor wert?" wird mit Conversion-Funnel-Daten beantwortet. Wenn ja, genehmigt; wenn nein, wartet es im Backlog auf eine „performance-neutrale Optimierung".
Das Team überprüft den Backlog alle 2 Wochen in einem Performance Audit: „Welches Feature hat die schwächste Performance-ROI?" Beispiel: alte Social-Share-Buttons sind 12KB, aber nur %0,2 werden verwendet → entfernt, Budget freigeben.
Performance-Kultur: Zahlengesteuerte Geschwindigkeitskultur
Web-Performance nicht als „Best Practice", sondern als KPI einordnen. Wenn Teams quarterly OKRs bekommen wie „p75 LCP von 2,5s auf 2,0s senken", wird Performance-Verbesserung zu separaten Backlog-Items statt versteckt in Sprint Velocity.
Performance Budgets sind der Grundstein dieser Kultur. Der Developer fragt beim Schreiben von Code: „Ist noch Budget übrig?" Der PM kalkuliert bei Feature-Planung: „Was ist der Performance-Footprint?" Der CTO überprüft im Quarterly Review: „Wie hat sich die durchschnittliche LCP pro Deploy entwickelt?"
Lighthouse CI sperrt die Tür, RUM sagt die Wahrheit, das Alarmsystem fängt Abweichungen auf, Backlog-Tradeoffs halten das Gleichgewicht. Wenn dieser Kreislauf geschlossen ist, wird Performance nicht mehr zur „Sorge des Tech-Teams" — es wird zur messbaren Dimension von Produktsukzess. Nach 2026, als Google Web Vitals zum Ranking-Faktor machte, verloren Teams, die diesen Kreislauf nicht aufgebaut hatten, 40% organischen Traffic (Search Console 2025 Benchmark). Ein Budget zu setzen ist jetzt keine Luxus- sondern Überlebensfrage.