Configuración
Horarios y festivos
Cómo configurar horarios de atención, festivos y reglas temporales en SIVO. Desde el caso básico hasta multi-zona horaria con excepciones.
Los horarios en SIVO controlan qué pasa con las llamadas según la fecha y la hora. Permiten responder algunas preguntas que tu cliente final siempre te va a hacer:
- “¿Está abierto ahora vuestro centro de atención?”
- “¿Si llamo el 25 de diciembre, qué pasa?”
- “¿Y si llamo a las 2 de la madrugada?”
SIVO los gestiona en dos niveles: a nivel DID (puerta rápida) y a nivel IVR (granular).
Conceptos clave
Schedule
Un schedule es un objeto que define:
- Nombre (ej.
Oficina Madrid,Soporte 24×7,Comercial L-V). - Zona horaria (en formato IANA:
Europe/Madrid,America/New_York). - Horas por día de la semana (apertura y cierre).
- Festivos (fechas concretas que se tratan como cerrado).
- Excepciones puntuales (cerrados extra o aperturas especiales).
Es independiente de cualquier llamada — lo creas una vez y lo reutilizas.
DID-level schedule
Cada DID (número entrante) puede tener:
schedule_id— qué horario evaluar.out_of_hours_ivr_flow_id— qué IVR ejecutar cuando está fuera de horario.
Es la puerta rápida: la llamada entra, SIVO mira el reloj, decide IVR normal o IVR alternativo. Sin pasar por el flow principal.
IVR-level schedule
Dentro de cualquier IVR, el nodo condition con tipo schedule permite ramificar en cualquier punto:
[start] → [play bienvenida] → [condition: ¿en horario laboral?]
├─ sí → [menu principal]
└─ no → [hangup con audio "estamos cerrados"]
Es granular: puedes tener múltiples checks de horario en el mismo flujo (ej. “primero verifica horario oficina, luego dentro del menú comercial verifica horario reducido”).
Crear tu primer horario
Paso a paso
- Settings → Schedules → + Nuevo horario.
- Rellena:
- Nombre:
Oficina principal. - Zona horaria: empieza a escribir
Europe/Madrid(autocomplete). - Horas por día en formato JSON o vía el UI calendario.
- Festivos como array de fechas (
YYYY-MM-DD).
- Nombre:
- Guarda.
Formato de horas
JSON con clave por día (mon, tue, wed, thu, fri, sat, sun):
{
"mon": { "open": "09:00", "close": "18:00" },
"tue": { "open": "09:00", "close": "18:00" },
"wed": { "open": "09:00", "close": "18:00" },
"thu": { "open": "09:00", "close": "18:00" },
"fri": { "open": "09:00", "close": "15:00" },
"sat": null,
"sun": null
}
-
nullo ausencia del día = cerrado todo el día. -
Para partir el día (ej. 09-14 y 16-20), usa array:
"mon": [ { "open": "09:00", "close": "14:00" }, { "open": "16:00", "close": "20:00" } ] -
Para 24h continuas:
{ "open": "00:00", "close": "23:59" }.
Festivos
Array de fechas en formato YYYY-MM-DD:
[
"2026-01-01",
"2026-01-06",
"2026-04-03",
"2026-04-04",
"2026-05-01",
"2026-12-25",
"2026-12-26"
]
Si la fecha cae en festivo, el schedule lo trata como cerrado todo el día, ignorando el día de la semana.
Excepciones puntuales
Para casos especiales (cerramos un viernes por puente, abrimos un sábado de campaña):
"exceptions": [
{ "date": "2026-04-30", "closed": true, "reason": "Puente del 1 de mayo" },
{ "date": "2026-11-29", "open": "09:00", "close": "21:00", "reason": "Black Friday" }
]
Las excepciones anulan lo que diría el schedule normal para ese día.
Asignar horario a un DID
- Settings → DIDs → tu número → Schedule.
- Selecciona el schedule creado.
- Out-of-hours IVR: selecciona el IVR a ejecutar si está fuera de horario.
- Guarda.
A partir de ese momento, cada llamada entrante:
- Si está en horario → ejecuta el IVR normal.
- Si está fuera → ejecuta el IVR alternativo (típicamente con mensaje “estamos cerrados, vuelva el lunes a las 9”).
Patrón típico: IVR de “cerrado”
Crea un IVR simple para fuera de horario:
[start] → [play "Gracias por llamar. Nuestro horario es de lunes a viernes,
de 9 a 18. Si tu consulta es urgente, deja un mensaje al final"]
→ [voicemail mailbox="[email protected]"]
→ [hangup]
Asígnalo como out_of_hours_ivr_flow_id en todos tus DIDs y los caller saben qué esperar.
Horario granular dentro del IVR
Cuando necesitas lógica más sofisticada que “horario o no”, usa el nodo condition.schedule dentro del IVR:
[start]
↓
[menu "Pulse 1 ventas, 2 soporte, 3 facturación"]
├─ 1 → [condition.schedule "Comercial L-V 9-18"]
│ ├─ true → [queue ventas]
│ └─ false → [play "Ventas atiende L-V de 9 a 18"] → [hangup]
├─ 2 → [queue soporte] (soporte es 24×7)
└─ 3 → [condition.schedule "Facturación L-J 10-14"]
├─ true → [queue facturacion]
└─ false → [voicemail mailbox="facturacion"]
Puedes tener múltiples schedules distintos por departamento. Útil cuando ventas, soporte y facturación tienen horarios distintos.
Multi-zona horaria
Para empresas con presencia internacional, crea un schedule por región:
| Schedule | Zona | Horario |
|---|---|---|
Oficina Madrid | Europe/Madrid | L-V 09-18 |
Oficina NYC | America/New_York | M-F 09-18 |
Oficina Singapur | Asia/Singapore | M-F 09-18 |
Y asígnalos a sus DIDs correspondientes. SIVO evalúa cada uno en su zona horaria local, no en UTC. Cuando son las 14:00 en Madrid, son las 08:00 en NYC.
Variable global ahora
Dentro del IVR puedes acceder a {{now}} (timestamp UTC actual). Útil para condiciones más complejas que no quepan en un schedule:
[condition: {{now}} > 2026-01-01 AND {{now}} < 2026-01-08]
↓ true → [play "Campaña de Reyes: regalo si pides hoy"]
Casos especiales
Cambio de horario de verano / invierno
SIVO usa zonas horarias IANA, que llevan los cambios DST internamente. Cuando España pasa de UTC+1 a UTC+2 en marzo, el schedule sigue diciendo “09:00 a 18:00” en hora local y SIVO se encarga del ajuste.
No tienes que hacer nada. Ni en marzo ni en octubre.
Horarios que cruzan medianoche
Algunos negocios (bares, soporte nocturno) abren a las 20:00 y cierran a las 03:00 del día siguiente. Configúralo así:
"fri": { "open": "20:00", "close": "23:59" },
"sat": [
{ "open": "00:00", "close": "03:00" },
{ "open": "20:00", "close": "23:59" }
]
El schedule trata cada día como un bucket independiente, así que reparte el horario en dos slots.
Cierre temporal extraordinario
Si necesitas cerrar de repente (incidente, formación, evento), tienes dos opciones:
Opción A — Excepción puntual: edita el schedule y añade una excepción para hoy con closed: true.
Opción B — DID override temporal: desde el detalle del DID, marca “Override schedule” y elige otro IVR. Vuelves al normal cuando termine el evento. No tienes que tocar el schedule.
La opción B es más rápida y no afecta a otros DIDs que comparten schedule.
Probar el horario con el simulador
Antes de activar, siempre prueba con el simulador del IVR:
- Abre el IVR designer.
- Pulsa Simular.
- En el panel del simulador hay un Clock override — puedes forzar la hora a cualquier momento.
- Prueba: lunes 09:00, viernes 16:00 (en horario reducido), sábado, 25 de diciembre…
- El simulador resalta qué nodo se ejecuta y qué rama del schedule se toma.
Sin esto, los bugs de horario solo se ven en producción cuando un cliente llama un domingo y oye el mensaje de comercial.
API de schedules
Para gestión programática:
GET /api/schedules
POST /api/schedules
GET /api/schedules/{id}
PUT /api/schedules/{id}
DELETE /api/schedules/{id}
Útil para sincronizar desde tu sistema interno de RRHH (que ya tiene los festivos y horarios oficiales de cada oficina). Por ejemplo, un cron job semanal que actualiza los festivos del año desde tu BD.
Reportes
En el wallboard del supervisor verás un indicador si alguna cola está cerrada según su schedule asignado. Útil para que el supervisor no se pregunte por qué un agente está disponible pero no entran llamadas — es porque los DIDs están en out-of-hours.
Buenas prácticas
- Un schedule por departamento u oficina, no uno por DID. Reutiliza.
- Nombra los schedules descriptivamente:
Soporte L-V 9-18mejor queSchedule 1. - Mantén festivos actualizados a principio de año — programa una tarea recurrente cada enero.
- Prueba siempre con el simulador antes de publicar.
- Out-of-hours IVR con voicemail — no dejes que el caller cuelgue sin opción de dejar mensaje. Pierdes ventas.
- Multi-zona: nombra el schedule con la zona (
Oficina MadridvsOficina NYC) para evitar confusiones. - Excepciones puntuales mejor que editar el schedule: si cierras solo el 30 de abril por puente, usa excepción. No cambies el
fri.closegeneral. - Auditoría: cualquier cambio en schedules queda en
audit_logs. Revisa quién cambió qué si las llamadas empiezan a colgarse por horario inesperado.