El agente respondió la llamada de prueba con mi propia voz y luego hizo algo que no esperaba. Hizo una pausa. Lo suficiente como para que casi hablé. Luego me preguntó, amablemente, cómo se deletreaba el nombre de la empresa que acababa de decir. No el correo electrónico. La empresa. Porque dos minutos antes le había dicho a Claude Code que dejara de permitir que el agente adivinara los nombres propios, y Claude Code había agregado silenciosamente una línea al mensaje del sistema que empujaba al agente a preguntar, cada vez.
Esa única pausa es el momento en que dejé de pensar en esto como un guión y comencé a tratarlo como a un empleado.
Había pasado la tarde anterior construyendo un voice agent completo con Claude Code como cerebro de orquestación, ElevenLabs como motor de voz y conversación y Cal.com como backend de reservas. Sin servicios de pegamento. No crear escenarios. No hay Zapier en el medio. Solo tres API, un archivo .env, un fragmento de widget en una página de inicio y Claude Code leyéndome los documentos mientras describía lo que quería en inglés sencillo.
Al final, tenía un agente de ventas que podía responder con una versión clonada de mi propia voz, calificar a un cliente potencial en cinco campos, consultar mi calendario en Central Time, reservar una llamada de descubrimiento de 30 minutos y enviar el correo electrónico de confirmación, todo desde una burbuja con forma de teléfono en la esquina de un sitio web. La primera versión se rompió de cinco maneras diferentes. La quinta versión funciona. Esta publicación es el recorrido completo de cómo se verá una compilación voice agent real en 2026, incluidos los errores, las matemáticas de crédito y los agujeros de seguridad que casi envié.
Por qué dejé de pensar en los agentes de voz como algo del futuro
Durante dos años había tratado a voice agent como un problema de mañana. Los demos fueron impresionantes en el escenario y extraños en la producción. Cadencia robótica. Disponibilidad alucinada. El tipo de energía de "presione uno para ventas" que hace que los humanos cuelguen antes del segundo mensaje.
Eso cambió silenciosamente. Tres cosas se alinearon al mismo tiempo. ElevenLabs Agents maduró hasta convertirse en un producto real: clonación de voz que cruza el valle inquietante con Clonación de voz profesional con más de 30 minutos de audio, latencia conversacional que ya no se siente como un retraso satelital y facturación por minuto que en realidad se corresponde con un caso de negocios. Cal.com envió un v2 API limpio donde la creación de reservas no requiere autenticación y la disponibilidad de espacios es un GET único. Y Claude Code aprendió a leer una página de documentos de API de terceros, a hacerme tres preguntas interesantes y a escribir el código de integración sin que yo saliera de VS Code.
Esa última parte es el desbloqueo. El conocimiento técnico necesario para conectar ElevenLabs a Cal.com solía ser el cuello de botella. Ahora el cuello de botella es saber qué quiere que haga el agente.
Mire, no le estoy vendiendo la visión de que la voz reemplace a los humanos. Le estoy vendiendo un caso de uso único y restringido donde las matemáticas son tan claras que sería una mala práctica no enviarlas: un agente que responde al tráfico entrante de su sitio a las 11 p. m. de un domingo, califica al cliente potencial y reserva la reunión en su calendario real antes de que el visitante cierre la pestaña. Eso es lo que construí. Eso es lo que estoy a punto de explicarles.
Pero antes de pasar a la compilación, es necesario comprender algo que la mayoría de los tutoriales omiten. Un voice agent no es una sola cosa. Son cuatro cosas unidas, y si no comprendes las cuatro piezas, la construcción parece magia y la depuración parece adivinar.
Las cuatro piezas de cualquier agente de voz
Cada voice agent del mercado (el suyo, el mío, el que el sistema telefónico de su banco desearía que fuera) es una combinación de cuatro componentes. Si se equivoca en cualquiera de estos, todo se derrumba. Si hace bien los cuatro, el agente se sentirá como un compañero de trabajo.
Persona es el indicador del sistema. Tono, estilo, vocabulario, lo que el agente dirá y lo que no dirá, cómo maneja las objeciones, qué hace cuando no sabe una respuesta. Esta es la parte en la que la mayoría de las construcciones se equivocan vergonzosamente. Pegan "Eres un asistente útil" y se preguntan por qué el agente suena como cualquier otro AI en Internet. La persona es donde vive tu marca. Es la diferencia entre un agente que dice "Estaré encantado de ayudar" y un agente que dice "Cuéntame lo que estás tratando de arreglar y veré si encajamos".
Voz es la voz sintética que controla el audio. ElevenLabs le ofrece tres opciones reales: una voz estándar de su biblioteca, un Instant Voice Clone creado con uno a cinco minutos de audio limpio o un Professional Voice Clone creado con un mínimo de 30 minutos e idealmente varias horas de material fuente. Fui con un Professional Voice Clone entrenado con aproximadamente cuatro horas de mi propia voz: episodios de podcasts antiguos, grabaciones de pantalla, tutoriales narrados. La cifra de cuatro horas no es arbitraria. Después de aproximadamente dos horas, el modelo capta patrones de cadencia y respiración que los clones de una sola hora pasan por alto. En las últimas cuatro horas, los resultados se estabilizan con fuerza. No tiene sentido darle veinte.
Base de conocimientos es lo que sabe el agente. La mía fueron todas las transcripciones de mi canal de YouTube, además de un documento estructurado que describe mis servicios, precios y los tipos de proyectos que emprendo. ElevenLabs los ingiere como documentos RAG adjuntos al agente. El agente puede citarlos, resumirlos y negarse a responder preguntas ajenas a ellos. Para un agente de ventas, la base de conocimientos es principalmente su propio discurso; para un agente de soporte, son los documentos del producto.
Herramientas son las cosas que el agente realmente puede hacer. Aquí es donde la mayoría de los agentes de demostración caen de bruces. Pueden hablar. No pueden actuar. Un agente real tiene herramientas adjuntas: un punto final de reserva Cal.com, un webhook de CRM, una búsqueda de repositorio de GitHub, un servidor MCP, un script de Python que consulta una base de datos de clientes, un webhook de Zapier que inicia el siguiente paso en un flujo de trabajo. Las herramientas son las que hacen que el agente sea útil en lugar de teatral.
La construcción por la que estoy caminando usa los cuatro. Persona es una cálida voz de ventas B2B profesional. La voz es mi propio clon. La base de conocimientos es mi documento de servicios y transcripciones de YouTube. Las herramientas son dos: la disponibilidad de espacios Cal.com y la creación de reservas Cal.com, que afectan directamente al v2 API.
Esa es la arquitectura. Ahora esto es lo que realmente se necesitó para construirlo.
La configuración antes de que Claude Code toque algo
Comencé en VS Code con una pequeña página de inicio de Next.js que ya se estaba ejecutando en localhost:3000. Nada sofisticado: una sección de héroe, un botón CTA, un div vacío donde eventualmente se montaría la voz widget. La página existía porque quería que Claude Code tuviera un lugar real donde dejar widget una vez que llegáramos allí. Construir un voice agent sin página de host es como insonorizar una habitación antes de construir las paredes.
Abrí la extensión Claude Code dentro de VS Code. Si no lo ha usado antes dentro del IDE, la experiencia es diferente a la del terminal en un aspecto importante: Claude Code puede ver su árbol de archivos, leer el código existente y escribir directamente en el proyecto sin tener que copiar y pegar nada. La extensión es la forma recomendada de usar Claude Code dentro de VS Code, y para una compilación como esta, la vista de diferencias en paralelo se mantiene dentro de los primeros diez minutos.
Luego escribí un párrafo en Claude Code. Apenas:
Quiero crear un agente de ventas por voz para mi sitio web. Debería responder preguntas sobre mis servicios, calificar al cliente potencial preguntándole el nombre completo, el correo electrónico, el nombre de la empresa, el problema que están tratando de resolver y el tamaño del equipo, y luego reservar una llamada de descubrimiento de 30 minutos en mi calendario Cal.com. La voz debe ser mi Professional Voice Clone en ElevenLabs. Te daré la identificación de voz. El tono debe ser cálido pero profesional, ventas B2B, sin fingir entusiasmo ni lenguaje cliché AI. Empecemos preguntándome todo lo que necesites saber.
Claude Code no comenzó a codificar. Hizo cinco preguntas en un solo mensaje. ¿Qué es mi slug de tipo de evento Cal.com? ¿En qué zona horaria quiero disponibilidad? ¿Quiero una ventana de horas de trabajo específica o usar la predeterminada del calendario? ¿Qué debe hacer el agente cuando el visitante quiere reservar fuera de mi horario? ¿Tengo una clave ElevenLabs API y una clave Cal.com API, o es necesario que me oriente para generarlas?
Esta es la parte que silenciosamente importa. Un desarrollador junior habría comenzado a escribir código de inmediato y habría pasado una hora reescribiendo el flujo de calificación cuando les dije a mitad de camino que necesitaba el tamaño de la empresa como un rango numérico, no como un campo de texto libre. Claude Code preguntó primero.
Respondí. El tipo de evento Cal.com fue discovery-call-30. Zona horaria Central Time. Horario de trabajo de 9 a.m. a 9 p.m. de lunes a viernes. Si fuera del horario de atención, ofrezca el siguiente espacio disponible. Tenía ambas claves API listas. Luego, Claude Code escribió un plan como un archivo de rebajas y lo colocó en el repositorio. El plan enumeraba cada archivo que crearía, cada llamada API que realizaría, cada variable de entorno que necesitaba y el orden en que se construiría. Leí el plan, pedí un cambio: almacenar las respuestas de calificación como un objeto JSON estructurado que se envía a un webhook antes de la reserva, para poder canalizar clientes potenciales a mi CRM más tarde, y di luz verde.
La construcción, en el orden en que realmente sucedió
Aquí es donde la mayoría de los tutoriales saludan con la mano. Dicen "Claude Code generó la integración" y pasan a la demostración. Quiero darles el orden real, porque el orden es lo que hace que el ciclo de iteración funcione.
Primero, el archivo .env. Claude Code creó .env.local con tres variables eliminadas: ELEVENLABS_API_KEY, CAL_COM_API_KEY, ELEVENLABS_AGENT_ID quedaron vacías por ahora. También agregó .env.local a .gitignore sin que yo se lo pidiera. Es una pequeña cosa, pero cada vez que un LLM recuerda la higiene de seguridad básica sin avisar, lo noto.
En segundo lugar, el propio agente ElevenLabs. Claude Code accedió al ElevenLabs Agents API para crear un nuevo agente, mediante programación, no a través del panel. La llamada de creación de agente acepta un cuerpo JSON con el mensaje del sistema, ID de voz, ID de documentos de la base de conocimientos y definiciones de herramientas. Claude Code escribió el mensaje del sistema como un archivo de rebajas separado (prompts/sales-agent-system.md) para poder iterarlo en el control de versiones. Así es aproximadamente como se veía el primer borrador:
You are a sales voice agent for Mejba, a software engineer who builds AI
systems, automates workflows, and ships custom Claude Code integrations.
# Goal
Qualify the prospect. Answer their questions about Mejba's services. If they
seem like a fit, book a 30-minute discovery call on Mejba's calendar.
# Voice & Tone
- Warm but professional. B2B sales, not retail support.
- Never use the words "absolutely", "amazing", "I'd be happy to", or any
variation that signals AI-cliche language.
- Speak in short sentences. Pause after asking a question.
- If the prospect goes on a tangent, listen. Do not interrupt to redirect.
# Qualification Fields (collect in this order, naturally)
1. Full name (ask them to spell the last name back if uncertain)
2. Email (read it back to confirm)
3. Company name (ask for the spelling, every time)
4. The problem they're trying to solve, in their own words
5. Team size (ask for an approximate number of people)
# Booking
- Once qualified, offer the next three available 30-minute slots from
Cal.com via the get_available_slots tool.
- Confirm the slot in Central Time before calling create_booking.
- After booking, confirm the email confirmation will arrive within minutes.
# Boundaries
- Do not quote prices. Tell the prospect Mejba reviews scope before quoting.
- Do not promise specific delivery timelines.
- If asked something you don't know, say so plainly and offer to follow up.
Ese mensaje se reescribió cuatro veces antes de que el agente se sintiera bien. Llegaré a las reescrituras en la siguiente sección. Pero la estructura (rol, objetivo, voz, calificación, reserva, límites) es la esencia. Cada mensaje del sistema voice agent que escribo ahora sigue exactamente esa forma de seis secciones.
En tercer lugar, las herramientas. Claude Code definió dos herramientas personalizadas en el agente. get_available_slots acepta un rango de fechas y una zona horaria, llega al punto final /v2/slots de Cal.com y devuelve una lista de ventanas de 30 minutos disponibles. create_booking acepta el nombre del asistente, el correo electrónico, los campos de calificación como metadatos y un espacio elegido, y llega al punto final /v2/bookings de Cal.com. Ambas herramientas viven como funciones sin servidor en la aplicación Next.js en app/api/. El agente ElevenLabs llama a esos puntos finales a través de herramientas de webhook, lo que significa que ElevenLabs envía una POST HTTPS a mi punto final, mi punto final llega a Cal.com y la respuesta fluye de regreso a través del agente.
El motivo de la dirección indirecta (el agente llama a mi servidor, mi servidor llama a Cal.com) es fundamental y vale la pena reducir la velocidad. Si coloca la clave Cal.com API directamente en la configuración de la herramienta ElevenLabs, esa clave se encuentra en la definición del agente. Cualquiera que pueda ver la configuración del agente puede ver la clave. Al enrutar a través de mis propios puntos finales, la clave Cal.com solo reside en .env.local en Vercel. El agente no tiene credenciales propias. Simplemente habla con mi webhook. Este patrón vuelve a aparecer en la sección de seguridad, pero comienza aquí.
Cuarto, widget. Una vez que la ID del agente regresó de ElevenLabs API, Claude Code colocó el fragmento de inserción en la página de destino. El fragmento se parece más o menos a esto:
<elevenlabs-convai
agent-id="agent_xxxxxxxxxxxxxxxxxxxxx"
></elevenlabs-convai>
<script
src="https://unpkg.com/@elevenlabs/convai-widget-embed"
async
type="text/javascript"
></script>
Dos etiquetas. Esa es toda la superficie del lado del cliente. El widget monta un botón con un icono de teléfono flotante en la esquina inferior de la página. Haga clic en él y comenzará una conversación de voz en tiempo real. Todo lo demás (el flujo de calificación, la lógica del calendario, la reserva) se ejecuta en el lado del servidor o dentro del cerebro del agente.
Presioné guardar. localhost:3000 actualizado. Apareció la burbuja del teléfono. Hice clic en él. Y entonces empezaron los errores.
Cinco cosas se rompieron. Esto es lo que cada uno me enseñó.
Esta es la sección que desearía que tuvieran todos los tutoriales de voice agent. Porque la construcción es la parte fácil. La primera llamada es donde aprende quién es realmente su agente.
Error número uno: el agente no dijo nada cuando comenzó la llamada. Hice clic en el ícono del teléfono, se abrió la conexión y luego se hizo el silencio. El agente me estaba esperando. Como una llamada de Zoom incómoda. ElevenLabs Agents tiene un campo first_message en la configuración del agente (una cadena literal que el agente pronuncia en el momento en que se abre una sesión) y Claude Code lo había dejado vacío porque no había especificado uno en mi informe. Le dije a Claude Code "Establece el primer mensaje en algo como: Oye, este es el asistente AI de Mejba. ¿Qué tienes en mente?" Claude Code actualizó la configuración del agente a través de API, no es necesario volver a implementarlo. La siguiente llamada comenzó con un cálido saludo.
Error dos: la voz era incorrecta. Técnicamente no es incorrecta; definitivamente era mi voice clone. Pero la cadencia era eso que hace todo Instant Voice Clone donde cada oración termina con un ligero tono ascendente, como si el agente sonriera con cada palabra. Sonaba como una grabación de atención al cliente. Para un agente de ventas B2B, esa energía se había acabado. Demasiado ansioso. Ligeramente falso.
La solución estaba en la configuración de voz, no en el mensaje. ElevenLabs le ofrece cuatro controles deslizantes que importan: velocidad, estabilidad, similitud y exageración de estilo. Hice que Claude Code abriera la configuración del agente y cambiara la configuración de voz: estabilidad hasta 0,75 (más consistente, variación menos expresiva), similitud hasta 0,85 (más cercana a las grabaciones de origen), exageración de estilo hasta 0,3 (menos performativo). Agregué una línea al mensaje del sistema: "Hable en un tono tranquilo y mesurado. No está vendiendo. Está escuchando". La siguiente llamada de prueba sonó como una persona real hablando: más lenta, más deliberada, sin sonrisas. Esa única combinación de afinación del control deslizante más instrucción de tono resultó ser la mayor palanca de calidad en toda la construcción.
Error tres: la zona horaria era incorrecta. Este tardó una hora en encontrarlo. Le pedí al agente que verificara la disponibilidad para "mañana por la tarde". El agente dijo que el horario más temprano era a las 6 p.m. En realidad, mi calendario estaba completamente abierto a las 11 a.m. Supuse que Cal.com estaba roto. No lo fue. v2 slots endpoint requiere los parámetros de tiempo en UTC de Cal.com, pero acepta un parámetro timeZone para formatear la salida. Claude Code había conectado la solicitud correctamente en UTC pero no había configurado el parámetro timeZone en la respuesta, por lo que el agente estaba leyendo los tiempos de las ranuras en UTC y anunciándolos como Central Time. Las 11 a. m., hora central en UTC son las 4 p. m. Agregue la política de aviso mínimo de dos horas de Cal.com y el horario más temprano que el agente pudo ver saltó a las 6 p.m.
La solución fueron cuatro líneas de código. Claude Code agregó timeZone=America/Chicago a la consulta de espacios, analizó el campo time de la respuesta (que ahora ya estaba convertido) y actualizó el mensaje del sistema para que diga "Leer siempre los tiempos al cliente potencial en Central Time". Luego hicimos la prueba. Aparecieron las 11 de la mañana. El agente dijo: "Mañana tengo las 11 a. m. hora central". Dejé escapar un pequeño suspiro audible de alivio.
Si no recuerda nada más de toda esta publicación, recuerde esto: cuando un agente impulsado por LLM hace algo extraño con el tiempo, casi siempre es un error de zona horaria y casi nunca es culpa del modelo.
Cuarto error: el correo electrónico estaba mal formateado y el nombre de la empresa estaba mal escrito. Probé el flujo de reserva diciendo mi correo electrónico en voz alta: "mejba punto uno tres en gmail punto com". El agente confirmó "M-E-G-B-A en gmail punto com". Equivocado. La transcripción de voz confunde regularmente M-E-J con M-E-G cuando no hay contexto de diccionario. El mismo problema con los nombres de empresas. El agente no tenía forma de saber si había dicho "Acme Inc" o "Acne Inc".
La solución fue a nivel de solicitud, no a nivel de código. Le pedí a Claude Code que agregara este bloque al indicador del sistema:
# Spelling Discipline
For any proper noun the prospect provides — full name, email, company —
do NOT trust your transcription. Always:
1. Repeat the value back, letter by letter for short tokens (names, the
local part of an email, company names under 8 characters).
2. For longer values, repeat back and ask: "Did I get the spelling right?"
3. For email addresses, separate the local part and the domain when
reading back: "M-E-J-B-A dot one-three, at G-mail dot com — correct?"
4. If the prospect corrects you, accept the correction and read the new
spelling back one more time before moving on.
En la siguiente llamada de prueba, dije "mejba punto uno tres en gmail punto com". El agente hizo una pausa y luego lo leyó letra por letra. Lo confirmé. La reserva se realizó limpiamente. Esta es la pausa que abrió este artículo. También es el tipo de cambio de comportamiento que se puede agregar casi libremente y que eleva dramáticamente la inteligencia percibida del agente.
Error cinco: Cal.com se negó a reservar "en cualquier momento dentro de las próximas dos horas". El agente seguía diciendo que el horario más temprano estaba a dos horas y media de distancia, incluso en un calendario claramente abierto. Esto no fue un error. Cal.com tiene un período de aviso mínimo predeterminado de 120 minutos para los tipos de eventos, una configuración diseñada para proteger a los humanos de reservar accidentalmente algo dentro de tres minutos. Entré en la configuración del tipo de evento Cal.com, reduje el aviso mínimo a 30 minutos y volví a realizar la prueba. El agente ahora ofrecía espacios a partir de 35 minutos. Conocer las políticas predeterminadas de la plataforma es parte de la integración con ella. Claude Code no inventó esa regla de los 120 minutos; Cal.com lo hizo. Pero Claude Code tampoco podría haber sabido que quería anularlo porque no se lo había dicho.
Cinco errores. Cinco arreglos. Tiempo total para depurar los cinco: unos noventa minutos, con Claude Code leyendo la página de documentos correspondiente cada vez y proponiendo la solución antes de que terminara de leer el error.
Aparte de la mitad de la construcción
Si prefiere que alguien cree un voice agent como este de extremo a extremo en su pila (voice clone, indicador del sistema, Cal.com o HubSpot o cualquier backend de reserva que use, bloqueo de nombre de host, todo el kit), ese es exactamente el tipo de proyecto que emprendo. Puede ver lo que he creado y reservar una llamada en fiverr.com/s/EgxYmWD.
Seguridad: La conversación que casi no se dio
Casi envié esto sin pensar en la seguridad. El widget funcionó. El calendario funcionó. Tenía mi dedo en el botón de despliegue.
Entonces una pequeña y útil voz en el fondo de mi cabeza dijo: cualquiera con un navegador puede abrir este sitio, hacer clic en widget y comenzar a grabar mis créditos de ElevenLabs.
Los agentes de voz no son como los chatbots de texto. Cada minuto de conversación cuesta dinero real. Facturas ElevenLabs Agents por minuto de conversación, entre $0,08 y $0,12 según el nivel, separadas de la cuota de caracteres de su suscripción base. Una sola llamada abusiva de una hora cuesta aproximadamente entre 5 y 7 dólares. Una botnet que ejecuta diez llamadas paralelas de una hora cada noche es el tipo de factura que arruina un martes por la mañana.
Así que hice que Claude Code agregara cuatro capas de seguridad antes de implementarlo.
Lista de nombres de host permitidos. La plataforma del agente ElevenLabs admite un hostname allowlist en la pestaña Seguridad: especifica hasta diez dominios y cualquier conexión widget de un dominio que no esté en esa lista se rechaza en el protocolo de enlace WebSocket. Agregué mejba.me, www.mejba.me y localhost:3000. Cualquiera que copie mi fragmento widget en su propio sitio no puede utilizar mi agente.
Límite de duración de la conversación. Limité cualquier conversación a 8 minutos. Si un cliente potencial real necesita más tiempo, debería estar en una llamada de Zoom conmigo, sin abusar de mi robot de voz. Ocho minutos son suficientes para clasificarse y reservar. También significa que el peor de los casos para un abusador es aproximadamente $0,96 por sesión.
Limitación de velocidad por IP. Claude Code agregó una pequeña función Vercel Edge delante de widget que acelera las conexiones por IP. Tres sesiones por hora. La décima sesión en una hora obtiene un 429. Yo no inventé esta tasa. Le pedí a Claude Code que eligiera números que bloquearan la automatización obvia sin rechazar a un usuario real que colgó y volvió a llamar.
Escalamiento controlado por autenticación. Para la primera versión, dejé el widget público: un agente de ventas que requiere iniciar sesión es un agente de ventas con el que nadie habla. Pero Claude Code escribió un indicador de función para signed URLs (el valor predeterminado recomendado según los documentos de autenticación de ElevenLabs) para poder cambiar el agente al modo autenticado en 30 segundos si veo abuso. Las URL firmadas requieren un token del lado del servidor antes de que el agente acepte una conexión. Si está ejecutando un agente interno (servicio de asistencia para empleados, portal de socios), comience con signed URLs y nunca mire atrás.
No me encanta el cálculo de seguridad en voice agent públicos. La economía hace que el abuso sea trivialmente fácil y que la defensa tenga múltiples niveles. Pero los cuatro controles anteriores elevan el daño diario en el peor de los casos de "potencialmente ilimitado" a "molesto pero limitado". Esa es la línea que debes cruzar antes de poner cualquier voice agent en un dominio público.
Las matemáticas de costos, honestamente
La mayoría de los tutoriales se saltan la factura. No voy a hacerlo. Esto es lo que realmente cuesta ejecutar este agente a partir de mayo de 2026.
La configuración de la clonación de voz es única. La clonación de voz profesional está incluida en el plan Creator ElevenLabs ($22/month) y superiores. Las cuatro horas de audio fuente que subí se procesaron una vez. El clon en sí no cuesta dinero continuo, sólo lo cuesta la producción sintetizada.
Las conversaciones del agente se facturan por minuto. ElevenLabs Agents cuesta $0,08 por minuto en el nivel estándar y hasta $0,12 por minuto en el nivel premium (que utiliza un LLM de gama alta y Flash voice model). Mi agente se ejecuta en el nivel estándar. Una conversación de ventas típica dura de cuatro a seis minutos; digamos, entre 0,32 y 0,48 dólares por llamada calificada.
Los créditos se acumulan durante dos meses en planes pagos. Los créditos no utilizados no se acumulan para siempre. Planifique su consumo mensual en función del tráfico esperado real, no de su fantasía de crecimiento más descabellada.
Cal.com es gratuito en mi volumen. El nivel gratuito cubre un solo usuario con un tipo de evento de 30 minutos y acceso directo a API. Si necesita programación de equipo o asignación por turnos, ese es un nivel pago, pero para un operador en solitario, cero.
Vercel es gratuito en mi volumen. El nivel de hobby maneja la página de destino y las dos rutas API que representan a Cal.com sin sudar.
Por lo tanto, el costo de funcionamiento de una versión de bajo tráfico de este agente es de aproximadamente $22/month en ElevenLabs (plan Creator, que incluye clonación de voz profesional) más los costos de conversación por minuto. Si el agente atiende diez llamadas al día de cinco minutos cada una, eso equivale aproximadamente a cincuenta minutos al día, o 4 dólares al día, o alrededor de 120/month en costos de conversación. Total: alrededor de $142/month para un agente de ventas en pleno funcionamiento que reserva reuniones mientras duerme.
A modo de comparación, un BDR humano a tiempo parcial (alguien que responde a los clientes potenciales entrantes y califica) le cuesta aproximadamente entre $ 3000 y $ 5000 al mes y no trabaja los fines de semana. El agente no sustituye a un buen BDR. Capta las llamadas que de otro modo llegarían al correo de voz y se filtrarían al vacío.
Implementarlo donde los visitantes reales puedan encontrarlo
Una vez que localhost:3000 dejó de fallar, la implementación fue casi aburrida.
Sincronización de GitHub. Claude Code inicializó un repositorio de git si no existía, creó un repositorio de GitHub privado a través de la CLI gh y envió el código. .env.local permaneció local, nunca tocó el control remoto. Las variables de entorno para la producción vivían únicamente en el tablero de Vercel.
Implementación de Vercel. Conectó el repositorio de GitHub a un nuevo proyecto de Vercel, agregó las tres variables de entorno (ELEVENLABS_API_KEY, CAL_COM_API_KEY, ELEVENLABS_AGENT_ID) en la configuración del proyecto de Vercel, presionó implementar. Dos minutos más tarde, el sitio estaba activo en un subdominio vercel.app. Luego señalé voice.mejba.me a la implementación a través de DNS. Tiempo total de implementación: unos seis minutos.
Twilio para teléfono. Esta es la pieza que aún no he enviado a producción, pero la arquitectura está implementada. ElevenLabs Agents admite la integración de números de teléfono de Twilio desde el primer momento. Usted compra un número, lo pega en la pestaña "Números de teléfono" del agente ElevenLabs y el mismo agente que responde a su widget ahora responde llamadas telefónicas reales. La misma persona. La misma voz. Mismas herramientas. Misma integración Cal.com. Al agente no le importa si el audio proviene de un micrófono del navegador o de una línea telefónica. Esa es la parte a la que sigo volviendo como lo que cambia silenciosamente el caso de negocio: un agente, tres superficies (widget, tablero, teléfono), un mensaje, una base de conocimientos.
Si ya ha creado un flujo de trabajo Claude Code impulsado por MCP, es posible que se pregunte dónde encaja MCP en esta compilación. La respuesta corta es: todavía no, pero la respuesta más larga es que los mismos patrones que analicé en mi desglose de los MCP imprescindibles para Claude Code se aplican directamente a los voice agent en el momento en que desea que el agente consulte una base de datos, lea su Notion o extraiga un registro de cliente. Hoy, todo eso se ejecuta a través de mis webhooks del lado del servidor. Mañana, ElevenLabs' MCP integration permitirá que el agente llame a esos servidores directamente con la autenticación adecuada. La arquitectura está convergiendo.
El bucle de iteración es la habilidad
Aquí está la parte que quiero subrayar antes de cerrar esta pestaña. La construcción no fue la parte difícil. Claude Code hizo la compilación. Cualquiera con dos claves API y un resumen claro podría haber producido el mismo primer borrador.
La habilidad, la habilidad transferible real, es el ciclo de iteración. Los cinco errores que describí anteriormente no son fallas de Claude Code. Son la fricción natural de adaptar a un agente de LLM generalista a un contexto empresarial específico. Cada corrección de errores tomó la forma: observe el comportamiento incorrecto, descríbalo con precisión a Claude Code, deje que Claude Code proponga la corrección, verifique la corrección, implemente y vuelva a probar. Cinco rondas de ese bucle convirtieron a un agente que hizo una pausa incómoda durante la llamada abierta y escribió mal mi correo electrónico en un agente que reserva reuniones reales en calendarios reales.
Este es el mismo ciclo de iteración sobre el que he estado escribiendo durante meses: aquel en el que el valor pasa de "puede hacerlo el AI" a "puede el humano detectar lo que está mal lo suficientemente rápido como para dirigir el siguiente cambio". Profundicé en esta dinámica exacta en por qué el contexto supera a la configuración cuando se crean agentes, y las lecciones allí se desarrollaron paso a paso en esta compilación voice agent. Cada cambio rápido que hice fue una corrección de contexto, no una actualización del modelo.
Los voice agent que funcionan en producción en 2026 no son los que tienen el mejor voice clone ni el código de integración más limpio. Son aquellos cuyos constructores ejecutaron el ciclo de iteración quince veces antes de ponerlo en funcionamiento. La mayoría de los constructores renuncian a las tres.
Preguntas frecuentes
¿Cuánto cuesta construir y ejecutar un voice agent con ElevenLabs y Claude Code?
Espere aproximadamente $142/month en total para producción con poco tráfico: $22/month para el plan Creator ElevenLabs (que desbloquea la clonación de voz profesional), más alrededor de $0,08 por minuto de conversación, además de niveles gratuitos en Cal.com y Vercel. Un operador en solitario que maneja diez llamadas calificadas por día a cinco minutos cada una obtiene cerca de $4/day en costos de conversación.
¿Cuánto audio necesito para clonar mi voz para un agente ElevenLabs?
ElevenLabs La clonación de voz profesional requiere un mínimo de 30 minutos, pero la calidad aumenta notablemente entre dos y cuatro horas de audio de fuente limpia. Utilicé cuatro horas y vi que la cadencia y los patrones de respiración se fijaban. Después de cuatro horas, los retornos se aplanan. Para la clonación de voz instantánea, de uno a cinco minutos es suficiente, pero el resultado es notablemente menos natural para conversaciones de ventas.
¿Puede el mismo agente ElevenLabs contestar llamadas telefónicas y el sitio web widget?
Sí. ElevenLabs Agents admite la integración del teléfono Twilio en la misma configuración del agente que impulsa el sitio web widget. Una persona, una voz, una base de conocimientos, un conjunto de herramientas: tres superficies. Usted compra un número de Twilio, lo pega en la pestaña de números de teléfono del agente y las llamadas entrantes llegan al mismo motor de conversación que usa su widget.
¿Cómo evito que visitantes aleatorios quemen mis créditos ElevenLabs en el widget público?
Utilice cuatro capas: hostname allowlist en la pestaña Seguridad del agente ElevenLabs (límite en sus dominios reales más el host local), un límite de duración por conversación (yo uso 8 minutos), limitación de velocidad por IP en una función Vercel Edge frente a widget y un indicador de función para signed URLs si necesita pasar al modo autenticado durante una ataque. Consulte la sección de seguridad anterior para conocer la configuración exacta.
¿Por qué mi voice agent lee las horas del calendario en la zona horaria incorrecta?
Casi siempre se trata de un problema de configuración de Cal.com /v2/slots. El punto final requiere parámetros de tiempo UTC en la entrada, pero acepta un parámetro timeZone para formatear la salida. Si olvida configurar timeZone=America/Chicago (o su zona relevante) en la solicitud, la respuesta regresa en UTC y el agente la lee como si ya fuera local. Corrija el parámetro de solicitud y agregue una línea de aviso del sistema que obligue al agente a leer siempre los tiempos en la zona local del cliente potencial.
Trabajemos juntos
¿Quiere crear sistemas AI, automatizar flujos de trabajo o ampliar su infraestructura tecnológica? Me encantaría ayudar.
- Fiverr (compilaciones e integraciones personalizadas): fiverr.com/s/EgxYmWD
- Cartera: mejba.me
- Ramlit Limited (soluciones empresariales): ramlit.com
- ColorPark (diseño y marca): colorpark.io
- xCyberSecurity (servicios de seguridad): xcybersecurity.io