Cambiarle el plan a un cliente (o extenderle la prueba, o suspenderlo)
Las tres acciones administrativas funcionan igual y desde el mismo sitio. Esta guía asume que ya tienes el panel abierto y sesión iniciada.
Hacerlo
- Elige la vertical en la barra izquierda (Gastro o Travel).
- Busca el cliente por nombre, slug o email del dueño y entra a su ficha.
- En Acciones, elige lo que necesitas:
- Cambiar plan — solo aparecen los planes distintos al actual.
- Extender prueba — +7, +15 o +30 días, que se suman a la fecha actual de fin de prueba.
- Suspender / Reactivar — el botón cambia según el estado en que esté.
- Escribe el motivo. Es obligatorio.
- Lee la frase de resumen del diálogo y confirma.
La tabla, el dashboard y la bitácora se actualizan solos.
Por qué el motivo es obligatorio
Porque dentro de seis meses, mirando la bitácora, "el plan cambió de carta a opera el 17 de
julio" no le sirve a nadie. "…porque fue una cortesía acordada con el dueño" sí. El motivo es la
mitad del valor de auditar: sin él sabes qué pasó pero nunca por qué.
El backend lo exige también (mínimo 3 caracteres), así que no hay forma de saltárselo llamando la API directamente.
Qué pasa por debajo
El panel no escribe en la base de la vertical. Le pide a la vertical dueña que ejecute el cambio, y es esa vertical la que lo aplica y lo audita, en una sola transacción, con tu email como actor. Si el cambio se guarda, la fila de bitácora también; nunca uno sin el otro.
En Travel, además, la mutación pasa por las primitivas de su dominio de billing (las mismas que
usan cancel/pause/resume), no por un UPDATE directo. Es lo que evita que un cambio hecho
desde el panel se pelee con el dunning y termine mandándole un correo de cobro a quien no debe.
Si algo sale mal
| Lo que ves | Qué significa |
|---|---|
| «Escribe el motivo (mínimo 3 caracteres)» | El formulario aún no envió nada. |
| Un error con un mensaje de negocio concreto (ej. plan inexistente) | La vertical rechazó el cambio. El panel te muestra su razón tal cual; no es una caída. |
| «La vertical 'gastro' no está disponible» | La vertical se cayó o no responde. Tu cambio no se aplicó. Reintenta cuando vuelva. |
| «Demasiadas acciones seguidas. Espera un minuto.» | Rate limit (5/min). Es a propósito: esto no se hace en ráfaga. |
Verificarlo por fuera del panel
# Sustituye <token> por un JWT de operador (sale del login) y <id> por el del cliente
curl -s -H "Authorization: Bearer <token>" \
http://localhost:8012/api/v1/gastro/customers/<id>/audit-log | jq '.items[0]'