Cómo Automatizar el WhatsApp de una Empresa con la Cloud API
La ventana de 24 horas, las plantillas aprobadas y lo que Meta exige: lo que decide un proyecto de WhatsApp antes de escribir la primera línea.

1. Las dos vías, y por qué la elección condiciona todo lo demás
Hay dos formas de tener WhatsApp en un negocio, y confundirlas es el error que hace perder semanas. La **aplicación WhatsApp Business** es gratuita, se instala en el móvil y sirve para responder a mano. Tiene respuestas rápidas y etiquetas, pero no tiene API: no se conecta a un CRM, no recibe webhooks, no automatiza nada serio. La **WhatsApp Cloud API**, de Meta, es la vía para automatizar. Es una API HTTP alojada por Meta, sin servidor de por medio. Permite recibir mensajes por webhook, responder por programa e integrar con lo que quieras. La diferencia práctica: en la aplicación el número vive en el móvil; en la Cloud API el número pasa a pertenecer a una cuenta de WhatsApp Business y **deja de funcionar en la aplicación**. No hay término medio, y la migración no se deshace con un clic. Decide esto antes de escribir una línea de código. Si el número que quieres automatizar es el que tu equipo usa en el móvil, necesitas otro número.
2. La ventana de 24 horas: la regla que frena a todo el mundo
Esta es la parte que casi ningún tutorial explica, y la que determina qué puedes construir. Cuando alguien te envía un mensaje, se abre una **ventana de 24 horas** durante la cual puedes responder con texto libre — lo que quieras, las veces que quieras. Pasadas esas 24 horas sin un nuevo mensaje del cliente, la ventana se cierra. Con la ventana cerrada, **solo puedes enviar plantillas aprobadas previamente por Meta**. Nada de texto libre. Y aprobar una plantilla lleva tiempo: envías el texto, Meta lo revisa, y puede rechazarlo por motivos que van de la promoción agresiva al formato. Lo que esto implica en el diseño: - Un bot que responde a quien escribe primero es sencillo — siempre está dentro de la ventana - Un sistema que inicia conversaciones necesita plantillas aprobadas para cada tipo de mensaje - Recordatorios, confirmaciones y seguimientos tienen que ser plantillas, pensadas con antelación Diseña el flujo alrededor de esta regla desde el principio. Descubrirla después de construir obliga a rehacer.
3. Lo que Meta exige antes de dejarte enviar
La cuenta no se abre en cinco minutos. Necesitas: **Una cuenta Meta Business** con el negocio identificado. Para límites de envío más altos y para el sello de verificación, Meta pide documentación de la empresa — escritura, domicilio, justificante de actividad. Un profesional independiente puede empezar, pero con límites más bajos. **Un número de teléfono** que no esté activo en la aplicación de WhatsApp, capaz de recibir SMS o llamada para el código de confirmación. **Un endpoint HTTPS** público para el webhook, con certificado válido. Meta no entrega a direcciones sin TLS ni a IPs. **Una plantilla de mensaje aprobada**, si pretendes iniciar conversaciones. Los **límites de envío** empiezan bajos y suben según la calidad de tus conversaciones — si mucha gente te bloquea o denuncia, bajan. No compres listas ni envíes a quien no lo pidió: además de ilegal en la UE sin consentimiento, destruye la puntuación de calidad y puede costarte el número.
4. Recibir mensajes: el webhook
Meta valida tu endpoint con una petición `GET` que trae un desafío. Debes devolver el valor de `hub.challenge` en texto plano, y solo si el `hub.verify_token` coincide con el que configuraste. Fallar esto es el motivo más común de que la suscripción no se active. Tras la validación, los mensajes llegan por `POST`. Fíjate en dos detalles que muerden: Meta **repite** entregas cuando no recibe un `200` rápido, así que responde de inmediato y procesa después; y el payload viene anidado en `entry[].changes[].value.messages[]`, no en la raíz.
import os
from fastapi import FastAPI, Request, Response, BackgroundTasks
app = FastAPI()
VERIFY_TOKEN = os.environ["WA_VERIFY_TOKEN"]
@app.get("/webhook")
async def verificar(request: Request):
p = request.query_params
if p.get("hub.mode") == "subscribe" and p.get("hub.verify_token") == VERIFY_TOKEN:
# Texto simples, não JSON: a Meta compara byte a byte.
return Response(content=p.get("hub.challenge"), media_type="text/plain")
return Response(status_code=403)
@app.post("/webhook")
async def receber(request: Request, tarefas: BackgroundTasks):
body = await request.json()
for entry in body.get("entry", []):
for change in entry.get("changes", []):
for msg in change["value"].get("messages", []):
tarefas.add_task(tratar, msg["from"], msg.get("text", {}).get("body", ""))
# Confirmar já: a Meta repete a entrega se demorares.
return Response(status_code=200)5. Responder por la Cloud API
Enviar es un `POST` al endpoint de mensajes de tu número, autenticado con un token. Dentro de la ventana de 24 horas envías texto libre; fuera de ella, solo plantillas. Guarda el `phone_number_id` y el token en variables de entorno. El token da acceso de envío en nombre de tu negocio — trátalo como cualquier otra credencial.
import os, httpx
PHONE_ID = os.environ["WA_PHONE_NUMBER_ID"]
TOKEN = os.environ["WA_TOKEN"]
BASE = f"https://graph.facebook.com/v21.0/{PHONE_ID}/messages"
HEADERS = {"Authorization": f"Bearer {TOKEN}"}
async def responder(para: str, texto: str):
"""Texto livre. Só funciona dentro da janela de 24 horas."""
async with httpx.AsyncClient(timeout=15) as c:
r = await c.post(BASE, headers=HEADERS, json={
"messaging_product": "whatsapp",
"to": para,
"type": "text",
"text": {"body": texto},
})
r.raise_for_status()
async def enviar_modelo(para: str, nome: str, variaveis: list[str]):
"""Fora da janela, só modelos previamente aprovados pela Meta."""
async with httpx.AsyncClient(timeout=15) as c:
r = await c.post(BASE, headers=HEADERS, json={
"messaging_product": "whatsapp",
"to": para,
"type": "template",
"template": {
"name": nome,
"language": {"code": "pt_PT"},
"components": [{
"type": "body",
"parameters": [{"type": "text", "text": v} for v in variaveis],
}],
},
})
r.raise_for_status()6. Guardar el estado de la conversación
WhatsApp no te da sesiones. Cada mensaje llega aislado, identificado solo por el número de teléfono. Si tu flujo tiene más de un paso, el estado es cosa tuya. Lo mínimo que funciona es una tabla indexada por el número, con el paso actual, los datos recogidos hasta ahí y la hora del último mensaje — esta última sirve para saber si la ventana de 24 horas sigue abierta. Dos trampas. Primera: la misma persona puede escribir varias veces seguidas, y las entregas pueden llegar desordenadas; trata el estado con cuidado en concurrencia. Segunda: las conversaciones se quedan a medias. Define un tiempo tras el cual el estado caduca, o acumularás flujos abandonados para siempre.
7. Añadir un modelo de lenguaje
Es aquí donde la mayoría de los proyectos se estropea: conectan un modelo directamente a WhatsApp y lo dejan responder a todo. Lo que funciona es más estrecho. Usa el modelo para **clasificar** la intención, **extraer** datos de texto libre — fechas, nombres, referencias — y **reformular** respuestas que ya tienes. Deja la lógica de negocio en código. Tres reglas que evitan los problemas habituales: **Limita el alcance en el prompt y verifica la salida.** Un modelo que inventa precios o compromete plazos te crea una obligación con un cliente. **Prevé el paso a humano.** Cuando el modelo no sabe, o cuando la persona lo pide, deriva. Un bot que no deja hablar con nadie cuesta más clientes de los que convierte. **No reenvíes datos sensibles sin pensar.** Si la conversación incluye datos personales, se los estás enviando al proveedor del modelo. Eso tiene implicaciones en el RGPD y debe constar en tu política de privacidad.
8. Construir desde cero o usar una plataforma
Existen plataformas que se colocan entre tú y la Cloud API — ManyChat, Twilio, 360dialog y otras. Tienen sentido en ciertos casos y en otros no. **Compensan** cuando quien va a mantener el flujo no programa, cuando necesitas un constructor visual para que el equipo lo toque, o cuando quieres empezar hoy sin ocuparte de servidor ni webhook. **No compensan** cuando la lógica es específica de tu negocio, cuando el volumen hace la mensualidad más cara que el coste propio, o cuando necesitas integraciones que la plataforma no tiene. Hay un coste menos visible: quedas atado a su modelo de datos. Migrar flujos de una plataforma a otra, o a código propio, suele ser reescribir desde cero. A medio camino, herramientas de automatización como n8n o Make se conectan a la Cloud API sin atarte a un constructor cerrado — y n8n puedes alojarlo tú.
9. Consentimiento y RGPD
WhatsApp es un canal personal, y la ley lo trata como tal. **Necesitas consentimiento** para enviar mensajes a alguien que no te contactó primero. El consentimiento debe ser específico para este canal — tener el número de un cliente por una factura no autoriza mensajes comerciales. **Guarda la prueba** de cuándo y cómo se dio. Si la AEPD o la CNPD preguntan, la respuesta es un registro, no una afirmación. **Facilita la salida.** Una instrucción clara para dejar de recibir, que funcione a la primera, y que respetes. **Di que es un bot.** El Reglamento de IA de la UE impone transparencia cuando alguien interactúa con un sistema de IA. Una frase en el primer mensaje lo resuelve, y no cuesta conversión — la gente se da cuenta de que es automático igualmente. Tu política de privacidad debe decir qué datos recoges por este canal, cuánto tiempo los guardas y con qué proveedores los compartes.
10. Costes y cuándo no compensa
Meta cobra por el uso de la Cloud API, y el modelo de precios ya ha cambiado más de una vez — por conversación, por mensaje, con categorías distintas según quién inicia. No te doy cifras porque envejecen rápido: consulta la tabla oficial el día que decidas, y comprueba cuál aplica a tu país. A eso se suma el coste de lo que construyas alrededor: servidor, mantenimiento, y el modelo de lenguaje si usas uno. **Cuándo no compensa:** si recibes pocos mensajes al día, una persona respondiendo en la aplicación es más barata y responde mejor. La automatización empieza a valer cuando el volumen repetitivo es constante, cuando necesitas responder fuera de horario, o cuando la misma pregunta llega decenas de veces por semana. Antes de construir, cuenta durante una semana cuántos mensajes recibes y cuántos son realmente repetidos. Si la mayoría son específicos, automatizar no te ahorra tiempo — lo cambia de sitio.
Preguntas Frecuentes (FAQ)
¿Puedo automatizar el número que ya uso en la aplicación WhatsApp Business?
Puedes migrarlo a la Cloud API, pero deja de funcionar en la aplicación — no hay uso simultáneo. Si tu equipo responde desde el móvil en ese número, usa otro para automatizar.
¿Cuánto tarda la aprobación de una plantilla de mensaje?
Varía, y puede ser rechazada. Envía las plantillas con antelación en lugar de la víspera de necesitarlas, y evita el texto promocional agresivo, que es el motivo de rechazo más común.
¿El webhook tiene que estar en un servidor propio?
No. Sirve cualquier endpoint HTTPS público con certificado válido — una función serverless lo resuelve. Lo que Meta no acepta es HTTP simple ni direcciones IP.
¿Necesito empresa registrada para usar la Cloud API?
Para empezar y probar, no. Para límites de envío más altos y para el sello de verificación, Meta pide documentación del negocio. Un profesional independiente puede operar, con límites más bajos.
¿Qué pasa si mi puntuación de calidad baja?
Los límites de envío bajan, y en casos persistentes el número puede quedar restringido. La causa habitual es enviar a quien no lo pidió. Consentimiento explícito y una salida fácil protegen la puntuación mejor que cualquier truco.