Overview
El reto
- Performance lento: un LCP de 5.8s que mataba las conversiones en móvil
- Checkout complejo: los medicamentos con receta requieren validación, autorización del seguro y compliance
- Dolores de escalamiento: el codebase legacy en React no aguantaba los picos de tráfico
- Mala DX: builds de más de 8 minutos que retrasaban la entrega de features
Resultados clave
| Métrica | Antes | Después | Impacto |
|---|---|---|---|
| LCP (Largest Contentful Paint) | 5.8s | 2.5s | -56% |
| Tasa de conversión | 2.1% | 2.6% | +23% |
| Transacciones mensuales | — | $2M+ | — |
| Tiempo de build | 8 min | 2.5 min | -69% |
| Tamaño del bundle | 1.2 MB | 720 KB | -40% |
| Lighthouse Score | 54 | 92 | +70% |
Análisis técnico a fondo
Optimización de performance
- Migré más de 2,000 imágenes de producto a Next.js Image con WebP/AVIF automático
- Implementé blur placeholders para mejorar la percepción de velocidad
- Lazy loading para el contenido below the fold
- Splitting por rutas con dynamic imports
- Vendor chunks separados para un mejor caching
- JavaScript no crítico diferido (analytics, widgets de chat)
- CSS crítico inline para el contenido above the fold
- Preconnect a los dominios de terceros esenciales
- Font subsetting y
font-display: swap
Arquitectura del checkout
- Productos OTC (sin validación necesaria)
- Medicamentos con receta (requieren subir la receta + validación)
- Productos cubiertos por seguro (requieren autorización en tiempo real con las aseguradoras)
┌─────────────────────────────────────────────────┐
│ Checkout Flow │
├─────────────────────────────────────────────────┤
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ Cart │→ │ Address │→ │ Payment │ │
│ │ Module │ │ Module │ │ Module │ │
│ └──────────┘ └──────────┘ └──────────────┘ │
│ ↓ ↓ ↓ │
│ ┌──────────────────────────────────────────┐ │
│ │ Prescription Validator │ │
│ │ (async, non-blocking for OTC) │ │
│ └──────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────┐ │
│ │ Insurance Authorization │ │
│ │ (Sura, GNP, MetLife integrations) │ │
│ └──────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘- UI optimista: mostrar estados de éxito mientras se procesa en segundo plano
- Degradación elegante: si la API del seguro falla, ofrecemos el precio de contado
- Persistencia de estado: guardar el progreso del checkout en localStorage + servidor
Procesamiento de pagos y arquitectura de transacciones financieras
- Tarjetas de crédito/débito (Visa, Mastercard, Amex) con procesamiento de pagos tokenizado
- Pagos en efectivo vía OXXO (crítico para la población no bancarizada de México)
- Transferencias bancarias (SPEI) con seguimiento de liquidación en tiempo real
- Meses sin intereses (MSI) con cálculo automatizado de intereses
- Requests de pago idempotentes: prevenir cargos duplicados durante fallas de red
- Capa de abstracción de pagos: interfaz agnóstica a la pasarela que permite cambiar de proveedor sin reescribir el checkout
- Motor de precios en tiempo real: precios dinámicos según cobertura del seguro, promociones y niveles de inventario
- Audit trail: registro completo de transacciones para compliance financiero y conciliación
Migración a Next.js 15
- Deploy en paralelo: páginas nuevas en Next.js, legacy en CRA
- Migración gradual de rutas durante 3 meses
- Cutover sin downtime usando los preview deployments de Vercel
- Bundle 40% más pequeño (Server Components)
- Builds 69% más rápidos (Turbopack)
- Mejor SEO con metadata automática
- Patrones de data fetching más simples
Automatización e integraciones
- Orquestación de citas médicas: agendar seguimientos automáticamente según los ciclos de las recetas
- Preautorización de seguros: envío automatizado de documentos a las aseguradoras
- Alertas de inventario: notificar a los pacientes cuando sus medicamentos crónicos vuelven a estar disponibles
Tech Stack
| Capa | Tecnología |
|---|---|
| Framework | Next.js 15 (App Router) |
| Lenguaje | TypeScript |
| Estilos | Tailwind CSS, CSS Modules |
| Estado | Zustand, React Query |
| Pagos | Tonder |
| Analytics | Mixpanel, OpenReplay |
| Automatización | N8N |
| Deployment | Vercel |
| Monitoreo | Sentry, Vercel Analytics |
Lecciones aprendidas
1. Salud ≠ e-commerce tradicional
2. Performance = ingresos
3. La arquitectura modular paga dividendos
4. Invertir en developer experience
Impacto
- Más de 15,000 órdenes mensuales
- 99.9% de uptime en el checkout
- 2.5s de carga promedio (móvil)
- Calificación de 4.8★ en las app stores (relacionada con la experiencia web)
¿Buscas un senior frontend engineer que entienda tanto el código como el impacto en el negocio? Hablemos →
Cuéntame qué le está quitando horas a tu equipo
Llamada gratuita de 30 minutos, sin discurso de ventas: revisamos tu operación y te digo si puedo ayudarte — y cómo.Agenda una llamada
