La mayoría de las plataformas de chatbot te obligan a elegir entre dos opciones malas. O arrastras cajas por un lienzo y acabas con un árbol de decisión glorificado que no puede hablar con tus sistemas, o abres un editor de código, aprendes otro dialecto YAML más y pasas una semana cableando algo que nadie del equipo es capaz de editar. El constructor de flujos de Svyazio es visual, pero tiene una vía de escape para cada requisito serio: inputs validados, condiciones con bifurcación, webhooks HTTP reales con mapeo de respuestas, variables que se mantienen durante toda la sesión y traspaso a un humano de verdad en cuanto el bot llega a su límite.

El mismo flujo corre en todos los canales que soporta Svyazio — el widget web, los bots de Telegram, las comunidades de VK y MAX. Los teclados inline se renderizan de forma nativa en cada plataforma. En canales sin soporte de teclado, los botones se convierten en opciones numeradas en texto para que el visitante pueda responder con "1" o "2". Construyes el flujo una vez; el motor se encarga de hablar el idioma de cada canal.

Por qué un constructor visual gana al código y a los árboles de decisión

El argumento a favor de un constructor visual no es solo "los que no programan pueden editarlo". Las ventajas reales son más sutiles:

Los flujos se leen como diagramas. Cualquiera de tu equipo — el responsable de soporte, el product manager, el director de marketing — puede abrir el editor y entender lo que hace el bot en treinta segundos. Las definiciones de bot basadas en código exigen lectura. Los flujos visuales se perciben como formas. Eso, por sí solo, reduce los ciclos de revisión de días a minutos.

Los casos límite tienen un sitio. Un árbol de decisión clásico se cae con tráfico real porque cualquier flujo interesante tiene bucles, reintentos, timeouts y handoffs. Svyazio te permite cablear todo eso de forma explícita — un webhook que falla se enruta a una rama error, un input ausente dispara un reintento, un timeout de sesión abre la bandeja para un humano. Todo visible, todo asociado a nodos concretos.

Las variables hacen que el bot tenga estado. Cada nodo input escribe en una variable. Cada webhook puede mapear partes de su respuesta a variables. Cada nodo posterior puede interpolarlas en sus mensajes — Hola {{name}}, tu pedido {{order_id}} se envía mañana. El bot recuerda cosas en lugar de empezar desde cero en cada paso.

Canales donde un solo flujo funciona

Widget web
Todos los planes
Telegram
Plan Pro
VK
Plan Pro, región RU
MAX
Plan Pro, región RU

El widget web habla Socket.IO. Telegram y MAX aceptan teclados inline. VK tiene su propio formato de teclado. El motor de chatbot traduce cada nodo al transporte adecuado: el nodo buttons se convierte en un inline_keyboard en Telegram, en un payload keyboard en VK y en eventos Socket.IO en el widget. En el editor ves siempre el mismo flujo.

Anatomía de un flujo

Cada flujo arranca con un único nodo start. A partir de ahí, encadenas nodos arrastrando conexiones entre ellos. Cada nodo tiene 0 o 1 aristas entrantes y 1 o más aristas salientes. Los nodos pueden hacer bucles, bifurcarse y converger — el motor sigue las aristas paso a paso.

Constructor de chatbots de Svyazio: configuración del nodo buttons con tres opciones (Pedidos, Soporte, Preguntas)

El constructor mostrando un nodo buttons en edición. Panel izquierdo: paleta de nodos. Lienzo: el flujo. Panel derecho: propiedades del nodo seleccionado.

El panel izquierdo lista todos los tipos de nodo disponibles. El lienzo es donde vive el flujo. El panel derecho muestra las propiedades del nodo que esté seleccionado. Los cambios se guardan al pulsar Guardar; entran en producción al pulsar Publicar. Los borradores y las versiones publicadas son independientes, así que puedes iterar sin romper el bot que está en producción.

1. Nodo message

message

Envía texto plano desde el bot. Soporta interpolación de variables con la sintaxis {{variable_name}}. Tiene un delay antes de enviar opcional en milisegundos — útil para evitar el efecto "muro de texto instantáneo" que hace que los bots parezcan robóticos.

Un uso típico: un mensaje de bienvenida con el nombre del visitante extraído del perfil del widget, seguido de una pequeña pausa antes de la siguiente pregunta. El delay está acotado para evitar accidentes: de 0 a 10 segundos, controlado en el servidor.

2. Nodo buttons

buttons

Un mensaje + teclado inline. Cada botón tiene una etiqueta y su propia arista saliente. Cuando el visitante toca un botón, el motor sigue la arista correspondiente. La sesión queda en pausa entre el envío de los botones y la recepción del clic.

En los botones es donde, en realidad, vive la mayor parte de tu lógica de bifurcación. Un menú de tres botones ("Pedidos / Soporte / Preguntas") genera tres caminos de salida distintos — cada uno puede llevar a su propio sub-flujo con una lógica completamente diferente. El motor espera el clic, respeta los rate limits (30 eventos por minuto y por sesión) y, en Telegram/MAX, elimina el teclado inline tras el clic para que el visitante no pueda pulsar dos veces.

Fallback elegante en canales sin teclados inline. En Avito, el motor envía una lista numerada en texto en su lugar ("1. Pedidos  2. Soporte  3. Preguntas"). El visitante responde con el número. El bot lo trata como el clic equivalente. No tienes que escribir nada de esa lógica de fallback; el dispatcher se encarga.

3. Nodo input (con validación)

input

Pide texto libre y lo guarda en una variable. Validación incorporada para text, email y phone. Si el input no es válido, el bot vuelve a preguntar sin avanzar. Si es válido, la respuesta se guarda en session.variables[name] y el flujo continúa.

Constructor de chatbots de Svyazio: nodo input configurado para recoger un email con validación

Nodo input configurado para capturar un email. La variable se llama email, el tipo de validación es Email y el placeholder sugiere el formato esperado.

La validación es estricta pero útil: el chequeo de email rechaza direcciones obviamente malformadas, el de teléfono acepta formatos internacionales y los normaliza, y el de texto simplemente exige una respuesta no vacía. El nodo retiene la sesión hasta que el visitante envía algo que pasa la validación. Si no llega nada dentro del timeout de sesión, el bot transfiere a un humano en lugar de quedarse en bucle para siempre.

Las variables capturadas aquí quedan disponibles para todos los nodos posteriores. Un mensaje posterior puede saludar al visitante por su nombre, un webhook posterior puede incluir su email en el payload y el nodo de acción final puede actualizar su campo de perfil para que sus respuestas perduren más allá de esta conversación.

4. Nodo condition

condition

Bifurca según variables o campos del visitante. Cada rama es un conjunto de condiciones AND. El motor las evalúa de arriba abajo; gana la primera que coincide. Si no coincide ninguna, el flujo cae a la rama por defecto.

Las condiciones son la forma de convertir datos en control de flujo. ¿El visitante escribió "cancelar" durante el paso de input? Enrútalo al flujo de cancelación. ¿Su perfil está marcado como cliente recurrente? Sáltate la introducción. ¿El webhook respondió con status = "vip"? Salta a la cola prioritaria. Tienes todos los operadores de comparación que cabe esperar: igual, distinto, contiene, empieza por, mayor/menor numérico, true/false booleano y regex para los casos en los que nada más encaja.

5. Nodo action (handoff, variables, perfil)

action

Efectos secundarios sin interacción del usuario. Cinco subtipos: assign_department, assign_agent, close, set_variable y set_visitor_field. Los tres primeros terminan la sesión del bot — son el mecanismo de handoff.

Constructor de chatbots de Svyazio: nodo action escribiendo el email recogido en el campo de perfil del visitante

Nodo action escribiendo el email recogido en el perfil del visitante, para que los agentes lo vean sin tener que volver a preguntarlo.

Las acciones de handoff son críticas. El trabajo de un bot suele ser calificar, recoger información y enrutar — no reemplazar al agente. assign_department deposita la conversación en la cola adecuada (Ventas, Soporte, Facturación), assign_agent la asigna a una persona concreta y close marca la conversación como resuelta cuando el bot termina por sí solo (consulta de estado de envío, pregunta de FAQ resuelta, etc.). El visitante nunca percibe esto como eventos separados — la conversación simplemente continúa con un humano sin saltos.

set_visitor_field es más discreto, pero igual de útil. Escribe en el perfil persistente del visitante. El email que el bot recogió pasa a ser su email de perfil. El teléfono pasa a ser su teléfono. La próxima vez que vuelva — desde cualquier canal — los datos ya están ahí.

6. Nodo delay

delay

Pausa el flujo durante una duración fija. Útil entre mensajes consecutivos para evitar el típico "el bot escribió tres párrafos en 200 ms". Acotado entre 0 y 10 segundos.

Los delays son la diferencia entre un bot que parece un atajo de teclado y uno que parece una conversación. 300–800 ms entre mensajes cortos suele ser suficiente. Delays más largos (2–3 segundos) funcionan bien antes de un mensaje que reconoce un trabajo en curso — "un momento, estoy comprobando tu pedido" — especialmente combinado con una llamada webhook en marcha.

7. Nodo webhook (HTTP a cualquier API)

webhook

La vía de escape para la lógica seria. Llama a cualquier URL HTTPS con un método, cabeceras opcionales, body opcional y un timeout. La respuesta se puede mapear a variables de sesión; el flujo después bifurca según éxito o error.

Este es el nodo que convierte Svyazio de un juguete chatbot en una plataforma de integración. Buscar un pedido en tu backend, consultar tu CRM, llamar a un servicio de puntos de fidelización, invocar un endpoint de completion de GPT — todo lo que HTTP puede hacer, el nodo webhook lo puede hacer. La URL, las cabeceras y el body soportan interpolación de variables, así que cada llamada es contextual a la sesión actual.

Una configuración típica:

{ "url": "https://api.your-crm.com/customers/{{email}}", "method": "GET", "headers": { "Authorization": "Bearer sk_live_xxx" }, "timeoutMs": 5000, "responseMapping": { "customer_name": "data.full_name", "customer_tier": "data.tier", "order_count": "data.stats.orders" } }

Después de que se ejecute este nodo, {{customer_name}}, {{customer_tier}} y {{order_count}} quedan disponibles para todos los nodos posteriores. El siguiente paso suele ser un nodo condition que bifurca por customer_tier == "vip".

Medidas de seguridad. Cada llamada webhook pasa por un guardia anti-SSRF que bloquea localhost, los rangos de IP privadas (10.x, 172.16/12, 192.168.x, 169.254.x) y las direcciones loopback/link-local de IPv6. Las URL no HTTPS se rechazan. Las respuestas mayores de 256 KB se descartan (y se toma la rama error). El timeout máximo es de 15 segundos, tras los cuales la petición se aborta. No tienes que pensar en nada de esto; viene activado por defecto.

El nodo webhook tiene dos aristas salientes: success (HTTP 2xx) y error (4xx/5xx, timeout, bloqueo SSRF, respuesta malformada). Si solo cableas la rama de éxito, los fallos caen a la arista por defecto — así nada se queda colgado en silencio.

Variables y sintaxis de plantillas

Las variables son el pegamento. Cada nodo input, cada mapeo de respuesta de webhook y cada acción set_variable escriben en session.variables. Cada message, cada buttons y cada URL/body de webhook puede leer de ahí mediante interpolación {{variable}}. La notación con punto también funciona: si un webhook mapea order al objeto de respuesta completo, después puedes referenciar {{order.tracking_number}}.

Límites estrictos para mantener las sesiones bajo control:

No vas a tocar estos límites con un flujo normal. Existen para protegerte del caso patológico de un bucle desbocado escribiendo en variables hasta que se agote la memoria.

Tres flujos reales que puedes copiar

Ejemplo 1: bot de calificación de leads para un SaaS

Objetivo: hacer tres preguntas, puntuar el lead, enrutar los leads calientes a Ventas y los fríos al flujo de onboarding.

  1. StartMessage ("¡Hola! Una pregunta rápida: ¿qué te trae por aquí?")
  2. Buttons (Precios / Integraciones / Solo mirando) → guarda la elección en intent
  3. Input (email, type = email) → guarda en email
  4. Input (tamaño de empresa: solo / 2-10 / 11-50 / 50+) → guarda en size
  5. Condition: intent == "Precios" AND size != "solo" → va a la rama "lead caliente"
  6. Action: assign_department(Ventas) en la rama de lead caliente
  7. Message en la rama fría ("¡Gracias! Aquí tienes un recorrido que te puede interesar: [enlace]")
  8. Action: close tras el mensaje de la rama fría

Tiempo total de construcción: ~10 minutos. Sin código. Funciona en el widget web y en Telegram exactamente igual.

Ejemplo 2: consulta de estado de pedido para e-commerce

Objetivo: el visitante pregunta por el estado de un pedido, el bot lo consulta en el backend de la tienda, devuelve la información de tracking y ofrece un handoff si algo va mal.

  1. Input (número de pedido, type = text) → order_id
  2. Input (email del pedido, type = email) → email
  3. Delay (1500 ms) + Message ("Lo estoy comprobando...")
  4. WebhookGET https://shop-api.example/orders/{{order_id}}?email={{email}}, mapea status y tracking_url
  5. En success: Message ("Tu pedido está {{status}}. Tracking: {{tracking_url}}") → Buttons ("Todo bien, gracias" / "Algo no cuadra")
  6. En "Todo bien": Action: close
  7. En "Algo no cuadra" O en error del webhook: Action: assign_department(Soporte)

Ejemplo 3: bot nocturno que transfiere cuando los operadores están conectados

Objetivo: ejecutarse solo cuando todos los agentes están desconectados, recoger lo esencial y dejar un ticket en Telegram para el turno de la mañana.

Se dispara con la condición operators_offline = offline en el trigger del widget (no es un nodo del flujo — esto se configura en los ajustes de cuándo ejecutar del bot). El bot en sí es un flujo simple:

  1. Start → Message ("Ahora mismo estamos desconectados, pero te respondemos por la mañana.")
  2. Input (email) → Input (¿cuál es tu pregunta?)
  3. Action: set_visitor_field(email) + set_visitor_field(phone si se ha recogido)
  4. Webhook → POST a un webhook de canal de Telegram con el resumen, para que el turno de la mañana lo vea nada más empezar
  5. Action: close

Transferencia a humano y control de sesión

Los agentes siempre tienen la última palabra. En cualquier punto del panel, cuando hay una sesión de chatbot activa en una conversación, aparece un banner: "El bot X está gestionando esta conversación" con un botón Detener bot. Un clic y el bot termina — la sesión pasa a HANDED_OFF, los teclados inline pendientes se eliminan de Telegram/MAX y la conversación queda marcada como pendiente de atención. El agente toma el relevo desde ahí.

Esto no es solo un botón de pánico. Es el principal punto de integración entre los bots y los humanos. Los bots se encargan de lo rutinario; los agentes intervienen cuando la cosa se pone interesante. Las variables que el bot recogió son visibles para el agente, así que no empieza desde cero.

En el lado del motor, hay varias redes de seguridad funcionando en segundo plano:

Precio y límites

Los chatbots son una característica del plan Pro. El plan también incluye el asistente de escritura con IA, triggers y mensajes automáticos, departamentos, analítica, agentes ilimitados, white-label y 10 bots de Telegram. Ambos planes de pago incluyen una prueba gratuita de 7 días, sin tarjeta de crédito.

Echa un vistazo a la página completa de precios o ve directamente a crear una cuenta.

Preguntas frecuentes

¿Necesito programar para construir un chatbot?
No. El constructor es totalmente visual — arrastras nodos, los conectas y rellenas campos de texto. El único nodo donde ayuda pensar como en código es el webhook, y ahí solo pegas una URL y mapeas paths de JSON. Si sabes escribir una fórmula de hoja de cálculo, sabes escribir un mapeo de respuesta de webhook.
¿Un mismo flujo funciona de verdad tanto en web como en Telegram?
Sí. El motor del chatbot es agnóstico al canal. Un dispatcher traduce cada nodo al transporte adecuado — eventos Socket.IO para el widget, payloads inline_keyboard para Telegram, JSON keyboard para VK, attachment inline_keyboards para MAX. En el editor ves el mismo flujo independientemente de dónde se vaya a ejecutar.
¿Puedo llamar a mi propia API desde un chatbot?
Sí, mediante el nodo webhook. Solo HTTPS. La llamada se ejecuta con un timeout configurable (1–15 segundos), protecciones SSRF contra redes privadas y un tope de respuesta de 256 KB. Mapea cualquier campo del JSON de respuesta a variables de sesión y bifurca por éxito/error.
¿Qué pasa si el visitante se queda en silencio a mitad del flujo?
La sesión tiene un timeout configurable. Cuando salta, la sesión pasa a TIMED_OUT, la conversación queda marcada como pendiente de atención y los agentes pueden retomarla desde el panel. Nada se abandona en silencio.
¿Cómo detengo el bot cuando un agente quiere tomar el control?
Cada panel de conversación con un bot activo muestra un botón "Detener bot". Un clic elimina los teclados inline pendientes en Telegram/MAX, termina la sesión y marca la conversación para el agente. Todas las variables recogidas siguen visibles en el perfil del visitante.
¿Puedo versionar mis flujos?
Los borradores y las versiones publicadas están separados. Puedes iterar en un borrador sin afectar al bot en producción y publicar cuando estés listo. La versión publicada se ejecuta para las sesiones nuevas; las sesiones en curso continúan en la versión con la que arrancaron.
¿Hay analítica del rendimiento del flujo?
Sí. Cada sesión registra los nodos por los que pasa. La vista de analítica muestra, por nodo: cuántas sesiones únicas lo han alcanzado, drop-off tipo embudo, duración media de sesión y desglose por estado final (completada, transferida, expirada). Úsalo para encontrar callejones sin salida y afinar los flujos.

Construye tu primer flujo hoy

7 días de Pro por nuestra cuenta. Sin tarjeta. Constructor de chatbots completo, en todos los canales.

Empezar prueba Pro de 7 días

Sigue leyendo

Live chat vs chatbot: cuándo gana cada uno Soporte en Telegram: guía completa Conecta Telegram en 2 minutos