La lógica de dedup
4 pasos para tener el % de cierre verdadero
Esta es la lógica que aplicamos en Wayfarer todos los días. Una vez que la entendés, no podés volver al reporte default de Tiendanube — sabés que está inflando.
GET /checkoutsFilter: !completed_atPaginar hasta el final
El endpoint para esto NO es /orders sino /checkouts. Filtrás los que NO tienen completed_at (eso significa que no se completaron). Como Tiendanube paginá de a 100, vas a tener que hacer múltiples requests si tenés volumen.
Detalle clave
Cada checkout tiene un contact_email y/o contact_identification (DNI/CUIL/RUT). Si están vacíos, ese carrito anónimo no se puede dedupear — lo contás como 1 sin más.
Lowercase + trim emailFallback a identificationContar únicos
Para cada carrito abandonado, generás una clave: contact_email.toLowerCase().trim(). Si está vacío, usás contact_identification (DNI/CUIL/RUT). Si los dos están vacíos, el carrito es anónimo y lo contás como 1 sin dedup posible. Tu dedup count = cantidad de claves únicas, NO cantidad de carritos.
Lowercase + trim es crítico: "Juan@example.com" y "juan@example.com" son la misma persona, pero sin normalización los contás como dos. Lo mismo con espacios extra al final del email (pasa más de lo que parece). Aplicá .toLowerCase().trim() SIEMPRE antes de comparar.
Por qué importa
En un día normal, los carritos crudos pueden ser 100 pero los carritos únicos por persona pueden ser 60-70. La diferencia son personas que volvieron y abandonaron de nuevo (el flow las atacó pero no convirtieron).
GET /ordersowner_note contains 'carrito'Same dedup logic
Cuando alguien abandona y después cierra (vía email de recovery, WhatsApp, lo que sea), la orden cerrada puede llevar una owner_note que contiene 'carrito' (lo seteamos así por convención). Filtrás esas órdenes y aplicás el mismo dedup por persona.
Pro tip
Si dos carritos cierran en el mismo día por la misma persona (mismo email), contás 1, no 2. El % cierre se mide por personas, no por intentos.
cerrados_únicos / abandonados_únicosCap a 1.0 (100%)Mensual ≠ promedio del diario
Cierres únicos del día / abandonos únicos del día = % cierre del día. Si supera 100% (porque a veces cerrás carritos abandonados del día anterior), capeás a 1.0. Para el % mensual: NUNCA promediar los % diarios. Hay que calcular total cerrados únicos del MES / total abandonados únicos del MES (con dedup mensual, no diario).
Detalle del cap al 100%: el ratio puede dar más de 1.0 cuando una persona abandonó el carrito el día 3 y lo cerró el día 5. En el día 5 cuenta como "cerrado" pero no había abandonado ese mismo día. Si no capeás, ves dashboards con 130% de cierre que no tienen sentido. Cap a 1.0 mantiene la métrica interpretable.
El histórico es la métrica real: el % cierre del MES (no del día) es lo que tenés que mirar para evaluar tu flow de recovery. El día a día es muy ruidoso. Compará mes contra mes para detectar tendencias — si el flow de email/WhatsApp dejó de funcionar, lo ves ahí.
Diferencia con default
El reporte default de Tiendanube cuenta carritos crudos sin dedup. Cuando lo calculás bien con dedup, el % real puede ser muy distinto al que muestra el panel.