TL;DR: integrar WhatsApp Business API con un agente IA requiere un proveedor (Meta Cloud API directo, Twilio o 360dialog), gestionar plantillas aprobadas para iniciar conversaciones, respetar la ventana de 24h para mensajes libres y firmar DPA con Meta para cumplir RGPD. El coste por conversación está entre 0,005 y 0,08 €.

Qué vas a aprender en esta guía

Si tienes un agente IA o estás a punto de implementarlo, este artículo te ahorra semanas de prueba y error con WhatsApp:

  • Qué proveedor elegir (Meta vs Twilio vs 360dialog vs Vonage)
  • Cómo funcionan las plantillas de mensaje y categorías de Meta
  • Cómo respetar la “ventana de 24h” para mensajes libres
  • Cumplimiento RGPD: DPA, política, residencia EU
  • Costes reales en España (€ por conversación)
  • Código de ejemplo en Node.js

1. Conceptos clave de WhatsApp Business

Antes de implementar, hay 4 conceptos que toda integración debe conocer:

1.1. WABA (WhatsApp Business Account)

Es la cuenta de empresa registrada con Meta. Tiene un número de teléfono asociado (no puede ser tu WhatsApp personal) y vive dentro de un Meta Business Manager. Sin WABA verificada, no hay API.

1.2. Plantillas (Message Templates)

Para iniciar una conversación con un cliente que no te ha escrito en las últimas 24h, debes usar una plantilla previamente aprobada por Meta. Las plantillas se clasifican en 3 categorías:

  • Utility: confirmaciones, recordatorios, actualizaciones de pedido. Coste bajo.
  • Marketing: promociones, ofertas. Coste alto y aprobación más estricta.
  • Authentication: códigos OTP. Coste medio.

1.3. Ventana de servicio (24h)

Cuando un usuario te escribe, se abre una ventana de 24h durante la cual puedes responderle con texto libre (sin plantilla). Si pasan 24h sin actividad, debes usar plantilla para reanudar.

1.4. Costes por conversación

Meta cobra por conversación (no por mensaje), definida como bloque de 24h. Precios España (mayo 2026):

  • Utility: ~0,005 €
  • Marketing: ~0,08 €
  • Authentication: ~0,032 €
  • Service (iniciada por usuario): incluida en plan o ~0,005 €

2. Elegir proveedor

ProveedorProsContrasCuándo usarlo
Meta Cloud API (directo)Más barato, soporte oficial, datos EUCurva inicial altaVolumen >2k conversaciones/mes
TwilioDocumentación excelente, multicanalRecargo del 15-30% sobre precio MetaSi ya usas Twilio para SMS/voz
360dialogSoporte EU en español, integración rápidaSolo WhatsAppPymes españolas, volumen medio
VonageBuena en comunicaciones internacionalesMenos popularEmpresas que también usan Vonage Voice

Nuestra recomendación 2026: Meta Cloud API directo. Es la opción más rentable y soportada. Solo elige proveedor terceros si necesitas características adicionales (segmentación, plantillas avanzadas, omnichannel).

3. Setup paso a paso (Meta Cloud API)

3.1. Crear cuenta Meta Business y WABA

  1. Ve a business.facebook.com, crea cuenta de empresa.
  2. Verifica tu negocio (Meta pide documentación: CIF, web, dirección).
  3. Crea una App en developers.facebook.com.
  4. Añade el producto “WhatsApp” a tu App.
  5. Asigna un número de teléfono (puede ser uno nuevo o portar uno existente).

3.2. Obtener credenciales

Necesitarás:

  • PHONE_NUMBER_ID (de la sección WhatsApp > Configuración)
  • WABA_ID (WhatsApp Business Account ID)
  • ACCESS_TOKEN (genera uno permanente desde Business Settings > System Users)
  • APP_SECRET (para validar webhooks)
  • VERIFY_TOKEN (lo defines tú, usado en webhook handshake)

3.3. Webhook receptor en tu agente IA

Endpoint que recibe mensajes entrantes de usuarios y los procesa con tu LLM:

// app/api/whatsapp/webhook/route.ts (Next.js / Cloudflare Workers)
import crypto from "node:crypto";

const VERIFY_TOKEN = process.env.WHATSAPP_VERIFY_TOKEN!;
const APP_SECRET = process.env.WHATSAPP_APP_SECRET!;

export async function GET(req: Request) {
  const { searchParams } = new URL(req.url);
  const mode = searchParams.get("hub.mode");
  const token = searchParams.get("hub.verify_token");
  const challenge = searchParams.get("hub.challenge");
  if (mode === "subscribe" && token === VERIFY_TOKEN) {
    return new Response(challenge, { status: 200 });
  }
  return new Response("Forbidden", { status: 403 });
}

export async function POST(req: Request) {
  const body = await req.text();
  const signature = req.headers.get("x-hub-signature-256") ?? "";
  const expected = "sha256=" + crypto
    .createHmac("sha256", APP_SECRET)
    .update(body)
    .digest("hex");
  if (signature !== expected) {
    return new Response("Invalid signature", { status: 401 });
  }
  const data = JSON.parse(body);
  // Procesar mensajes entrantes
  for (const entry of data.entry ?? []) {
    for (const change of entry.changes ?? []) {
      const messages = change.value?.messages ?? [];
      for (const msg of messages) {
        await handleIncomingMessage(msg, change.value.metadata);
      }
    }
  }
  return new Response("OK", { status: 200 });
}

3.4. Handler del mensaje hacia el LLM

async function handleIncomingMessage(msg: any, meta: any) {
  const userPhone = msg.from;
  const userText = msg.text?.body ?? "";
  if (!userText) return;

  // 1. Recuperar historial de conversación (Redis, Durable Object, DB)
  const history = await getConversationHistory(userPhone);

  // 2. Llamar al LLM con contexto RAG
  const llmResponse = await callLLM({
    system: "Eres el agente IA de Acme. Responde en español, conciso, profesional.",
    history,
    userMessage: userText,
    rag: await searchKnowledgeBase(userText), // Pinecone, Qdrant, etc.
  });

  // 3. Guardar en historial
  await saveToHistory(userPhone, "user", userText);
  await saveToHistory(userPhone, "assistant", llmResponse);

  // 4. Enviar respuesta a WhatsApp
  await sendWhatsAppMessage(userPhone, llmResponse);
}

async function sendWhatsAppMessage(to: string, text: string) {
  const url = `https://graph.facebook.com/v22.0/${process.env.PHONE_NUMBER_ID}/messages`;
  await fetch(url, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.WHATSAPP_ACCESS_TOKEN}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      messaging_product: "whatsapp",
      to,
      type: "text",
      text: { body: text.slice(0, 4096) }, // límite WhatsApp
    }),
  });
}

3.5. Enviar plantilla para iniciar conversación

Cuando quieras iniciar una conversación (recordatorio, notificación, promoción), debes usar plantilla aprobada:

async function sendTemplate(to: string, templateName: string, params: string[]) {
  await fetch(
    `https://graph.facebook.com/v22.0/${process.env.PHONE_NUMBER_ID}/messages`,
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.WHATSAPP_ACCESS_TOKEN}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        messaging_product: "whatsapp",
        to,
        type: "template",
        template: {
          name: templateName,
          language: { code: "es" },
          components: [
            {
              type: "body",
              parameters: params.map((text) => ({ type: "text", text })),
            },
          ],
        },
      }),
    },
  );
}

4. Cumplimiento RGPD

Puntos críticos para no tener problemas con la AEPD:

4.1. DPA con Meta

Meta ofrece un Data Processing Addendum oficial. Se acepta automáticamente al crear WABA empresarial, pero conviene descargar copia.

4.2. Residencia de datos

WhatsApp Cloud API permite especificar región EU. En el setup de tu WABA, asegúrate de elegir Europe como almacenamiento. Si no, los mensajes pasan por servidores en EE.UU.

4.3. Consentimiento explícito

Antes de iniciar conversaciones (plantillas marketing), el usuario debe haber dado consentimiento explícito. Esto puede ser:

  • Casilla de aceptación en formulario web
  • Suscripción confirmada vía email (double opt-in)
  • Aceptación expresa en el primer mensaje del usuario

Guarda evidencia con timestamp.

4.4. Política de privacidad actualizada

Tu política debe mencionar:

  • Que usas WhatsApp Business para comunicación
  • Que Meta procesa los mensajes
  • Cómo el usuario puede ejercer derechos RGPD (acceso, borrado, etc.)
  • Que parte del procesamiento usa IA generativa

4.5. Derecho al olvido

Implementa endpoint que ante petición borra: historial conversacional, embeddings derivados, logs de prompts. No basta con borrar de tu DB si el LLM guarda nada (en OpenAI con DPA enterprise no guarda training data, pero sí logs 30 días).

5. Costes reales mes 1 (ejemplo)

Cliente: clínica dental, ~800 consultas/mes (mix recordatorios cita + FAQs + agendado).

ConceptoCoste mensual
Conversaciones service (FAQs, agendado, iniciadas por user)~3 €
Plantillas utility (recordatorios cita) — 600/mes~3 €
Plantillas marketing (promociones puntuales) — 50/mes~4 €
Tokens GPT-4o (200k tokens/mes promedio)~3 €
Hosting Cloudflare Workers + Qdrant managed~25 €
Total mensual~38 €

Reemplaza una persona que dedicaba ~6h/semana solo a recordatorios y FAQs. ROI a partir del mes 1.

6. Errores frecuentes

  • No verificar firma del webhook. Cualquiera puede hacer POST a tu endpoint si no validas la firma HMAC. Resultado: spam, ataques o DoS.
  • No respetar la ventana de 24h. Intentar enviar texto libre fuera de la ventana devuelve error 131047. Usa siempre plantilla.
  • Plantillas mal categorizadas. Si marcas como utility algo que es marketing, Meta lo recategoriza y cobra más. Sé honesto.
  • No paginar conversaciones largas. Si tu agente devuelve respuestas >4096 caracteres, fallan. Divide en mensajes consecutivos.
  • Olvidar el ratelimit. Cloud API permite 80 mensajes/segundo en cuentas nuevas. Para campañas grandes, planifica.

7. Siguiente paso

Si quieres implementar esto en tu empresa, tenemos plantillas reutilizables y experiencia en sectores como hostelería, salud, servicios profesionales y e-commerce. Te ahorramos las 2-3 semanas de aprendizaje técnico inicial.

Cuéntanos tu caso y te enviamos propuesta cerrada en 24-48h.

Lecturas relacionadas: