La llamada a https://api.stripe.com/v1/payment_intents es bloqueada por el navegador
con error CORS policy: No 'Access-Control-Allow-Origin' header.
El origen de la petición es https://app.cultivagrowth.io,
pero el servidor proxy intermedio (payment-proxy.cultivagrowth.io)
no incluye la cabecera Access-Control-Allow-Origin
cuando el método es POST con Content-Type: application/json.
La petición OPTIONS preflight (t=+38.211 s) recibe 200 OK pero sin las cabeceras CORS requeridas,
bloqueando la petición principal. El componente React de Stripe no maneja
este rechazo y se desmonta sin mostrar mensaje de error — pantalla en blanco.
La petición GET /api/plans?currency=EUR recibe un 429 Too Many Requests
en el 2.º intento (t=+18.441 s). El cliente React hace retry sin backoff exponencial,
causando un bucle de 3 peticiones en 800 ms. No impide el flujo pero añade 1.2 s de latencia.
1. Añadir cabeceras CORS en payment-proxy.cultivagrowth.io:
Access-Control-Allow-Origin: https://app.cultivagrowth.io
y Access-Control-Allow-Methods: POST, OPTIONS en la respuesta al preflight.
2. Añadir manejo de error en el componente <PaymentForm> para capturar
TypeError: Failed to fetch y mostrar mensaje al usuario en lugar de desmontar silenciosamente.
3. Implementar retry con backoff en /api/plans: usar retry-after header
o backoff de 200/400/800 ms con máximo 3 intentos.
| Estado | Método | URL | Tipo | Tamaño | Duración | Inicio |
|---|---|---|---|---|---|---|
| 200 | GET | paymentapp.cultivagrowth.io/onboarding/payment | Document | 2.1 KB | 188 ms | +18.021 s |
| 200 | GET | main.chunk.jscdn.cultivagrowth.io/static/js | Script | 142 KB | 412 ms | +18.209 s |
| 200 | GET | js.stripe.com/v3/ | Script | 88 KB | 321 ms | +18.631 s |
| 200 | POST | /api/payment/initapp.cultivagrowth.io | XHR | 0.8 KB | 234 ms | +19.441 s |
| 200 | OPTIONS | preflight CORSpayment-proxy.cultivagrowth.io | Preflight | 0 B | 91 ms | +38.211 s |
| CORS | POST | BLOQUEADOpayment-proxy.cultivagrowth.io/stripe-proxy | XHR | — | 0 ms | +38.219 s |
| 200 | GET | m.stripe.com/6/m.js | Script | 12 KB | 198 ms | +40.112 s |
# Listado de páginas del run node scripts/query.mjs onboarding-debug-001 list pid url events errors duration ─── ────────────────────────────────────────── ────── ────── ──────── 0 https://app.cultivagrowth.io/signup 60 0 5.9 s 1 https://app.cultivagrowth.io/onboarding/plan 143 1 12.1 s 2 https://app.cultivagrowth.io/onboarding/payment 217 3 58.4 s # Todos los errores de la página 2 node scripts/query.mjs onboarding-debug-001 errors 2 [+38.219s] Network · CORS · payment-proxy.cultivagrowth.io/stripe-proxy [+38.221s] Console · error · TypeError: Failed to fetch (PaymentForm.tsx:142) [+38.223s] Console · error · Cannot read properties of undefined 'id' (PaymentIntent.js:88) # Peticiones fallidas en toda la sesión jq -c '.params' .o11y/onboarding-debug-001/cdp/network/failed.jsonl {"url":"https://payment-proxy.cultivagrowth.io/stripe-proxy","errorText":"net::ERR_FAILED","blockedReason":"CORS"} # Hosts más activos por request count node scripts/query.mjs onboarding-debug-001 hosts host requests failed bytes ───────────────────────────────── ──────── ────── ───── app.cultivagrowth.io 14 0 48 KB cdn.cultivagrowth.io 5 0 312 KB js.stripe.com 3 0 102 KB payment-proxy.cultivagrowth.io 2 1 0 B ← CORS fail
{
"runId": "onboarding-debug-001",
"target": "ws://localhost:9222/devtools/browser/4f2a1...",
"domains": ["Network", "Console", "Runtime", "Log", "Page"],
"started_at": "2026-06-16T09:14:00.000Z",
"stopped_at": "2026-06-16T09:15:16.400Z",
"sample_interval_ms": 2000,
"screenshots_taken": 38,
"dom_dumps": 38,
"total_events": 420,
"pages": 3
}