Un carrito abandonado es un proceso de compra que un cliente inició en alguno de tus canales conectados pero nunca convirtió en pedido. Fenicia los agrega automáticamente para que puedas analizarlos, intentar recuperarlos o cerrarlos como no recuperables.
Ruta canónica vs. alias legacy
La ruta canónica de este dominio es /orders/abandoned-carts/*. Existe un alias /abandoned-carts/* (sin el prefijo /orders) que apunta al mismo lambda por compatibilidad, pero está deprecado desde el 1 de junio de 2026 y cada llamada genera un warning en los logs del servidor. Usa siempre /orders/abandoned-carts/* en integraciones nuevas.
El envelope de este dominio es distinto al resto de Órdenes
Todos los demás endpoints de Órdenes devuelven listas paginadas como { data: [...], meta: { pagination: {...} } }. El listado de carritos abandonados no sigue ese patrón. Su respuesta viene doble-anidada:
Es decir, pagination es hermano de data.data, no de data a secas, y no existe un objeto meta. Esta es una inconsistencia real de la API (no un error de esta documentación) — si escribes un cliente genérico para Órdenes que asume el shape {data, meta:{pagination}}, este endpoint lo va a romper. Léelo con response.data.data y response.data.pagination.
Este dominio usa dos convenciones de texto diferentes que no debes confundir:
Los permisos (scopes de la API key) se escriben con guion: abandoned-carts:read, abandoned-carts:sync, abandoned-carts:recover, abandoned-carts:update, abandoned-carts:send-reminder.
Los códigos de error del catálogo se escriben con guion bajo: abandoned_carts:not_found, abandoned_carts:already_recovered, abandoned_carts:already_closed, abandoned_carts:recovery_failed.
Son dos catálogos independientes (el de permisos vive en PERMISSIONS.ABANDONED_CARTS.*, el de errores en el catálogo de errores de la librería). No es un error tipográfico de esta página: literalmente así están definidos en la API.
Esta búsqueda usa la misma forma de respuesta doble-anidada descrita arriba: response.data.data es el arreglo, response.data.pagination es la paginación — no hay meta.
Grupos reales: no_action, with_action, recovered, not_recovered, all
no_action son los carritos open sin ningún intento de recuperación; with_action son los contacted; not_recovered suma expired + closed; all es el total. Estos 5 nombres no coinciden con el statusGroup que aceptas como filtro en el listado — son la agrupación fija de este endpoint de conteo.
Devuelve el conteo total de carritos abandonados que cumplen los filtros. Requiere abandoned-carts:read.
statusstring
Filtra por estado del carrito.
statusGroupstring
Filtra por grupo visual de estado.
recoveryStatusstring
Filtra por estado del proceso de recuperación.
channelIdstring
Filtra por canal.
originstring
Filtra por origen/tipo de canal.
startDatestring
Fecha ISO de inicio (inclusiva).
endDatestring
Fecha ISO de fin (inclusiva).
200
{ "data": { "count": 87 } }
Tip
A diferencia de lo que podrías esperar por otros endpoints de conteo simples, este acepta los mismos filtros que el listado — úsalo para mostrar un contador que coincida exactamente con una vista filtrada, sin traer todos los registros.
Endpoint placeholder: no dispara sincronización real todavía
A diferencia de POST /orders/sync, el handler de este endpoint es un placeholder: acepta la petición y responde 202, pero las integraciones de canal aún no están conectadas a esta ruta — no dispara ninguna sincronización real de carritos abandonados en el canal. channelId es opcional; si lo omites, la clave channelId simplemente no aparece en la respuesta.
recoveryStatus no lo envías tú: la API lo calcula a partir de tu type/status. Solo cuando status es sent o delivered pasa a email_sent / sms_sent / whatsapp_sent según el type; en cualquier otro caso queda pending. El carrito además pasa a status: "contacted" en cuanto registras la primera acción.
Usa recover/close para las transiciones con reglas de negocio
Este endpoint escribe el status directamente, sin las reglas que aplican POST .../recover (registra recoveredAt) o POST .../close. Prefiere esos endpoints dedicados cuando el caso de uso coincida; usa este solo para casos que no cubren (por ejemplo, marcar expired manualmente).
No existe un carrito abandonado con ese ID en tu tenant.
abandoned_carts:already_recovered
409
El carrito ya fue marcado como recuperado.
abandoned_carts:already_closed
409
El carrito ya fue cerrado.
abandoned_carts:recovery_failed
500
Falló la acción de recuperación (por ejemplo, el envío del recordatorio).
validation:invalid_input
400
El cuerpo no cumple el schema — falta type/status en una acción de recuperación, o status no es un valor válido al actualizar el estado.
validation:invalid_pagination
400
page o limit tienen un valor fuera de rango.
auth:invalid_token
401
La API key es inválida o fue revocada.
auth:permission_denied
403
La API key no tiene el permiso requerido (con guion, ej. abandoned-carts:recover).
Aislamiento por tenant
Solo puedes consultar y operar carritos abandonados de tu propio tenant. Intentar acceder a un carrito de otro tenant devuelve 404, nunca información cruzada.