Caso de estudio · Sistemas de IA
Afterhour: una recepcionista de voz con IA multi-tenant que nunca pierde una llamada
Un SaaS en producción que atiende las llamadas de estudios jurídicos 24/7, califica leads, transfiere en caliente los casos importantes y sincroniza cada llamada con las herramientas del estudio. Construido para Big Voodoo Interactive.
- Producto
- afterhour.ai ↗
- Cliente
- Big Voodoo Interactive
- Industria
- Marketing legal · Estudios jurídicos
- Rol
- Principal Engineer
- Período
- 2025 – hoy
- 24/7
- intake con IA para estudios jurídicos
- ~7%
- de llamadas recuperadas por reconciliación
- 25K+
- llamadas procesadas
Deslizá hacia el costado para ver el diagrama completo →
Contexto
Big Voodoo Interactive es una agencia de marketing legal cuyos clientes son estudios jurídicos. Para un estudio, una llamada perdida es un caso perdido: los potenciales clientes llaman fuera de horario, los fines de semana o cuando todos están ocupados, y si nadie atiende llaman al estudio siguiente. Los servicios de atención tradicionales son caros y no hacen intake.
El desafío
Convertir la IA conversacional en un producto operativo que el personal no técnico de un estudio pueda configurar con seguridad: aislamiento por tenant, procesamiento confiable después de cada llamada aunque fallen los webhooks del proveedor, grabaciones que pertenecen al estudio, transferencias en caliente que respetan el horario y integraciones con los CRMs que los estudios ya usan.
La solución
Las llamadas entran por números de Twilio y las atienden en tiempo real asistentes de VAPI. Cuando una llamada termina, la plataforma primero guarda el payload crudo y después lo procesa de forma asíncrona en AWS: extracción estructurada, normalización de teléfonos, archivo de la grabación, triggers, notificaciones y sincronización con CRMs. Un job de reconciliación recupera cualquier llamada que el webhook no entregó. Los estudios gestionan todo desde un portal en React, que incluye un Agent Builder conversacional y llamadas de prueba desde el navegador.
Capa de voz
Números de Twilio conectados a asistentes y squads de VAPI, con herramientas para transferencia en caliente y control de horario.
Transferencia en caliente según disponibilidad
VAPI no tiene una función de disponibilidad, así que una function tool le pregunta al backend de Afterhour al inicio de cada llamada si hay una persona para recibir la transferencia, con horarios por día, zona horaria y turnos partidos, cacheado durante toda la llamada.
Pipeline de llamadas durable
El ingreso de webhooks en API Gateway + Lambda guarda el payload crudo, encola solo el id de la llamada en SQS, y jobs tipados la procesan con esquemas de reintento y colas de mensajes fallidos.
Cron de reconciliación
Un job de EventBridge cada 5 minutos compara contra el proveedor y recupera las llamadas cuyo webhook nunca llegó.
Extracción estructurada
Cada llamada produce datos del llamante, calificación y un resumen como structured outputs a baja temperatura, listos para notificaciones y CRMs.
Grabaciones que son del estudio
Las grabaciones se descargan por el endpoint autenticado del proveedor a S3 privado, se sirven con URLs prefirmadas y el acceso desde integraciones queda auditado.
Formulario agéntico (Agent Builder)
Un formulario conversacional que arma un agente de voz para cualquier objetivo: el LLM usa tools para completar cada ajuste como candidato con confianza y origen, transmite los cambios en vivo, marca contradicciones con la base de conocimiento cargada y bloquea la publicación hasta que todo esté confirmado.
Observabilidad
Sentry con profiling, métricas y dashboards propios en CloudWatch (incluida la reconciliación), alertas por Slack, logging estructurado de webhooks y endpoints de diagnóstico.
Decisiones clave
- 01
Guardar primero, procesar después
El handler del webhook solo guarda el payload crudo y encola el id. El procesamiento puede fallar, reintentarse o volver a correrse sin perder nunca la llamada original.
Alternativas evaluadas Procesar todo dentro del request del webhook.
- 02
No confiar solo en webhooks: reconciliar
Cerca del 7% de las llamadas nunca llegaba por webhook. Un job programado de reconciliación las recupera, así la completitud ya no depende de la entrega de un tercero.
Alternativas evaluadas Depender de los reintentos del proveedor.
- 03
La disponibilidad vive en nuestro backend, no en la plataforma de voz
El proveedor de voz podía transferir llamadas pero no decidir cuándo hay una persona disponible. Un endpoint del backend expuesto como tool es dueño de esa regla, y los casos fuera de horario, sin respuesta o con transferencia rechazada convergen en un único fallback: la IA retiene al llamante, toma sus datos y promete el llamado. En el modo de espera con detección de humano, una transferencia fallida le devuelve la conversación a la IA en lugar de cortar la llamada.
Alternativas evaluadas Codificar los horarios en el prompt; un comportamiento distinto por cada tipo de falla.
- 04
Serverless con jobs tipados
La API y los workers corren en Lambda con SQS, y cada tipo de job declara su esquema de reintentos. Escala a cero en reposo y absorbe picos de llamadas sin planificar capacidad.
Alternativas evaluadas Contenedores permanentes con una cola en proceso.
- 05
Structured outputs en lugar de análisis libre
Las notificaciones, la calificación y la sincronización con CRMs necesitan campos, no prosa. Los structured outputs a baja temperatura hacen la extracción predecible y testeable.
- 06
Los cambios de prompt se despliegan como código
Una mala clasificación descartaba en silencio a clientes recurrentes con casos nuevos. La corrección salió con un harness de evaluación offline sobre transcripciones etiquetadas, un script de patch versionado y reversible, y un rollout canario.
Alternativas evaluadas Editar a mano los prompts de producción.
- 07
Un formulario agéntico: la IA propone, el humano confirma
En lugar de un formulario largo de ajustes, el usuario describe el objetivo y un LLM completa la configuración del agente con tool calls. Cada valor empieza como candidato con confianza y origen; solo una acción explícita del usuario lo confirma, y la publicación queda bloqueada hasta que la configuración y la base de conocimiento sean consistentes. Los usuarios no técnicos ganan velocidad sin perder el control.
- 08
Observabilidad antes que features
Un producto de voz falla en silencio: un webhook perdido o una grabación faltante parecen no haber pasado nunca. Métricas propias, dashboards, alertas y endpoints de diagnóstico hicieron visibles esas fallas silenciosas, y así se detectó y midió el problema de las llamadas perdidas.
Qué hice
- Lidero la arquitectura y el roadmap técnico de la plataforma como Principal Engineer.
- Diseñé el pipeline durable de llamadas y el job de reconciliación que recupera llamadas perdidas.
- Diseñé la transferencia en caliente según disponibilidad, con una tool en el backend, horarios de atención y un fallback unificado.
- Diseñé el formulario agéntico (Agent Builder) y las pruebas de agentes desde el navegador.
- Construí la capa de observabilidad: métricas, dashboards, alertas y diagnósticos.
- Lideré la migración de las grabaciones a almacenamiento privado y autenticado, con un backfill idempotente.
- Introduje harnesses de evaluación y rollouts canarios para cambios de prompts, y desarrollo guiado por specs con OpenSpec.
Resultados
- En producción para estudios jurídicos, atendiendo llamadas 24/7.
- Las llamadas que se perdían por fallas de webhooks (cerca del 7%) ahora se recuperan automáticamente.
- Más de 25.000 llamadas procesadas; el backfill de grabaciones recuperó 833 grabaciones faltantes sin errores.
- El personal de los estudios configura, prueba y publica agentes de voz conversando con un chat en lugar de completar formularios complejos.