Arquitectura de la API: Cloud vs On-Premise
La WhatsApp Business API es la puerta de entrada para integrar WhatsApp en aplicaciones empresariales a escala. A diferencia de la app WhatsApp Business gratuita (pensada para negocios pequeños), la API permite enviar mensajes programáticamente, automatizar conversaciones y procesar miles de interacciones simultáneas. Si estás construyendo un agente inteligente por WhatsApp o cualquier sistema de comunicación automatizada, esta es la infraestructura que necesitas dominar.
Meta ofrece dos modelos de despliegue para la WhatsApp Business API, y la elección entre ellos impacta directamente tu arquitectura, costos y capacidad de mantenimiento.
Cloud API (recomendada)
La Cloud API es alojada y mantenida directamente por Meta. No necesitas levantar servidores propios ni gestionar contenedores Docker. Te conectas a los endpoints REST de Meta y listo. Esta es la opción que Meta recomienda activamente y donde concentra sus esfuerzos de desarrollo.
Las ventajas son significativas: cero infraestructura que mantener, actualizaciones automáticas de funcionalidades y seguridad, menor latencia en muchas regiones, soporte nativo para todas las features nuevas desde el día uno, y un proceso de onboarding que puede completarse en minutos en lugar de días. El endpoint base es https://graph.facebook.com/v21.0/ y todas las operaciones se realizan con llamadas HTTP estándar.
La Cloud API también ofrece mayor throughput por defecto: hasta 80 mensajes por segundo por número de teléfono y 200 requests por segundo por app. Para la mayoría de las empresas en Chile y Latinoamérica, estos límites son más que suficientes.
On-Premise API
La On-Premise API (también llamada "API local") requiere que instales y mantengas tus propios servidores usando contenedores Docker. Tú controlas la infraestructura completa: la base de datos (PostgreSQL o MySQL), los contenedores de la aplicación (webapp y coreapp), y toda la configuración de red.
Esta opción tiene sentido en escenarios muy específicos: empresas con requisitos regulatorios estrictos que exigen que los datos no salgan de su infraestructura, organizaciones con políticas de seguridad que prohíben depender de servicios cloud de terceros, o casos donde necesitas control absoluto sobre el entorno de ejecución. Sin embargo, Meta ha señalado que la On-Premise API recibirá menos inversión en nuevas funcionalidades comparada con Cloud API.
Para la gran mayoría de desarrolladores y empresas, Cloud API es la elección correcta. El resto de esta guía se centra en Cloud API, señalando diferencias con On-Premise solo cuando son relevantes.
Autenticación y tokens de acceso
Antes de enviar tu primer mensaje, necesitas configurar correctamente la autenticación. La WhatsApp Cloud API usa el sistema de autenticación de Meta (Graph API), basado en tokens de acceso OAuth 2.0.
Token temporal vs token permanente
Cuando creas tu app en Meta for Developers, obtienes un token temporal que dura 24 horas. Este token es útil para pruebas rápidas, pero no sirve para producción. Para un entorno productivo necesitas generar un System User Token que no expira (o tiene una expiración configurable de hasta 60 días).
El flujo para obtener un token permanente es:
- Ir a Meta Business Suite > Configuración del negocio > Usuarios del sistema
- Crear un usuario del sistema con rol de administrador
- Asignarle los assets necesarios (tu WhatsApp Business Account y la app)
- Generar un token con los permisos
whatsapp_business_managementywhatsapp_business_messaging
Seguridad del token
El token de acceso es la llave maestra de tu integración. Si alguien obtiene tu token, puede enviar mensajes desde tu número, leer conversaciones y modificar configuraciones. Las mejores prácticas incluyen:
- Nunca hardcodear tokens en el código fuente. Usa variables de entorno o un gestor de secretos (AWS Secrets Manager, Google Secret Manager, HashiCorp Vault)
- Rotar tokens periódicamente, idealmente cada 60 días o menos
- Usar permisos mínimos: si tu app solo envía mensajes, no necesita permisos de gestión de cuenta
- Monitorear el uso del token para detectar actividad sospechosa
Cada request a la API debe incluir el token en el header Authorization: Bearer {token}. Todas las comunicaciones son sobre HTTPS, así que el token viaja encriptado en tránsito.
Webhooks: configuración, eventos y verificación
Los webhooks son el mecanismo mediante el cual Meta te notifica en tiempo real sobre eventos que ocurren en tu cuenta: mensajes entrantes, cambios de estado de mensajes, actualizaciones de cuenta y más. Sin webhooks configurados, tu aplicación no puede recibir mensajes ni saber si los mensajes enviados fueron entregados o leídos.
Configuración del endpoint
Tu servidor necesita exponer un endpoint HTTPS público que Meta pueda alcanzar. Este endpoint debe manejar dos tipos de requests:
- GET: para la verificación inicial del webhook (Meta confirma que el endpoint es tuyo)
- POST: para recibir las notificaciones de eventos en tiempo real
El endpoint debe responder en menos de 5 segundos. Si tu procesamiento toma más tiempo, responde con un 200 inmediatamente y procesa el evento de forma asíncrona en una cola (SQS, Redis, RabbitMQ). Si Meta no recibe respuesta en 5 segundos, reintentará el envío con backoff exponencial, y si falla consistentemente, desactivará tu webhook.
Verificación del webhook
Cuando configuras el webhook en Meta for Developers, Meta envía un request GET con tres parámetros: hub.mode (siempre "subscribe"), hub.challenge (un string aleatorio) y hub.verify_token (un string que tú definiste). Tu endpoint debe verificar que el verify_token coincide con el que configuraste y responder con el valor de hub.challenge.
// Ejemplo de verificación en Node.js
app.get('/webhook', (req, res) => {
const mode = req.query['hub.mode'];
const token = req.query['hub.verify_token'];
const challenge = req.query['hub.challenge'];
if (mode === 'subscribe' && token === VERIFY_TOKEN) {
res.status(200).send(challenge);
} else {
res.sendStatus(403);
}
});
Eventos principales
Los eventos que recibirás por webhook se agrupan en el campo entry[].changes[].field. Los más importantes son:
- messages: mensajes entrantes del usuario (texto, imagen, audio, documento, ubicación, contactos, botones interactivos)
- statuses: actualizaciones de estado de mensajes enviados (sent, delivered, read, failed)
- message_template_status_update: cambios en el estado de aprobación de tus templates
- account_update: cambios en la configuración de tu cuenta (verificación, restricciones)
- phone_number_quality_update: cambios en la calificación de calidad de tu número
Validación de firma
Cada request POST que Meta envía a tu webhook incluye un header X-Hub-Signature-256 con un HMAC SHA-256 del payload, firmado con tu App Secret. Siempre debes validar esta firma antes de procesar el evento para evitar que un atacante inyecte eventos falsos en tu sistema. Si estás construyendo un agente inteligente, esta validación es crítica para la seguridad de tus usuarios.
// Validación de firma en Node.js
const crypto = require('crypto');
function verifySignature(payload, signature, appSecret) {
const expectedSig = crypto
.createHmac('sha256', appSecret)
.update(payload)
.digest('hex');
return `sha256=${expectedSig}` === signature;
}
Templates de mensajes: tipos, aprobación y variables
Los templates (o plantillas) son mensajes pre-aprobados por Meta que puedes enviar a usuarios fuera de la ventana de 24 horas. Son la única forma de iniciar conversaciones proactivamente y son fundamentales para campañas de marketing, notificaciones transaccionales y flujos de re-engagement.
Categorías de templates
Meta clasifica los templates en tres categorías, cada una con precios y políticas de aprobación diferentes:
- Marketing: promociones, ofertas, newsletters, invitaciones a eventos. Son los más caros y los más escrutinizados en la aprobación. Requieren que el usuario haya dado consentimiento explícito (opt-in)
- Utility: confirmaciones de pedido, actualizaciones de envío, recordatorios de citas, alertas de cuenta. Tienen un precio intermedio y una aprobación más rápida
- Authentication: códigos OTP, verificación de dos factores, confirmación de identidad. Son los más baratos y tienen un formato estandarizado con botón de auto-llenado
Estructura de un template
Un template puede incluir los siguientes componentes:
- Header (opcional): texto, imagen, video o documento. El header con media es especialmente efectivo para marketing
- Body (obligatorio): el texto principal del mensaje, con soporte para variables dinámicas usando la sintaxis
{{1}},{{2}}, etc. - Footer (opcional): texto pequeño, típicamente usado para disclaimers o información legal
- Buttons (opcional): hasta 3 botones, que pueden ser de tipo URL (abre un enlace), de tipo teléfono (inicia una llamada) o de respuesta rápida (envía un texto predefinido)
Variables dinámicas
Las variables permiten personalizar cada mensaje enviado. Al crear el template defines placeholders como {{1}}, {{2}}, etc., y al enviar el mensaje proporcionas los valores reales. Por ejemplo, un template de confirmación de pedido podría ser:
Hola {{1}}, tu pedido #{{2}} ha sido confirmado. El monto total es ${{3}} y será entregado el {{4}}. Gracias por tu compra.
Las variables tienen restricciones: no pueden contener saltos de línea, no pueden ser el único contenido del body, y deben tener valores de ejemplo al momento de enviar el template a aprobación.
Proceso de aprobación
Cada template debe ser aprobado por Meta antes de poder usarse. El proceso típico:
- Creas el template via API (
POST /{WABA_ID}/message_templates) o desde el Business Manager - Meta revisa el template (automática y/o manualmente). La mayoría se aprueba en menos de 1 hora
- Recibes una notificación via webhook (
message_template_status_update) con el resultado: APPROVED, REJECTED o PAUSED
Si un template es rechazado, puedes editarlo y reenviarlo. Los motivos de rechazo más comunes son: contenido que viola las políticas de comercio de Meta, templates demasiado genéricos sin valor claro para el usuario, o variables de ejemplo que no coinciden con el uso real.
Sesiones y la ventana de 24 horas
Uno de los conceptos más importantes (y más confusos para desarrolladores nuevos) es el modelo de sesiones y ventanas de conversación de WhatsApp. Entender cómo funcionan es esencial para diseñar flujos correctos y controlar costos.
Cómo funciona la ventana
Cuando un usuario te envía un mensaje, se abre una ventana de servicio de 24 horas. Durante estas 24 horas, puedes responder con mensajes de texto libre (sin usar templates). Cada nuevo mensaje del usuario reinicia el contador de 24 horas. Si el usuario no envía un nuevo mensaje y las 24 horas expiran, solo puedes contactarlo usando templates pre-aprobados.
Este modelo existe para proteger a los usuarios de spam. Meta quiere asegurar que las empresas no bombardeen a los usuarios con mensajes no solicitados. En la práctica, esto significa que tu arquitectura debe rastrear el estado de la ventana para cada conversación activa.
Tipos de conversaciones y pricing
Meta cobra por conversación, no por mensaje individual. Una conversación es un período de 24 horas que se abre cuando envías un mensaje. Los tipos son:
- Service conversation: se abre cuando respondes a un mensaje del usuario dentro de la ventana de 24h. Las primeras 1,000 conversaciones de servicio por mes son gratuitas
- Marketing conversation: se abre cuando envías un template de categoría marketing
- Utility conversation: se abre cuando envías un template de categoría utility
- Authentication conversation: se abre cuando envías un template de categoría authentication
Un punto crítico: si un usuario te envía un mensaje y tú respondes con un template de marketing (en lugar de texto libre), se abrirán dos conversaciones: una de servicio y una de marketing. Esto duplica el costo. La mejor práctica es responder con texto libre dentro de la ventana y reservar los templates para comunicaciones proactivas fuera de la ventana.
Gestión de ventanas en tu backend
Tu sistema necesita trackear el timestamp del último mensaje de cada usuario para saber si la ventana está abierta o cerrada. Una implementación típica incluye:
- Almacenar
last_user_message_aten tu base de datos por cada contacto - Antes de enviar un mensaje, verificar si
now() - last_user_message_at < 24 horas - Si la ventana está cerrada, usar un template; si está abierta, enviar texto libre
- Implementar alertas cuando una conversación importante está por cerrar su ventana (por ejemplo, a las 23 horas)
Si estás desarrollando una solución a medida, este manejo de ventanas debe ser una pieza central de tu arquitectura desde el diseño inicial.
Envío de media: imágenes, documentos y audio
La API soporta el envío y recepción de múltiples tipos de media. Los mensajes con media tienen tasas de engagement significativamente más altas que los mensajes de solo texto, especialmente en contextos de marketing y soporte.
Tipos de media soportados
- Imágenes: JPEG y PNG, hasta 5 MB. Ideales para catálogos de productos, comprobantes de pago, infografías
- Documentos: PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX y más, hasta 100 MB. Perfectos para facturas, contratos, cotizaciones
- Audio: AAC, MP4 audio, AMR, MP3, OGG (solo Opus), hasta 16 MB. Útil para mensajes de voz automatizados
- Video: MP4 (codec H.264, audio AAC), hasta 16 MB. Funciona bien para demos de productos o tutoriales cortos
- Stickers: WebP, hasta 100 KB (estáticos) o 500 KB (animados). Un toque de personalidad en conversaciones de soporte
Dos métodos para enviar media
Puedes enviar media de dos formas:
1. Por URL: proporcionas una URL pública donde está alojado el archivo. Meta descarga el archivo desde tu servidor al momento de enviar el mensaje. La URL debe ser accesible públicamente (sin autenticación) y servir los headers de Content-Type correctos.
// Envío de imagen por URL
POST https://graph.facebook.com/v21.0/{PHONE_NUMBER_ID}/messages
{
"messaging_product": "whatsapp",
"to": "56912345678",
"type": "image",
"image": {
"link": "https://tu-servidor.com/imagen.jpg",
"caption": "Cotización actualizada"
}
}
2. Por Media ID: primero subes el archivo a los servidores de Meta y obtienes un Media ID. Luego usas ese ID para enviar el mensaje. El archivo se almacena en los servidores de Meta por 30 días. Este método es más confiable porque no depende de la disponibilidad de tu servidor en el momento del envío.
// Paso 1: Subir el archivo
POST https://graph.facebook.com/v21.0/{PHONE_NUMBER_ID}/media
Content-Type: multipart/form-data
messaging_product: whatsapp
file: @documento.pdf
type: application/pdf
// Respuesta: { "id": "media_id_123" }
// Paso 2: Enviar usando el Media ID
POST https://graph.facebook.com/v21.0/{PHONE_NUMBER_ID}/messages
{
"messaging_product": "whatsapp",
"to": "56912345678",
"type": "document",
"document": {
"id": "media_id_123",
"filename": "cotizacion-abril-2026.pdf"
}
}
Recepción de media
Cuando un usuario envía media, el webhook incluye un media_id pero no el archivo en sí. Debes hacer un request GET a /{media_id} para obtener la URL de descarga temporal, y luego descargar el archivo desde esa URL. Las URLs de descarga expiran, así que descarga el archivo inmediatamente y almacénalo en tu infraestructura (S3, GCS, etc.).
Catálogos y commerce
La WhatsApp Business API incluye funcionalidades de comercio electrónico que permiten a las empresas mostrar productos directamente en WhatsApp sin necesidad de que el usuario salga de la app. Esto es especialmente poderoso para empresas de retail, restaurantes y servicios que operan en Chile.
Configuración del catálogo
Los catálogos se gestionan a través del Commerce Manager de Meta. Puedes subir productos manualmente o sincronizarlos automáticamente desde tu ecommerce mediante un feed de datos (CSV, XML o integración directa con plataformas como Shopify). Cada producto incluye: nombre, descripción, precio, URL de imagen, SKU y disponibilidad.
Una vez configurado el catálogo en Commerce Manager, lo vinculas a tu número de WhatsApp Business. A partir de ahí, puedes enviar mensajes con productos específicos o con secciones completas del catálogo.
Mensajes de producto único
Permiten destacar un producto específico con imagen, nombre, precio y un botón "Ver producto". El usuario puede ver los detalles y agregar el producto a su carrito sin salir de WhatsApp. Este tipo de mensaje es ideal para recomendaciones personalizadas basadas en el historial de compra o las preferencias del cliente.
Mensajes de lista de productos
Permiten enviar hasta 30 productos organizados en secciones. El usuario ve un botón "Ver artículos" que abre una interfaz tipo catálogo dentro de WhatsApp. Puede navegar por las secciones, ver detalles de cada producto y agregar múltiples items a su carrito. Este formato funciona especialmente bien para menús de restaurantes, catálogos de temporada o selecciones curadas.
Flujo de compra
Cuando el usuario selecciona productos y "envía" su carrito, tu webhook recibe un evento de tipo order con la lista de productos seleccionados, cantidades y el texto que el usuario haya agregado. A partir de ahí, tu sistema puede confirmar la orden, calcular el total con envío, y guiar al usuario hacia el pago. Si tienes un equipo de desarrollo trabajando en la integración, este flujo de commerce puede reducir significativamente la fricción de compra comparado con redirigir al usuario a un sitio web externo.
Rate limits y buenas prácticas de envío
Entender los rate limits de la WhatsApp API es crucial para evitar errores, bloqueos y degradación de la calidad de tu número. Meta implementa múltiples capas de limitación que debes respetar.
Tiers de mensajería
Tu capacidad de envío está determinada por el tier de tu número de teléfono. Los tiers se asignan automáticamente según tu volumen y calidad:
- Tier 1: hasta 1,000 conversaciones únicas por cada período de 24 horas
- Tier 2: hasta 10,000 conversaciones únicas por cada período de 24 horas
- Tier 3: hasta 100,000 conversaciones únicas por cada período de 24 horas
- Tier 4: conversaciones ilimitadas
Para subir de tier, necesitas enviar al menos el 50% de tu capacidad actual durante un período de 7 días consecutivos, manteniendo una calificación de calidad "Alta" o "Media". Si tu calidad baja a "Baja", Meta puede reducir tu tier o restringir tu número.
Rate limits de la API
Más allá de los tiers de conversaciones, la API tiene límites de llamadas:
- Cloud API: 80 mensajes por segundo por número de teléfono, 200 requests por segundo por app
- On-Premise API: varía según tu infraestructura, pero típicamente 70 mensajes por segundo
- Media uploads: 100 uploads por hora por app
- Templates API: 10 requests por segundo para gestión de templates
Calidad del número
Meta monitorea la calidad de tu número de teléfono basándose en señales de los usuarios: reportes de spam, bloqueos y tasas de lectura. La calidad se clasifica en Verde (Alta), Amarillo (Media) y Rojo (Baja). Si caes a calidad Baja, Meta puede:
- Reducir tu tier de mensajería
- Poner tu número en estado "Flagged" (con restricciones de envío)
- En casos extremos, deshabilitar tu número completamente
Buenas prácticas para mantener alta calidad
- Solo enviar mensajes a contactos que dieron opt-in explícito. Nunca comprar listas ni enviar mensajes no solicitados
- Ofrecer siempre una opción de opt-out clara en tus templates de marketing
- Segmentar tu audiencia: no enviar el mismo template genérico a toda tu base. La relevancia reduce los reportes de spam
- Monitorear las métricas de calidad diariamente via API o Business Manager
- Escalar gradualmente: no pasar de 100 a 10,000 mensajes diarios de golpe
- Respetar horarios: evitar envíos en horarios nocturnos. En Chile, idealmente entre 9:00 y 20:00
Si necesitas enviar campañas masivas a miles de contactos, considera usar un servicio profesional como los agentes de WhatsApp Business API que ya tienen la infraestructura optimizada para alto volumen con alta calidad.
Monitoreo y debugging
Cuando algo falla en tu integración con WhatsApp (y algo va a fallar), necesitas las herramientas adecuadas para diagnosticar y resolver problemas rápidamente. La API ofrece varias vías de monitoreo que todo desarrollador debe conocer.
Códigos de error comunes
La API retorna errores con códigos numéricos y mensajes descriptivos. Los más frecuentes son:
- 131047 - Re-engagement message: intentaste enviar un mensaje de texto libre fuera de la ventana de 24 horas. Solución: usar un template aprobado
- 131026 - Message undeliverable: el número de destino no tiene WhatsApp o está desactivado. Tu sistema debe marcar estos números para no reintentar
- 130429 - Rate limit hit: superaste el rate limit. Implementa exponential backoff y retry
- 132015 - Template paused or disabled: tu template fue pausado por baja calidad. Revisa las métricas y crea un template nuevo mejorado
- 131053 - Media upload error: el archivo excede el tamaño máximo o el formato no es soportado
- 131031 - Business account locked: tu cuenta fue restringida. Contacta soporte de Meta inmediatamente
Logs y trazabilidad
Cada mensaje enviado recibe un wamid (WhatsApp Message ID) que debes almacenar en tu base de datos. Este ID te permite rastrear el ciclo de vida completo del mensaje a través de los status webhooks: sent > delivered > read (o failed). Implementa un sistema de logging que registre:
- Timestamp de envío y de cada cambio de status
- El request completo enviado a la API (sanitizando datos personales)
- La respuesta de la API (código HTTP + body)
- El wamid para correlación con webhooks de status
Dashboard de Meta Business
Meta proporciona un dashboard en el Business Manager con métricas agregadas: mensajes enviados/entregados/leídos, calidad del número, estado de templates, y costos. Revisa este dashboard diariamente durante las primeras semanas de tu integración y semanalmente una vez estabilizada.
Health checks y alertas
Tu sistema de monitoreo debería incluir alertas para:
- Tasa de error superior al 5% en envíos de mensajes
- Webhook downtime: si tu endpoint deja de responder, pierdes mensajes entrantes. Implementa health checks cada minuto
- Caída en la calidad del número de Verde a Amarillo
- Templates rechazados o pausados: actúa inmediatamente para reemplazarlos
- Token próximo a expirar: si usas tokens con expiración, monitorea y rota proactivamente
Para proyectos complejos, herramientas como Datadog, New Relic o Grafana con Prometheus son ideales para visualizar métricas de tu integración en tiempo real. Si no tienes la infraestructura de monitoreo, solicita un diagnóstico gratuito y te ayudamos a diseñar la arquitectura de observabilidad adecuada para tu caso.
Preguntas frecuentes sobre la WhatsApp Business API
¿Cuál es la diferencia entre WhatsApp Cloud API y On-Premise API?
¿Cuánto cuesta usar la WhatsApp Business API?
¿Cuánto demora la aprobación de un template de WhatsApp?
¿Qué pasa si envío un mensaje fuera de la ventana de 24 horas?
¿Cuáles son los rate limits de la WhatsApp Business API?
¿Necesito un BSP o puedo conectarme directo a la API de Meta?
¿Necesitas integrar WhatsApp en tu negocio?
Te ayudamos a diseñar e implementar la arquitectura correcta para tu caso. Diagnóstico gratuito con recomendaciones técnicas personalizadas. Sin compromiso.
Solicita tu Diagnóstico Gratuito
Déjanos tus datos y te contactamos en menos de 24 horas.
¡Solicitud Recibida!
Te contactaremos en menos de 24 horas.