Agente de IA · WhatsApp

Convierte cada WhatsApp en una cita agendada.

Responde al instante, califica al prospecto, agenda la cita y enruta el lead a tu asesor — 24/7, en español natural, sin que tu equipo levante un dedo.

<10s en responder 24/7 sin descanso Califica y agenda solo

Paso a paso

Mira exactamente qué hace el agente.

Cinco etapas, en automático, desde el primer mensaje hasta el asesor. Pulsa play o navega manualmente.

1Recibemensaje entrante
2Entiendey pregunta
3Calificahot / warm / cold
4Agendacita + Meet
5Enrutaal asesor
Hola 👋 vi su anuncio. Tengo una clínica dental con 3 sucursales y quiero automatizar la atención por WhatsApp.
recibido · respondido en 6s
…quiero automatizar la atención.
¡Hola! 😊 Soy Vera. Las clínicas con varias sucursales se benefician muchísimo de esto. ¿En qué área quieres apoyo: agendar citas, dudas frecuentes, seguimiento… o una combinación?
Sobre todo agendar citas. Perdemos llamadas fuera de horario.
Necesidad
Urgencia
Volumen
HOT 🔥
📅Jue 3 jul · 10:00
📅Jue 3 jul · 16:30
📅Vie 4 jul · 11:00
🔗 Cita creada · enlace de Google Meet enviado
A
Asignado a
Asesor · Ventas
HOT
Clínica dental, 3 sucursales · quiere agendar citas · ~80 leads/sem · urgencia: este mes · cita: jue 3 jul 16:30.
Notificado por WhatsApp
01 · Recibe

Responde en segundos, a cualquier hora

El mensaje entra por WhatsApp y el agente responde al instante.

Bajo el capó

Cómo viaja cada mensaje.

Infraestructura real, no una maqueta.

💬WhatsAppmensaje
🔗Webhookverificado
🧠Claudeagente IA
🎯Calificahot/warm/cold
📅📨Agenda + EnrutaCalendar · CRM

El agente

No es un menú. Es un agente que razona.

Entiende el contexto, hace seguimiento natural y decide el siguiente paso — impulsado por Claude.

Respuesta 24/7

Ningún lead espera; ninguno se pierde por responder tarde.

💬

Conversa, no da menús

Razona en vivo con Claude, una pregunta a la vez, en español o inglés.

🎯

Califica y puntúa

Extrae necesidad, urgencia y tamaño; puntúa HOT / WARM / COLD con una rúbrica determinista.

🛡️

Filtra lo que no aplica

Detecta consultas fuera de lugar (tareas escolares, empleo) y se despide con amabilidad.

📅

Lee tu agenda y reserva

Ofrece solo horarios realmente libres y crea la cita real en tu Google Calendar.

🗂️

Registra el trato en tu CRM

Crea contacto + trato (deal) en HubSpot con puntaje, razones y datos calificados.

📨

Entrega al asesor

Avisa a tu equipo con resumen, puntaje, contacto y enlace a la transcripción.

🧊

Recupera leads fríos

En vez de agendar, comparte un recurso útil y protege el tiempo de tu asesor.

🧠

Recuerda todo, sin improvisar precios

Guarda cada mensaje, lead y cita; responde dudas y deja el precio para la llamada.

<10s
Tiempo de respuesta
24/7
Siempre disponible
0
Leads sin atender
Conversaciones a la vez

Cifras ilustrativas.

Construido sobre

Tecnología real, lista para producción.

Integraciones reales corriendo en la nube.

WhatsApp Cloud API
Claude (Anthropic)
Google Calendar
HubSpot CRM
Postgres
Rust · Railway

Estado del sistema

Qué está en vivo hoy.

Todo el pipeline está desplegado y verificado en producción: conversa, califica, agenda en Google Calendar y registra el trato en HubSpot — en vivo.

Agente conversacional (calificación + respuesta)Webhook → Claude → Postgres, desplegado y verificado
EN VIVO
Canal de WhatsAppWebhook verificado, mensajes entrantes suscritos
EN VIVO
Motor de puntuación (hot / warm / cold)Criterio configurable por negocio
EN VIVO
Agenda en Google CalendarCrea eventos reales — probado en producción
EN VIVO
Enrutamiento a CRM (HubSpot)Crea contacto + trato reales — probado en producción
EN VIVO

¿Listo?

Que ningún lead vuelva a esperar.

Lo configuramos con tu marca, tus preguntas y tu calendario. En vivo en días, no meses.

▶ Probar el agente en vivo 💬 Escríbenos por WhatsApp

En el código

Cómo está construido el agente.

Un recorrido por el código real que ejecuta cada conversación — webhook, razonamiento, calificación y entrega.

src/agent/mod.rs
// Cada WhatsApp entrante llega a un webhook verificado por HMAC.
pub async fn handle_inbound(state: AppState, msg: InboundText) -> Result<()> {
    // Idempotencia: Meta reintenta — nunca procesar dos veces.
    if !state.store.mark_message_processed(&msg.message_id).await? {
        return Ok(());
    }
    // Serializa por contacto: sin condiciones de carrera en el historial.
    let _guard = state.locks.acquire(&msg.from).await;

    // Carga (o crea) la conversación y añade el mensaje al historial.
    let conv = state.store.get_or_create_conversation(&msg.from).await?;
    let mut history = conv.messages();
    history.push(json!({ "role": "user", "content": msg.text }));
// El corazón del agente: un bucle de uso de herramientas con Claude.
for _ in 0..MAX_STEPS {
    let resp = state.llm.create(&system, &history, &tools).await?;
    history.push(resp.assistant_message.clone());

    // Sin herramientas → el texto del modelo es la respuesta final.
    if resp.tool_uses.is_empty() { reply = resp.text; break; }

    // Ejecuta cada herramienta y devuelve el resultado al modelo.
    for tu in &resp.tool_uses {
        let out = tools::dispatch(&state, &mut ctx, &tu.name, &tu.input).await;
        results.push(json!({ "type": "tool_result",
                             "tool_use_id": tu.id, "content": out }));
    }
    history.push(json!({ "role": "user", "content": results }));
}
// El LLM extrae los datos; Rust puntúa de forma DETERMINÍSTICA.
fn score_lead(slots: &Slots, r: &Rubric) -> Score {
    let mut pts = 0.0;
    pts += r.need_weight    * slots.need_match(&r.keywords);
    pts += r.urgency_weight * r.timeline_score(&slots.timeline);
    pts += r.size_weight    * r.size_tier(slots.volume);

    match pts {
        p if p >= r.hot  => Score::Hot,    // → agenda + avisa al asesor
        p if p >= r.warm => Score::Warm,   // → nutrir
        _                => Score::Cold,   // → enviar recursos
    }
}
// Lead HOT → agenda real, CRM y handoff; se GUARDA antes de enviar.
let event = state.calendar.create_event(&slot, &lead, /* meet */ true).await?;
state.crm.upsert_lead(&lead, &score).await?;          // contacto + deal (HubSpot)
state.notifier.notify_rep(&handoff, &summary).await?; // avisa al asesor

// Persistir ANTES de entregar: un envío fallido nunca pierde el estado.
state.store.save_conversation(conv.id, &history, &status, score).await?;
if let Err(e) = state.whatsapp.send_text(&msg.from, &reply).await {
    tracing::error!("envío fallido (turno guardado): {e}");
}