📋 Resumen del Sistema
El sistema de carritos abandonados de Yeppo tiene dos canales de comunicación que trabajan en paralelo:
- Bot de WhatsApp (Railway): detecta carritos abandonados y envía mensajes personalizados con links de recuperación
- Flujo de email en Klaviyo (U48rQK): secuencia de correos programados (1h, 24h, 3 días)
El desafío: evitar que un mismo cliente reciba WhatsApp Y email por el mismo carrito abandonado. La solución: sincronización vía campo personalizado.
🏗️ Arquitectura del Sistema
Ver Figura 1 arriba. El flujo es:
- Cliente abandona checkout en Shopify
- Bot WhatsApp (Railway) envía mensaje con link de recuperación
- El bot escribe el timestamp
wa_carrito_enviado_aten el perfil de Klaviyo del cliente - Flujo Klaviyo U48rQK procesa al contacto:
- Delay 1 hora
- Conditional Split: ¿wa_carrito_enviado_at menor a 2 horas?
- ✅ SÍ → Saltar Email #1, reconectar al Delay 24h
- ❌ NO → Email #1 → Delay 24h
- Delay 24h → Email #2
- Delay 3 días → Email #3
🔑 El Campo wa_carrito_enviado_at
Es un campo personalizado de fecha/hora en el perfil de Klaviyo del cliente.
- Quién lo escribe: El bot de WhatsApp (código en
core/klaviyo.jsdel repoclaw-whatsapp-agent) - Cuándo se escribe: Cada vez que el bot envía un mensaje de carrito abandonado por WhatsApp
- Para qué sirve: Es la «bandera» que le dice al flujo de Klaviyo: «este cliente ya recibió WhatsApp, no le mandes el Email #1 todavía»
⚠️ Regla de Oro del Conditional Split
✅ Ubicación CORRECTA (ver Figura 2, lado derecho)
El Conditional Split debe ir DESPUÉS del delay de 1 hora, justo ANTES del Email #1.
- La rama SÍ (WA ya enviado): SALTA solo el Email #1 y se reconecta al flujo en el siguiente delay
- La rama NO (sin WA): recibe Email #1 normalmente
- Ambas ramas continúan con el resto del flujo (Delay 24h, Email #2, Delay 3d, Email #3)
❌ Ubicación INCORRECTA (ver Figura 2, lado izquierdo)
NUNCA poner el Conditional Split al inicio del flujo.
Consecuencia grave: Si el cliente recibió WhatsApp, sale del flujo completo y no recibe NINGÚN email de seguimiento. Pierde Email #2 (24h), Email #3 (3 días), y cualquier comunicación futura. Si no compró por WhatsApp, perdiste TODA oportunidad de recuperarlo por email.
🔀 Las Dos Ramas Deben Reconectar
Este es el error más crítico y frecuente:
- ✅ CORRECTO: Rama SÍ → Saltar Email #1 → continuar al siguiente delay/email
- ❌ INCORRECTO: Rama SÍ → Terminar el flujo (END)
Ambas ramas deben llegar al mismo punto: el siguiente delay o email en la secuencia. La rama SÍ simplemente se salta un email, pero no abandona el flujo.
🔧 Checklist de Verificación
Antes de activar el flujo para un evento (Cyber, Black, etc.):
- ✅ El bot está corriendo en Railway (
CARRITO_ENABLED=true) - ✅ El Conditional Split está después del delay de 1h, NO al inicio del flujo
- ✅ La rama SÍ reconecta al siguiente paso del flujo (no termina en END)
- ✅ La condición es:
wa_carrito_enviado_at→ «is in the last» → 2 hours - ✅ El flujo
U48rQKestá en status LIVE - ✅ Ambas ramas del split (SÍ y NO) llevan al mismo punto de continuación
📊 Variables de Railway Relevantes
CARRITO_ENABLED=true— Activa el flujo automático de carritos abandonadosKLAVIYO_API_KEY— API key para escribir wa_carrito_enviado_at en KlaviyoSHOPIFY_TOKEN— Token admin Shopify para obtener carritosWA_TOKEN— Token Meta para enviar WhatsApp
🔗 Recursos
- Flujo Klaviyo: U48rQK («Checkout Abandonado – Flujo»)
- Repo bot: github.com/alejandrochungp/claw-whatsapp-agent
- Módulo Klaviyo: core/klaviyo.js
- Endpoint admin: GET /admin/logs?n=100 (monitoreo de envíos)