Agente IA para agendar citas en WhatsApp: guia LATAM 2026

AgentesNexo
··7 min lectura

Para automatizar la agenda de citas por WhatsApp con IA, necesitas tres componentes: un numero de WhatsApp Business API, un agente con acceso al calendario, y logica de confirmacion. El resultado es un chatbot WhatsApp para empresas LATAM que recibe mensajes a cualquier hora, valida disponibilidad en tiempo real, y envia confirmaciones sin que nadie intervenga.

En Argentina, Colombia y Mexico —los tres mercados con mayor adopcion de WhatsApp Business en LATAM— el 74% de los negocios recibe solicitudes de citas fuera del horario laboral. Si no respondes en los primeros 5 minutos, el prospecto busca otra opcion. Un agente de IA resuelve exactamente ese gap.

Esta guia cubre la implementacion tecnica completa, basada en el sistema que desplegamos en AgentesNexo para clinicas, estudios juridicos y centros de estetica en LATAM.

Requisitos previos

  • Numero de WhatsApp Business API (via Meta, Twilio, o 360dialog)
  • Google Calendar con API habilitada o Calendly con API
  • Servidor Node.js 20+ o Python 3.11+
  • Cuenta Claude API o Gemini para el agente
  • Webhook endpoint publico (ngrok para pruebas, Railway para produccion)

Como configurar WhatsApp Business API

Meta ofrece acceso directo via Meta for Developers. Alternativas con menos friccion en LATAM: Twilio WhatsApp (disponible en MX, AR, CO) y 360dialog.

bash
# Instalar el SDK de Meta para Node.js
npm install whatsapp-business-sdk @anthropic-ai/sdk googleapis pg

# Variables de entorno necesarias
WHATSAPP_PHONE_NUMBER_ID=tu_phone_number_id
WHATSAPP_TOKEN=tu_access_token
WHATSAPP_VERIFY_TOKEN=tu_webhook_verify_token
ANTHROPIC_API_KEY=tu_api_key
GOOGLE_SERVICE_ACCOUNT_JSON=ruta_al_json

Registra el webhook en Meta Business Suite apuntando a tu endpoint /webhook. Meta enviara un GET de verificacion con el hub.verify_token que configuraste.

Como construir el agente con acceso al calendario

El agente necesita dos tools: una para consultar disponibilidad y otra para crear la cita.

typescript
import Anthropic from #43a047">"@anthropic-ai/sdk";
import { google } from #43a047">"googleapis";

const client = new Anthropic();

const TOOLS = [
  {
    name: #43a047">"check_availability",
    description: #43a047">"Consulta los horarios disponibles en el calendario para una fecha especifica. Devuelve lista de slots libres en formato HH:MM.",
    input_schema: {
      type: #43a047">"object",
      properties: {
        date: { type: #43a047">"string", description: "Fecha en formato YYYY-MM-DD" },
        duration_minutes: { type: #43a047">"number", description: "Duracion en minutos (default 30)" }
      },
      required: [#43a047">"date"]
    }
  },
  {
    name: #43a047">"create_appointment",
    description: #43a047">"Crea una cita confirmada en el calendario. Usar solo cuando el cliente haya confirmado explicitamente.",
    input_schema: {
      type: #43a047">"object",
      properties: {
        date: { type: #43a047">"string", description: "Fecha YYYY-MM-DD" },
        time: { type: #43a047">"string", description: "Hora HH:MM (24h)" },
        client_name: { type: #43a047">"string" },
        client_phone: { type: #43a047">"string" },
        service: { type: #43a047">"string", description: "Tipo de servicio o motivo" }
      },
      required: [#43a047">"date", "time", "client_name", "client_phone"]
    }
  }
];

const SYSTEM_PROMPT = #43a047">`Eres el asistente de agenda de [Nombre del Negocio]. 
Tu funcion es agendar citas por WhatsApp de forma rapida y amigable.
Horario: lunes a sabado, 9am a 7pm.
Reglas:
- Habla en espanol neutro, se conciso (maximo 3 oraciones por respuesta)
- Siempre confirma la cita verbalmente antes de crearla: "Confirmo tu cita para el [dia] a las [hora], correcto?"
- Solo crea el evento cuando el cliente confirme con "si", "perfecto", "dale" o equivalente
- Si el usuario pide un horario ocupado, ofrece las 3 alternativas mas proximas`;

async function runAgent(userMessage: string, history: any[]) {
  const messages = [...history, { role: #43a047">"user", content: userMessage }];
  
  const response = await client.messages.create({
    model: #43a047">"claude-sonnet-4-5",
    max_tokens: 512,
    system: SYSTEM_PROMPT,
    tools: TOOLS,
    messages
  });

  if (response.stop_reason === #43a047">"tool_use") {
    const toolResults = await processToolCalls(response.content);
    return runAgent(#43a047">"", [
      ...messages,
      { role: #43a047">"assistant", content: response.content },
      { role: #43a047">"user", content: toolResults }
    ]);
  }

  const text = response.content.find(b => b.type === #43a047">"text")?.text ?? "";
  return { text, updatedHistory: [...messages, { role: #43a047">"assistant", content: text }] };
}

Como conectar el webhook al agente

typescript
import express from #43a047">"express";
import Redis from #43a047">"ioredis";

const app = express();
app.use(express.json());

const redis = new Redis(process.env.REDIS_URL);

// Verificacion del webhook (requerida por Meta)
app.get(#43a047">"/webhook", (req, res) => {
  if (req.query[#43a047">"hub.verify_token"] === process.env.WHATSAPP_VERIFY_TOKEN) {
    res.send(req.query[#43a047">"hub.challenge"]);
  } else {
    res.sendStatus(403);
  }
});

app.post(#43a047">"/webhook", async (req, res) => {
  res.sendStatus(200); // Responder inmediatamente a Meta (timeout en 20s)

  const message = req.body.entry?.[0]?.changes?.[0]?.value?.messages?.[0];
  if (!message || message.type !== #43a047">"text") return;

  const from = message.from;
  const text = message.text.body;

  // Historial con TTL de 24h (ventana de conversacion de WhatsApp)
  const rawHistory = await redis.get(#43a047">`chat:${from}`);
  const history = rawHistory ? JSON.parse(rawHistory) : [];

  const { text: reply, updatedHistory } = await runAgent(text, history);

  await redis.set(#43a047">`chat:${from}`, JSON.stringify(updatedHistory), "EX", 86400);
  await sendWhatsAppMessage(from, reply);
});

app.listen(3000);

Como manejar citas en Google Calendar

typescript
async function checkAvailability(date: string, durationMinutes = 30): Promise<string[]> {
  const startOfDay = new Date(#43a047">`${date}T09:00:00-04:00`);
  const endOfDay   = new Date(#43a047">`${date}T19:00:00-04:00`);

  const { data } = await calendar.freebusy.query({
    requestBody: {
      timeMin: startOfDay.toISOString(),
      timeMax: endOfDay.toISOString(),
      items: [{ id: #43a047">"primary" }]
    }
  });

  const busy = data.calendars?.primary?.busy ?? [];
  return generateFreeSlots(startOfDay, endOfDay, busy, durationMinutes).slice(0, 5);
}

async function createAppointment(data: AppointmentData): Promise<string> {
  const { data: event } = await calendar.events.insert({
    calendarId: #43a047">"primary",
    requestBody: {
      summary: #43a047">`Cita - ${data.client_name}`,
      description: #43a047">`Servicio: ${data.service || "No especificado"}\nWA: ${data.client_phone}`,
      start: { dateTime: #43a047">`${data.date}T${data.time}:00-04:00` },
      end:   { dateTime: addMinutes(#43a047">`${data.date}T${data.time}:00-04:00`, durationMinutes) },
      reminders: {
        useDefault: false,
        overrides: [{ method: #43a047">"popup", minutes: 30 }]
      }
    }
  });
  return event.id!;
}

Arquitectura del sistema

El flujo completo es lineal:

  1. Cliente envia mensaje por WhatsApp
  2. Meta llama tu webhook via POST en menos de 2 segundos
  3. Tu servidor responde 200 OK de inmediato (requisito de Meta) y procesa async
  4. El agente recupera el historial de Redis, procesa el mensaje, llama tools si necesita
  5. Si el usuario confirma, el agente crea la cita en Google Calendar
  6. La respuesta se envia via WhatsApp API
  7. El historial actualizado se guarda en Redis con TTL 24h

Para escalar a multiples negocios, crea un servidor MCP por negocio con sus propias credenciales de Calendar, y conectalos al mismo agente orquestador.

Lo que aprendimos en produccion

  1. El vocabulario regional importa: en Mexico dicen "cita", en Argentina "turno", en Colombia "consulta". Incluye todas las variantes en el system prompt o pierdes conversiones.
  2. Confirmar antes de crear: nunca asumas que "el martes a las 3" es una confirmacion. Repite la cita completa y espera un "si" explicito.
  3. Recordatorio 24h antes reduce no-shows un 40%: agrega un cron que lea eventos del calendario del dia siguiente y mande recordatorio por WhatsApp. Lo medimos en clinicas y el impacto es consistente.
  4. Muestra 3 slots, no 10: mas de 5 opciones paraliza al usuario. Muestra las 3 proximas disponibles y pregunta si prefiere otro dia.
  5. Ventana de conversacion de WhatsApp: la API solo te deja enviar mensajes libres dentro de las 24h posteriores al ultimo mensaje del usuario. Pasada esa ventana, necesitas usar una plantilla (template) aprobada por Meta para retomar el contacto.

En resumen

  • Un chatbot WhatsApp para empresas LATAM que agenda citas necesita: WhatsApp Business API + agente IA con tools de calendario + webhook con historial en Redis
  • La implementacion base tarda 1-2 dias; la version de produccion con logs y manejo de errores, 3-5 dias
  • Resultados tipicos: 0 citas perdidas fuera del horario, -40% de no-shows con recordatorio automatico
  • Compatible con Google Calendar, Calendly, y cualquier sistema con API REST
  • Util para: clinicas, dentistas, abogados, centros de estetica, entrenadores personales, consultoras

Si quieres implementar esto en tu negocio sin construirlo desde cero, en AgentesNexo lo hacemos por ti. Escribenos en agentesnexo.com o por WhatsApp al +591 67564218.

Implementa tu agente de citas en agentesnexo.com o por WhatsApp al +591 67564218

Articulos relacionados