¿Te imaginas contar con un asistente virtual que pueda atender automáticamente los pedidos de tu negocio y responder preguntas frecuentes de tus clientes a través de una llamada?
Todo esto es posible combinando herramientas como ElevenLabs, n8n y Twilio.
En este artículo, te mostrare paso a paso cómo construir un flujo automatizado que conecta estas tecnologías para crear un asistente virtual, capaz de hablar con tus clientes.
Antes de comenzar asegúrate de cumplir los siguientes requerimientos:
Una vez creado el agente se desplegara una vista donde podrás realizar la configuración del mismo. Como primer parámetro deberás modificar el lenguaje del agente.
Además, en las opciones del Agent podrás encontrar un campo correspondiente al primer mensaje “first message” que el agente enviará al recibir una llamada. También, verás un campo llamado “system prompt”, el cual define el comportamiento general del agente.
Puedes copiar y pegar el siguiente “system prompt” y “first message”, y ajustarlo según tu caso de uso. En este tutorial, el objetivo es definir un agente especializado en la toma de pedidos para un restaurante ficticio llamado “Las Delicias”.
First Message:
Hola, soy María del restaurante Las Delicias. ¿En qué puedo ayudarte?
System Prompt:
# Personalidad Eres María, una agente muy amable, cordial y enfocada en brindar una excelente atención. Tu función principal es recibir los pedidos para el restaurante "Las Delicias" de manera clara, profesional y eficaz. # Herramientas disponibles - info-restaurante: esta herramienta permite saber si el restaurante está abierto o cerrado en tiempo real. También permite consultar el listado de productos disponibles, como hamburguesas, salchipapas y bebidas. y retorna el día actual de la semana. # Flujo de conversación 1. Saludar cordialmente al cliente y **preguntar su nombre y apellido** antes de iniciar el pedido. 2. Verificar el estado del restaurante utilizando info-restaurante. - Si está cerrado, despedirse amablemente y finalizar la conversación sin tomar pedidos. - Si está abierto, continuar con la toma del pedido. 3. Ofrecer los productos disponibles al cliente. 4. Recibir los productos que el cliente desea. - Validar que los productos existan. - Si el cliente menciona un producto no disponible, informar con amabilidad y sugerir alternativas similares dentro de la misma categoría. 5. Confirmar únicamente **los nombres de los productos y sus cantidades**, sin entrar en detalles por producto a menos que el cliente lo solicite. 6. Preguntar la dirección de entrega y el método de pago. 7. Calcular y **mencionar el valor total del pedido al finalizar**, sumando el costo total de todos los productos solicitados. 8. Agradecer al cliente por su pedido, confirmar que fue registrado correctamente y despedirse de manera amable. # Reglas adicionales - Mantén un tono cordial, claro y profesional en todo momento. - No describas ingredientes ni detalles de cada producto, a menos que el cliente lo pida. - Siempre asegúrate de que el cliente sepa el valor total del pedido antes de finalizar. - Si el cliente no menciona un dato necesario (por ejemplo, dirección), pídeselo con amabilidad antes de cerrar el pedido.
Adicionalmente en la opción Voice puedes seleccionar la voz del agente, selecciona la que más te guste:
Gran parte del registro y la consulta de información de nuestro sistema estará gestionada mediante la plataforma de Google Sheets. Para ello, creamos una nueva hoja de cálculo en la que incluiremos tres pestañas:
Información
Agregamos tres columnas:
Productos
Agregamos 5 Columnas y registramos 5 productos de Ejemplo:
Pedidos
Para esta seccción solo agregamos las columnas:
En ElevenLabs podemos integrar herramientas externas a nuestros agentes mediante Webhooks. La idea es definir un flujo en n8n que funcione como una herramienta externa para nuestro agente de voz. En este caso, n8n actúa como un puente entre la información dinámica registrada en Google Sheets y nuestro agente de voz.
Lo primero que debes realizar es la creación de un nuevo workflow desde el dashboard de n8n. Una vez creado el flujo debes agregar un nuevo nodo de tipo Webhook y llamarlo Información General.
Webhook: es un mecanismo que nos permite enviar notificaciones en tiempo real desde ElevenLabs a n8n.
Para poder probar este tipo de flujo, debemos hacer clic en el nodo “Información General”, copiar la Test URL y realizar una petición GET desde Postman o cualquier cliente de tu preferencia. En esta caso estaré usando Insomnia.
Si ejecutamos el flujo y realizamos una petición a Test URL obtendremos la siguiente información en Insomnia, lo que confirma que hemos configurado correctamente el Webhook.
También debemos agregar dos nodos de tipo “Google Sheets” con la operación “Get Rows” y conectarlos a nuestro Webhook. Estos nodos estarán orientados a extraer la información de la hoja de cálculo que creamos previamente en Google Sheets.
Comenzamos agregando el primer nodo, llamado “General Info”, que traerá la información general de la primer pestaña de nuestra hoja (Información).
La primera vez que agregamos un nodo de tipo ‘Google Sheets’, debemos configurar las credenciales. Para ello, seleccionamos:
Si la cuenta se conectó correctamente obtendremos el siguiente mensaje:
Luego de que configuramos las credenciales, podemos terminar de agregar los parámetros de este primer nodo “General Info”:
Repetimos el mismo paso anterior, conectando un segundo nodo del mismo tipo, llamado “Lista de productos”, al Webhook, pero esta vez con los siguientes parámetros:
Una vez hemos agregado estos dos nodos, debería verse así nuestro flujo:
A continuación, vamos a realizar los siguientes pasos para finalizar este flujo, el cual permite obtener la información general de la tienda, así como los productos disponibles.
Paso 1:
Conectamos a cada nodo de tipo “Google Sheets” un nodo de tipo “Code”. A cada uno de estos nuevos nodos los llamaremos “Code Información” y “Code Productos”, respectivamente. Estos nodos serán los encargados de procesar la información proveniente de la hoja de cálculo.
Code Información:
const adress = $input.first().json["Dirrección"]; const available = $input.first().json.Disponibilidad; const schedule = $input.first().json['Horatio de atención'] return [{ json: { "información": { "disponibilidad": available, "direccion": adress, "horario": schedule, "hoy": $today.weekdayLong } } }];
Como podemos ver, esta parte de código estará encargada de extraer la información proveniente de cada columna de la hoja **“Información” **y la estructura en un formato JSON para su procesamiento.
Code Productos:
Aquí se extraerán los productos de las filas de la hoja “Productos” y se exportarán en formato JSON:
const inputs = $input.all(); const productos = inputs.map(item => ({ categoria: item.json["Categoría"], nombre: item.json["Producto"], descripcion: item.json["Descripción"], precio: item.json["Precio"], disponible: item.json["Disponibilidad"] })); return [{ json: { productos } }];
Al finalizar el paso 1 usted debería tener algo como:
Paso 2:
Ahora la información general de la tienda se encuentra en dos nodos diferentes. Para solucionar este tipo de problemas n8n dispone de un nodo de tipo Merge el cual recibe dos entradas y las combina. Conectamos las dos entradas de Google Sheets y configuramos el nodo “Merge” con los siguientes parámetros:
Al finalizar este paso usted debería tener algo como:
Paso 3:
Una vez hemos completado todo el flujo de procesamiento de información podemos pasar a retornarla, para ello agregamos un nuevo nodo conectado al “Merge” de tipo “Respond to Webhook” con los siguientes parámetros:
En el primer nodo “Información General” debemos asegurarnos de que el parámetro Respond tenga el valor Using ‘Respond to Webhook’ Node, que permite que la información general del restaurante se retorne como respuesta al llamado del Webhook:
Al finalizar este paso usted debería tener algo como:
Ya hemos completado este primer flujo, el cual se encarga de retornar la información general del restaurante. Ahora podemos ejecutarlo y realizar una petición desde Insomnia, si todo esta configurado correctamente debería obtener:
Con la creación del flujo en n8n, encargado de retornar la información actual del restaurante registrada en Google Sheets, podemos proceder a agregar este Webhook como una herramienta para nuestro agente de voz en ElevenLabs.
Antes de agregar la herramienta, debemos activar nuestro flujo en n8n como se indica a continuación:
Con el flujo activado procedemos a seleccionar nuestro nodo de entrada y copiamos la URL de producción del Webhook que definimos anteriormente:
Finalmente, agregamos la herramienta en ElevenLabs. Para ello nos dirigimos a: Tools > Add tool y registramos los siguientes valores:
Name: info-restaurante
Description: Esta herramienta se encarga de obtener la información actual del restaurante y retorna campos como la disponibilidad del restaurante (Abierto/Cerrado), el día actual de la semana y los productos con su respectiva información.
Method: GET.
URL: URL de producción de tu Webhook.
Desde ElevenLabs tenemos la posibilidad de exportar la transcripción de la llamada utilizando un Webhook. Para registrar el pedido, vamos a enviar esta información a un nuevo Webhook en n8n, el cual estará conectado a un agente encargado de guardar los datos en la hoja Pedidos de Google Sheets.
Paso 1:
Agregamos un nuevo flujo con un Webhook como punto de entrada llamado “Postprocesamiento”, esta vez el Webhook va a ser de tipo POST en el campo HTTP Method, y conectamos un nodo de tipo Code llamado “Obtener conversación” con el siguiente código JavaScript:
const transcript = $input.first().json.body.data.transcript; const conversation = transcript.map(item => ({ role: item.role, mensaje: item.message })); return [{ json: { "conversacion": conversation } }];
Al finalizar este paso usted debería tener algo como:
Paso 2:
En n8n también tenemos la posibilidad de crear un agente. En este caso, crearemos uno que procese el texto presente en la transcripción de la interacción entre el agente de voz y el cliente. Para ello, agregamos un nuevo nodo de tipo AI Agent con la siguiente configuración:
Prompt:
A partir de la siguiente transcripción de un pedido por voz realizado por un agente de toma de pedidos, extrae la siguiente información y guardala en una hoja de calculo: - Fecha y hora en formato YYYY-MM-DD HH-MM - Nombre del cliente - Lista de productos - Precio final - Dirección de envio - Método de pago Importante: Si no es posible obtener información suficiente o confiable para alguno de los campos, no lo registres (déjalo en blanco). La fecha y hora actual es: {{ $now }} Transcripción: {{ JSON.stringify($json.conversacion) }}
Al agente debemos agregar un LLM, por lo tanto seleccionamos + en Chat Model y añadimos un nuevo nodo de tipo “Google Gemini Chat Model”.
Aquí también debemos configurar una credencial, para obtener la credencial nos dirigimos a Google AI Studio y obtenemos la el API Key.
En n8n seleccionamos dentro del nodo “Google Gemini Chat Model”: Select Credential > Create new Credential y pegamos el API Key. Si todo salió correcto deberíamos obtener el siguiente mensaje:
Esta sería la configuración del nodo “Google Gemini Chat Model”:
Igualmente, dentro de la configuración de esta herramienta, debemos activar la opción para que el modelo de lenguaje (LLM) se encargue de registrar cada valor de su respuesta en la columna correspondiente de la hoja Pedidos. Para ello, seleccionamos el ícono Let the model define this parameter en cada columna.
Al finalizar este paso usted debería tener algo como:
En el anterior paso creamos un nuevo flujo que se encarga de procesar la conversación que realizó el agente de voz en ElevenLabs, ahora debemos conectar nuestro agente de voz a este flujo.
Antes de realizar la conexión debemos obtener la URL del Webhook en producción, esto lo hacemos haciendo click en el Webhook “Postprocesamiento” y copiando la URL:
Para registrar el Webhook en ElevenLabs nos dirigimos a Security en la barra de navegación superior dentro de la configuración de nuestro agente.
Encontraremos un botón llamado Create Webhook, lo seleccionamos y en el modal registramos los siguiente campos:
Webhook name: Postprocesamiento
Callback URL: URL del Webhook de Postprocesamiento
Importante ⚠️: Al agregar nuestro Webhook de post-call, se genera una llave. En un flujo más avanzado, esta llave debería utilizarse para validar que el mensaje recibido en el Webhook de n8n proviene efectivamente de nuestro agente de voz. Sin embargo, por motivos de simplicidad, esta validación no se implementa en este caso.
Para que nuestro agente de voz pueda recibir llamadas reales, es necesario alquilar un número de teléfono. Para alquilar un número de teléfono en Twilio debemos dirigirnos a la consola y en el menu lateral seleccionar: Phone Number > Buy a number > Buy.
Una vez hemos alquilado el número de teléfono, debemos ir a Twilio Summary , aquí podremos obtener el SID de nuestra cuenta que corresponde a un identificador único:
En la barra de búsqueda de la consola debemos ingresar el termino “Auth token” y seleccionar la primera opción:
En este nuevo menu, seleccionamos en la barra lateral la opción API keys & tokens y en Live credentials copiamos y guardamos nuestro Auth token:
En el dashboard de ElevenLabs seleccionan la opción: Phone number > Import number > From Twilio.
En el modal registras los campos que anteriormente obtuvimos de Twilio, como se muestra a continuación:
Finalmente asignamos el agente al número de teléfono:
Una vez finalizada la configuración, nuestro agente ya estará habilitado para tomar pedidos utilizando el número de teléfono. Como estamos utilizando una cuenta Trial de Twilio, al realizar la llamada escucharemos un mensaje de advertencia. Simplemente, una vez finalizado dicho mensaje, presionamos cualquier tecla para continuar.
A continuación, se muestra una demo funcional del comportamiento del agente a través de una llamada real 📞.
Demo del agente de voz en acción
Este es un primer acercamiento a la creación de una agente de voz que responde llamadas telefónicas utilizando ElevenLabs, n8n y el API de Google para LLMs.
Es importante resaltar que esto es un enfoque inicial, que aun requiere revisiones y ajustes. Por ejemplo, en algunas ocasiones el agente ha registrado pedidos aunque la información no esta completa, lo que evidencia la necesidad se afinar los flujos y prompts.
Además, por temas de costos y consumos de créditos, en esta versión no se están utilizando los modelos más avanzados disponibles en las plataformas, pero se podrían implementar para mejorar la compresión y respuestas del agente.
Aún así la implementación es un buen punto de partida para darse una idea de como funciona este tipo de soluciones, y como se pueden construir experiencias conversacionales automatizadas utilizando herramientas no-code y APIs modernas.
✅ ¡Espero que esta guía te haya sido de ayuda!
Si tienes alguna duda, sugerencia o simplemente quieres compartir tu opinión, puedes escribirme a través de un mensaje en mis redes sociales.
¡Hasta pronto! 👋😊