Configuraciones de Estados de Retencion
Configuracion por tenant de estados de retencion de usuario activos.
El catalogo de cada tenant se siembra desde los codes de estado de retencion por defecto de la plataforma al momento del setup del tenant, y puede re-sincronizarse en cualquier momento desde el dialogo de importacion (que lee GET /api/user-retention-status-configs/defaults). Cada config vive por completo dentro del tenant: se identifica por su code (unico) y lleva el label de visualizacion del tenant — no hay un catalogo global que lo respalde.
GET /api/user-retention-status-configs
Lista todas las configuraciones de estados de retencion del tenant.
Auth: Requerida — permiso VIEW_ACTIVITIES
Ejemplo
curl https://api.reten.ai/api/user-retention-status-configs \
-H "Authorization: Bearer <token>" \
-H "x-tenant-id: <tenant-id>"import axios from 'axios';
const response = await axios.get(
'https://api.reten.ai/api/user-retention-status-configs',
{
headers: {
Authorization: 'Bearer <token>',
'x-tenant-id': '<tenant-id>',
},
}
);
const configs = response.data;Respuesta 200 OK
[
{
"id": "aa0e8400-e29b-41d4-a716-446655440000",
"code": "habit",
"label": "En hábito",
"isActive": true,
"createdAt": "2026-06-18T06:00:00.000Z",
"updatedAt": "2026-06-18T06:00:00.000Z"
},
{
"id": "bb0e8400-e29b-41d4-a716-446655440000",
"code": "dormant",
"label": "En riesgo",
"isActive": true,
"createdAt": "2026-06-18T06:00:00.000Z",
"updatedAt": "2026-06-18T06:00:00.000Z"
}
]GET /api/user-retention-status-configs/defaults
Devuelve los estados de retencion por defecto de la plataforma como un catalogo plano { code, label }. La app de administracion lo usa para prellenar el dialogo de importacion con los estados que un tenant puede adoptar.
Auth: Requerida — permiso VIEW_ACTIVITIES
Este endpoint es prellenado, no una entidad. El payload es el catalogo de defaults hardcodeado — no autoritativo y NO se persiste — y siempre lista todos los defaults sin importar lo que el tenant ya tenga. Para adoptarlos, el admin elige los que aun faltan y los crea via POST /api/user-retention-status-configs/bulk. Llamar a este endpoint no crea nada.
Ejemplo
curl https://api.reten.ai/api/user-retention-status-configs/defaults \
-H "Authorization: Bearer <token>" \
-H "x-tenant-id: <tenant-id>"import axios from 'axios';
const response = await axios.get(
'https://api.reten.ai/api/user-retention-status-configs/defaults',
{
headers: {
Authorization: 'Bearer <token>',
'x-tenant-id': '<tenant-id>',
},
}
);
const defaults = response.data;Respuesta 200 OK
[
{
"code": "sign_up",
"label": "Registrado"
},
{
"code": "habit",
"label": "En hábito"
}
]POST /api/user-retention-status-configs
Crea una configuracion de estado de retencion para el tenant.
Auth: Requerida — permiso MANAGE_ACTIVITY_CONFIG
Cuerpo de la Solicitud
| Campo | Tipo | Requerido | Descripcion |
|---|---|---|---|
code | string | Si | Codigo canonico del estado de retencion (del catalogo) |
label | string | Si | Etiqueta de visualizacion para este tenant |
Ejemplo
curl -X POST https://api.reten.ai/api/user-retention-status-configs \
-H "Authorization: Bearer <token>" \
-H "x-tenant-id: <tenant-id>" \
-H "Content-Type: application/json" \
-d '{
"code": "habit",
"label": "En hábito"
}'import axios from 'axios';
const response = await axios.post(
'https://api.reten.ai/api/user-retention-status-configs',
{
code: 'habit',
label: 'En hábito',
},
{
headers: {
Authorization: 'Bearer <token>',
'x-tenant-id': '<tenant-id>',
},
}
);Respuesta 201 Created
POST /api/user-retention-status-configs/bulk
Creacion masiva de configuraciones de estados de retencion del tenant.
Auth: Requerida — permiso MANAGE_ACTIVITY_CONFIG
Cuerpo de la Solicitud
| Campo | Tipo | Requerido | Descripcion |
|---|---|---|---|
items | array | Si | Array de configuraciones a crear |
items[].code | string | Si | Codigo canonico del estado de retencion (del catalogo) |
items[].label | string | Si | Etiqueta de visualizacion para este tenant |
Ejemplo
curl -X POST https://api.reten.ai/api/user-retention-status-configs/bulk \
-H "Authorization: Bearer <token>" \
-H "x-tenant-id: <tenant-id>" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"code": "habit",
"label": "En hábito"
},
{
"code": "dormant",
"label": "En riesgo"
}
]
}'import axios from 'axios';
const response = await axios.post(
'https://api.reten.ai/api/user-retention-status-configs/bulk',
{
items: [
{
code: 'habit',
label: 'En hábito',
},
{
code: 'dormant',
label: 'En riesgo',
},
],
},
{
headers: {
Authorization: 'Bearer <token>',
'x-tenant-id': '<tenant-id>',
},
}
);Respuesta 201 Created
PATCH /api/user-retention-status-configs/:id
Actualiza una configuracion de estado de retencion del tenant.
Auth: Requerida — permiso MANAGE_ACTIVITY_CONFIG
Cuerpo de la Solicitud
| Campo | Tipo | Requerido | Descripcion |
|---|---|---|---|
label | string | No | Etiqueta de visualizacion |
is_active | boolean | No | Habilitar o deshabilitar esta configuracion |
Ejemplo
curl -X PATCH https://api.reten.ai/api/user-retention-status-configs/<id> \
-H "Authorization: Bearer <token>" \
-H "x-tenant-id: <tenant-id>" \
-H "Content-Type: application/json" \
-d '{
"label": "Etiqueta Actualizada"
}'import axios from 'axios';
const response = await axios.patch(
'https://api.reten.ai/api/user-retention-status-configs/<id>',
{
label: 'Etiqueta Actualizada',
},
{
headers: {
Authorization: 'Bearer <token>',
'x-tenant-id': '<tenant-id>',
},
}
);Respuesta 200 OK
DELETE /api/user-retention-status-configs/:id
Desactiva una configuracion de estado de retencion del tenant.
Auth: Requerida — permiso MANAGE_ACTIVITY_CONFIG
Ejemplo
curl -X DELETE https://api.reten.ai/api/user-retention-status-configs/<id> \
-H "Authorization: Bearer <token>" \
-H "x-tenant-id: <tenant-id>"import axios from 'axios';
const response = await axios.delete(
'https://api.reten.ai/api/user-retention-status-configs/<id>',
{
headers: {
Authorization: 'Bearer <token>',
'x-tenant-id': '<tenant-id>',
},
}
);