El editor de flujos
Se abre a pantalla completa desde el formulario del bot, con el botón Diseñar flujo o Editar flujo cuando el bot está en modo avanzado.
El lienzo ocupa toda la pantalla. A la izquierda hay una barra con dos botones:
- Nodos abre la paleta, con un buscador y las categorías plegadas. Los nodos se arrastran al lienzo y se conectan entre sí.
- Fuentes de datos abre tus documentos y APIs guardadas, para añadirlos al flujo.
Solo se ve un panel a la vez. Pulsa otra vez el botón activo para cerrarlo y dejar todo el espacio al lienzo.
En el lienzo cada nodo muestra solo su nombre, para que los flujos grandes no se amontonen. Pasa el ratón por encima de un nodo para ver su detalle. Los nodos que consumen tokens llevan un rayo, en el lienzo y en la paleta: IA / LLM y Extraer datos llaman al modelo en cada paso, y Buscar en catálogo gasta unos pocos para calcular la búsqueda por significado. Al hacer clic en un nodo, su configuración se abre en un panel a la derecha; Ampliar lo hace más ancho, y se cierra con la X, con Escape o haciendo clic en el lienzo.
El nodo de Inicio ya está puesto: es por donde entra toda conversación.
Los nodos, por categoría
Mensajes
| Nodo | Qué hace |
|---|---|
| Mensaje fijo | Envía un texto siempre igual |
| Enviar mensaje | Envía un mensaje a otro contacto que eliges (por ejemplo, un aviso a tu equipo), no a quien está escribiendo. Tiene dos salidas: Éxito y Error |
| Enviar imagen | Manda una imagen |
| Botones / CTA | Da opciones para pulsar en vez de escribir. WhatsApp admite hasta 20 caracteres por botón y 24 por fila de lista (un emoji cuenta como 2 o más): si uno se pasa, se pierde el mensaje entero, y el editor te lo marca como error |
| Plantilla Meta | Envía una plantilla de WhatsApp ya aprobada por Meta |
Inteligencia
| Nodo | Qué hace |
|---|---|
| IA / LLM | Deja que la inteligencia artificial lleve este tramo de la conversación |
| Buscar en catálogo | Busca productos y los usa para responder |
| Cargar texto | Trae contenido de una fuente de conocimiento |
| API externa | Llama a otro sistema tuyo |
| Extraer datos | Saca del mensaje los datos que le pidas y los guarda en variables |
Flujo
| Nodo | Qué hace |
|---|---|
| Condición | Bifurca según se cumpla algo o no |
| Switch | Bifurca en varios caminos según un valor |
| Por canal | Bifurca según venga de WhatsApp, Instagram, web... |
| Variable | Guarda un dato para usarlo más adelante |
| Esperar | Introduce una pausa de unos segundos |
| Esperar respuesta | Detiene el flujo hasta que la persona conteste y sigue desde ahí con su respuesta |
| Repetir por cada elemento | Repite un paso por cada elemento de una lista |
| Subflujo | Inserta un trozo reutilizable de la biblioteca de subflujos. Sus salidas son las que declare el subflujo |
| Pedir aprobación | Espera a que una persona del equipo apruebe una acción delicada |
| Consultar al mismo tiempo | Lanza varias ramas en paralelo |
| Juntar respuestas | Vuelve a unir esas ramas: espera a que terminen todas antes de seguir, aunque unas tarden más que otras |
Cada rama que sale de Consultar al mismo tiempo debe llegar a Juntar respuestas. Si una no llega, el editor te avisa: lo que haga esa rama no estará disponible cuando el flujo siga.
En Condición (tipo «la variable es igual a») y en Switch puedes leer un campo dentro del
resultado de una API con un punto: resultado.resultCount o poke.name, igual que en los textos
con {{resultado.resultCount}}.
Condición de tipo «respuesta afirmativa» sale por Sí cuando el mensaje contiene una de estas palabras completas: sí, ok, claro, bueno, bien, perfecto, gracias o yes. Da igual que lleven tilde o mayúsculas, pero tienen que ser la palabra entera: «necesito» o «casi» no cuentan como «si». Es una lista de palabras, no entiende el sentido: «no está bien» también sale por Sí.
Variable tiene un campo opcional, Asignar solo si coincide con, donde escribes una expresión
regular. Si el valor no coincide, la variable conserva lo que tenía. Sirve para recordar una elección
sin sumar otro Switch: con valor {{seleccion_id}} y ^svc:, la variable servicio solo cambia
cuando la persona toca una opción cuyo id empieza por svc:; un mensaje de texto o un botón con otro
id (por ejemplo tipo:INCENDIO) la dejan como estaba. No distingue mayúsculas.
Variable también puede agregar a una lista en vez de guardar un valor (campo Qué hacer).
Si el valor es solo una variable, como {{adjuntos}}, se suman sus elementos sin repetir. Así se
arma el expediente de archivos de una solicitud: {{adjuntos}} trae solo los archivos que llegaron
en el mensaje actual, y con un nodo Variable en modo «Agregar a la lista» cada foto o video que la
persona manda durante la solicitud queda en la lista. Para empezar una solicitud nueva, vacía la lista
con otro nodo Variable en modo «Guardar el valor» y valor vacío.
Con esa lista:
- Enviar mensaje tiene Adjuntar los archivos de la variable. Solo viajan los archivos de la lista que llegaron en esta conversación; cualquier otro se descarta. Por correo van como adjuntos, hasta 20 MB en total (lo que no cabe se nombra en el texto). Por WhatsApp sale un mensaje por archivo.
- API externa tiene Subir los archivos de la variable. Hace una petición por archivo, en
formulario (
multipart/form-data) con el campo que indiques (filepor defecto), y cada una con sus reintentos: si un archivo falla, los demás se suben igual. La variable de resultado queda con el total, los que se subieron, los que fallaron y el detalle de cada uno. El método tiene que ser POST, PUT o PATCH. Si la API necesita el id de algo que creaste antes, ponlo en la URL, por ejemplo…/emergency/{{registro.id}}/file.
En el nodo IA / LLM, APIs que puede consultar este agente limita las fuentes que ese agente ve con la herramienta de consultas. Vacío, ve todas las que habilitaste para el bot. Úsalo cuando tienes un agente por servicio, para que cada uno consulte solo las suyas.
Un registro que crea algo (una emergencia, un pedido) conviene dejarlo en 1 intento: si la API tarda, puede haberlo creado aunque no responda a tiempo, y reintentar lo duplicaría. La subida de archivos sí se puede reintentar.
En API externa puedes meter variables en la URL, por ejemplo
https://api.ejemplo.com/buscar?q={{last_message}}. Xenpia codifica lo que pongas en la ruta o en
los parámetros, así que una búsqueda con &, # o espacios llega entera. Escribe cada parámetro en
la URL (?q={{busqueda}}&limite=5): si una variable trae varios parámetros juntos, llegan como un
solo valor.
Para la fecha y hora del momento (hora de Ecuador) escribe {{now}} en cualquier texto, prompt,
variable, URL o cuerpo de una API. Solo, da el formato ISO (2026-09-24T10:05:09-05:00). Con un
formato detrás de los dos puntos, lo arma como pidas: {{now:dd/MM/yyyy HH:mm:ss}} da
24/09/2026 10:05:09 y {{now:yyyy-MM-dd}} da 2026-09-24. Entiende yyyy, yy, MM, dd,
HH (00 a 23), mm y ss; el resto se copia tal cual. Úsalo cuando una API exija la fecha en su
cuerpo, por ejemplo "date_time": "{{now:dd/MM/yyyy HH:mm:ss}}". Si quieres guardar la hora de un
momento concreto (por ejemplo, cuándo empezó un reporte), cópiala a una variable con Guardar
variable: {{now}} siempre da la hora en que corre cada paso.
Repetir por cada elemento toma una lista —por ejemplo las citas que devolvió una API— y repite
un paso por cada elemento. Ese paso recibe el elemento en la variable que elijas (item por
defecto), así que puedes escribir «Recordatorio de {{item.hora}}». Reglas:
- El paso que se repite debe terminar en Juntar respuestas. Si no, todo lo que venga detrás se repetiría también una vez por elemento; el editor te lo marca en rojo.
- La salida Lista vacía cubre el caso de que no haya nada que recorrer.
- Como mucho recorre 25 elementos por mensaje (puedes subirlo hasta 100).
- Lo que el paso guarde en una variable se pisa entre elementos: sirve para enviar o para llamar a una API, no para ir acumulando.
Operación
| Nodo | Qué hace |
|---|---|
| Derivar a humano | El bot se calla y la conversación queda esperando a una persona |
| Fin | Termina el flujo. Si activas Reiniciar la conversación, el próximo mensaje de esa persona vuelve a empezar desde Inicio |
En el nodo de IA / LLM puedes además desactivar herramientas concretas solo para ese paso, si quieres que ahí el bot no pueda, por ejemplo, agendar.
Ese mismo nodo puede trabajar en segundo plano: en vez de contestarle a la persona, guarda su resultado en una variable para que la usen los nodos siguientes (por ejemplo, un resumen o una clasificación). La persona no ve nada de lo que escribe, y el bot tampoco lo recuerda como algo que le haya dicho.
Qué pasa cuando llega un mensaje nuevo
Una conversación tiene muchos mensajes, pero el flujo no se recorre entero con cada uno. Por defecto, el bot continúa donde quedó:
- El primer mensaje recorre el flujo desde Inicio. Si ahí pusiste un saludo, se envía.
- Los siguientes van directo al último paso de IA que respondió. El saludo no se repite.
- Si la persona deja de escribir más de 24 horas, su próximo mensaje vuelve a empezar desde Inicio, como una conversación nueva.
Esto se cambia en el botón Ajustes de la barra superior del editor:
| Opción | Cuándo usarla |
|---|---|
| Continuar donde quedó | Lo normal: saludo, conversación con la IA y las ramas que necesites |
| Empezar siempre desde Inicio | Cuando el flujo clasifica cada mensaje justo después de Inicio (por ejemplo, una Condición que manda a un sitio u otro según lo que escriban) |
En el mismo sitio eliges tras cuántas horas sin mensajes se vuelve a empezar, entre 1 y 720.
Ajustes tiene una segunda pestaña, Mensajes rápidos: las respuestas que el agente humano tiene a mano cuando toma una conversación de este bot. No forman parte del flujo: se guardan al momento, no hace falta publicar y son las mismas de la pestaña Mensajes rápidos de la edición del bot. Ver Mensajes rápidos.
En modo Continuar donde quedó, esa condición solo se evalúa en el primer mensaje. El editor te lo marca con un aviso. Si necesitas que decida con cada mensaje, cambia a Empezar siempre desde Inicio.
Hay dos cosas más que hacen volver a Inicio: Derivar a humano y publicar una versión distinta del flujo. Si activas una versión con cambios en los nodos o en sus conexiones, las conversaciones en curso empiezan otra vez desde Inicio en su próximo mensaje. Mover nodos o renombrarlos no cuenta como cambio.
Los mensajes salen en cuanto están listos
El bot no espera a terminar todo el recorrido para contestar. Cada paso que envía algo (un saludo, una imagen, unos botones) lo manda en cuanto termina. Así, en WhatsApp, Instagram, Messenger y Telegram el saludo llega mientras la IA todavía está preparando su respuesta.
Preguntar y esperar la respuesta
Para pedir un dato concreto (un nombre, una cédula, una fecha) usa un Mensaje fijo con la pregunta, seguido de Esperar respuesta:
- En Guardar respuesta en la variable pon un nombre, por ejemplo
cedula. Después puedes usarla en cualquier texto como{{cedula}}. - Si quieres comprobar el formato, rellena Validar con expresión regular. Por ejemplo,
^\d{10}$exige 10 dígitos. El nodo pasa a tener dos salidas:- Válida: sigue el flujo.
- No válida: conéctala a un mensaje del tipo "Debe tener 10 dígitos" y, de ahí, de vuelta al mismo Esperar respuesta, para que la persona lo intente otra vez.
Extraer datos de lo que escribe la persona
El nodo Extraer datos lee el mensaje y devuelve los datos que le pidas, cada uno en su variable: cédula, fecha, motivo, lo que definas. No hace falta escribir expresiones regulares.
Por cada dato indicas el nombre de la variable, el tipo (texto, número, fecha, sí/no o una lista cerrada de opciones), una descripción corta —«cédula de 10 dígitos»— y si es obligatorio. La descripción es importante: es lo que la IA usa para saber qué buscar.
El nodo tiene dos salidas:
- Datos completos: encontró todos los obligatorios.
- Faltan datos: alguno no estaba. Lo normal es conectar esta salida a un mensaje que lo pida y a un «Esperar respuesta», para volver a intentarlo.
Lo que no aparezca en el mensaje se queda vacío: la IA tiene instrucciones de no inventarlo.
Frenar antes de algo delicado
El paso Pedir aprobación deja la acción pedida y espera el visto bueno de alguien del equipo. Mientras tanto el bot sigue atendiendo la conversación. Lo explica en detalle Aprobaciones.
Avisar a otra persona
El paso Enviar mensaje manda algo a un contacto de tu agenda que eliges tú, no a quien está escribiendo. Eliges el canal, la cuenta desde la que sale y el contacto, que se busca por nombre, correo o teléfono.
Al abrir el paso se ve siempre el nombre actual del contacto, aunque el flujo lo haya armado el asistente o se haya importado. Si el contacto ya no existe aparece Contacto no encontrado: elige otro antes de publicar.
Si el contacto no tiene cómo recibir por el canal elegido, el editor te avisa. Para Email basta con que su ficha tenga un correo.
Si un paso falla por algo pasajero
Los pasos que hablan con el exterior (IA, Extraer datos, API externa, catálogo, documentos) reintentan solos cuando el fallo parece pasajero, esperando un poco más en cada intento. En cada uno puedes ajustar Reintentos si falla: vacío deja el valor recomendado y 0 lo desactiva.
El nodo API externa nunca tumba la conversación: si al final no lo consigue, deja el error en su variable para que puedas ramificar con una Condición. Por defecto hace 3 intentos de hasta 15 segundos cada uno. Si la persona está esperando la respuesta, baja el tiempo de espera (unos 10 segundos) y deja un solo intento, para que una API caída no la haga esperar casi un minuto.
Elegir el modelo de un paso de IA
Por defecto, los pasos IA / LLM y Extraer datos usan el modelo del bot. En el panel de cada uno, Modelo de IA te deja elegir otro solo para ese paso, entre los de OpenAI, Anthropic (Claude) y Google (Gemini) que tenga activos la plataforma.
Sirve para pagar menos sin perder calidad: un modelo barato basta para clasificar o sacar una cédula de un mensaje, y uno más capaz solo hace falta en el paso que conversa. El consumo de cada paso se ve con su modelo en Métricas.
- Usar el modelo del bot deja el paso como estaba.
- Temperatura (0–1) solo aparece con un modelo propio: más baja da respuestas más estables. Los Claude más recientes la ignoran.
- Si un modelo se retira del catálogo, el panel lo avisa y el paso vuelve a usar el del bot: la conversación no se corta.
Patrones y plantillas
El botón Plantillas de la barra superior trae flujos ya montados que puedes usar como punto de partida. Ojo con el nombre: son plantillas de diseño de flujo, nada que ver con las plantillas de mensaje de WhatsApp.
Todas siguen la misma regla: después de preguntar algo al cliente hay un Esperar respuesta, y cada rama vuelve a esperar o termina en una IA. Así el bot no toma el "hola" como respuesta, no se despide después de cada mensaje y no deriva a una persona antes de que el cliente conteste.
Algunas plantillas traen un paso que necesita algo propio de tu cuenta, y el editor lo marca hasta que lo configures:
| Plantilla | Qué tienes que poner |
|---|---|
| Empresa multiárea | El documento de políticas de RRHH (en rojo hasta que lo elijas) |
| Catálogo Mercado Libre | Una fuente API con tu token de Mercado Libre: la búsqueda pública ya no responde sin él |
| Restaurante, Hotel, Omnicanal | Las fotos: traen una URL de ejemplo (tudominio.com…) y el editor avisa hasta que pongas la tuya |
El asistente de flujos puede cargar y simular esas plantillas, y guardarlas como borrador, pero no las activa mientras falte elegir el documento o la fuente API guardada, porque el bot respondería sin ese contenido.
Guardar y publicar
Aquí hay dos conceptos distintos que conviene no mezclar.
Al terminar de editar pulsas Aplicar flujo, que lleva el dibujo de vuelta al formulario del bot. Eso todavía no lo pone en producción: hay que guardar el bot.
Aparte está el botón Versiones, que abre el historial. Cada bot tiene una versión activa, que es la que atiende de verdad a los clientes. Desde ahí puedes:
- Guardar flujo actual como nueva versión, opcionalmente con un comentario que explique qué cambiaste. Muy recomendable ponerlo.
- Cargar en el editor una versión antigua para mirarla, sin activarla.
- Activar esta versión, que la pone en producción.
- Eliminar versión.
Guarda una versión con el flujo que funciona y ponle un comentario del tipo «funcionando, antes de rehacer el alta». Si el cambio sale mal, vuelves a esa versión en dos clics.
Asistente de flujos (Beta)
En la barra superior del editor hay un botón Asistente de flujos. Abre un panel de chat a la derecha del lienzo.
Puedes pedirle, en lenguaje natural, que cree o modifique el flujo: añadir nodos, conectar ramas, ajustar prompts de IA, desactivar tools de un nodo LLM, cargar una plantilla, validar el grafo o guardar/activar una versión. Los cambios se aplican al borrador del canvas; para ponerlos en producción sigue haciendo falta Aplicar flujo + guardar el bot, o pedirle explícitamente que guarde/active una versión.
Solo está disponible cuando el bot ya tiene id (bot guardado) y el interruptor Asistente de flujos está activo en Admin → Config. plataforma. Requiere la misma sesión con la que editas el agente.
Probar el flujo antes de publicarlo
Pídele «simula una conversación» (o «prueba el flujo con estos mensajes: …»). El asistente pasa tus mensajes por el borrador en seco: la IA contesta con un texto fijo, no se envía nada a nadie, no se llama a ninguna API y no gasta consumo de IA. Bajo su respuesta aparece la tarjeta Simulación con cada mensaje, los pasos por los que pasó y lo que habría recibido la persona. Pulsa un mensaje y el lienzo resalta su recorrido.
Así se ve rápido si el saludo sale una sola vez, si un «Esperar respuesta» recibe lo que debe o si una rama termina donde no toca. El asistente la usa por su cuenta antes de proponerte publicar.
Preguntarle por el uso real
También puede leer las métricas del bot: «¿qué paso falla más?», «¿dónde abandona la gente?», «¿mejoró desde la versión 3?». Responde con la tarjeta Métricas reales (pasos, cuántas conversaciones llegan, errores y tiempo p95) y un botón Ver en el lienzo que enciende la capa de métricas del editor.
Y si le das el id de una conversación, te dice dónde va el bot en ella (qué paso retomará, si espera una respuesta, qué datos guardó). Solo ve los nombres de los datos, nunca lo que escribió la persona. Reiniciarla sigue siendo cosa tuya, desde Estado del bot en la conversación.