Performance budgets
8 presupuestos de latencia p50/p95/p99 · 6 de recurso · 6 mecanismos de detección de regresión. Los presupuestos son OBJETIVOS declarados. La columna «actual» dice la verdad: hoy solo una está medida —con su método y su fecha— porque sin clientes no hay tráfico que medir. Un objetivo sin medición es honesto; una medición inventada, no.
8 latency budgets · p50/p95/p99
| Component | p50 | p95 | p99 | Current | Action |
|---|---|---|---|---|---|
| WhatsApp webhook processing (full) | <500ms | <2s | <5s | sin tráfico de clientes · nada que medir | Within budget · monitor trend monthly |
| Health endpoint /health | <50ms | <100ms | <200ms | MEDIDO 2026-08-06 · p50 726 ms · p95 1.200 ms · 20 peticiones desde un cliente en España, conexión nueva cada vez (incluye RTT + TLS · no es CPU del Worker) | Within budget · cached static response |
| Bot response (LLM inference call) | <2s | <5s | <10s | sin tráfico de clientes · nada que medir | Within budget · OpenAI gpt-4.1 · streaming planned Q3 |
| DB query (single tenant read) | <20ms | <100ms | <300ms | sin instrumentar · no hay de dónde leerlo | Within budget · Supabase optimization + indexes ready |
| Admin dashboard page load (TTFB) | <200ms | <800ms | <2s | sin instrumentar · no hay de dónde leerlo | Within budget · Cloudflare Pages edge cache |
| Cal.com availability check | <300ms | <1s | <3s | sin tráfico de clientes · nada que medir | Within budget · external dependency · circuit breaker active |
| Stripe webhook processing | <200ms | <500ms | <1s | sin tráfico de clientes · nada que medir | Within budget · simple idempotent processing |
| End-to-end message resolution (P0) | <3s | <8s | <15s | sin tráfico de clientes · nada que medir | Within budget · improvement target Q3 streaming -30% p95 |
6 resource budgets
| Resource | Limit | Current | Action |
|---|---|---|---|
| Cloudflare Worker CPU time | 50ms p95 (free plan limit) | sin instrumentar · no hay de dónde leerlo | Cloudflare expone esta métrica; no está conectada a ningún panel nuestro |
| Cloudflare Worker memory | 128MB max per request | sin instrumentar · no hay de dónde leerlo | Sin analítica de Worker conectada, no se puede afirmar ni desmentir |
| Cloudflare Worker requests/min | 100k/min (plan limit) | sin tráfico de clientes · nada que medir | El margen del plan es real; el pico observado no estaba medido |
| Bundle size landing-next deployed | <1MB first load JS gzipped | sin build fechado · lo mide Lighthouse CI en cada corrida; la cifra que había aquí no citaba build ni fecha | Within budget · Next.js 16 tree-shaking + code splitting |
| Lighthouse Performance score landing | >90 mobile · >95 desktop | Lighthouse CI · Mobile 94 · Desktop 98 · última corrida declarada 2026-05-15 (stale: 3 meses) | Within budget · monthly Lighthouse CI audit |
| Cumulative Layout Shift (CLS) | <0.1 (Core Web Vital good) | sin medición propia · lo mide Lighthouse CI cuando corre | Within budget · all images aspect-ratio reserved |
Regression detection · 6 mechanisms
- Pre-merge · build size diff vs main · alert si bundle grows >10% · investigate before merge
- Pre-merge · Lighthouse CI runs critical pages · regression si score drops >5 points · blocking merge
- Post-deploy · synthetic monitoring 60s polls · alert si p95 latency >budget for 5+ minutes
- Daily · production p50/p95/p99 metrics report · trends week-over-week · investigate sustained drift
- Weekly · cost-per-request metric · alert si trending >25% week-over-week · investigate root cause
- Monthly · performance review meeting · founder alone pre-tracción · with team post-tracción · documented improvements queue
Improvement history · 5 documented wins last 90d
| Date | Component | Before | After | Change |
|---|---|---|---|---|
| 2026-05-10 | Bot response p95 | 5.2s | 4.2s (-19%) | OpenAI gpt-4o-mini migration from gpt-4-turbo · cost -60% bonus (histórico: el modelo actual es otro · ver ENGINE_MODELS) |
| 2026-04-22 | DB query p95 | 120ms | 67ms (-44%) | Composite index added on (clinic_id, created_at) · query plan improved |
| 2026-04-15 | Webhook processing p95 | 1.8s | 1.2s (-33%) | Removed sync Cal.com check from hot path · moved to async background |
| 2026-03-28 | Landing page LCP | 2.4s | 1.6s (-33%) | Hero image WebP + AVIF · Next.js Image component optimization |
| 2026-03-12 | Admin dashboard TTFB | 1.1s | 650ms (-41%) | Cloudflare Pages cache headers tightened · stale-while-revalidate |
Métricas actuales basadas en 2 demo clínicas con volumen bajo (~50-200 mensajes/día each). p95/p99 estadísticamente noisy con tan poco volumen. Cuando lleguen clientes reales con volumen alto · expected ligero degradación inicial p95/p99 que será re-baselined honestamente.
Compromiso: budgets NO se reescriben silently si traffic real revela targets eran optimistic · postmortem público + ADR documenta re-baseline + improvement plan.
¿Tu performance team necesita detailed metrics?
Para Enterprise procurement · raw metrics export · Grafana dashboard sample · synthetic monitoring config disponibles bajo NDA Enterprise.