Install
openclaw skills install whatsapp-business-latamConfiguración completa de WhatsApp Business API (oficial Meta) para PyMEs de Argentina y LATAM. Actívate cuando el usuario mencione: WhatsApp Business, WA API, Meta Business Manager, webhook de WhatsApp, templates HSM, mensajes de WhatsApp automatizados, integrar WhatsApp con OpenClaw, configurar WhatsApp para el agente, o cuando pregunte cómo enviar mensajes de WhatsApp desde el agente. Cubre setup end-to-end, templates listos en español para los casos de uso más comunes de PyMEs (turnos, pagos, vencimientos, notificaciones), compliance para evitar bloqueos de cuenta, y guía de integración con openclaw.config.json. Solo API oficial de Meta — nunca librerías no oficiales.
openclaw skills install whatsapp-business-latamGuía de configuración completa de la WhatsApp Business API oficial de Meta para PyMEs en Argentina y LATAM. Integración con OpenClaw, templates HSM en español, compliance, y guía anti-ban.
⚠️ Solo API oficial. Este skill cubre exclusivamente la API oficial de Meta (WhatsApp Business Platform). Nunca usar librerías no oficiales como Baileys, whatsapp-web.js, WPPConnect, o similares en producción — violan los Términos de Servicio de WhatsApp y resultan en baneo permanente del número. Ver sección "Anti-ban" al final.
wa setup # Guía de setup paso a paso desde cero
wa setup <paso> # Paso específico (ej: "wa setup meta-business")
wa template <tipo> # Template HSM listo para copiar (ver lista abajo)
wa templates # Lista todos los templates disponibles
wa checklist # Checklist anti-ban completo
wa config # Muestra el bloque de config para openclaw.json
wa webhook # Instrucciones de configuración del webhook
wa test # Cómo enviar un mensaje de prueba con curl
wa compliance # Reglas de compliance Meta para no perder la cuenta
wa costos # Estimación de costos de la API para PyMEs argentinas
wa ayuda # Este menú
~/centriqs/whatsapp/
├── config.md # Tokens, números, IDs (ver nota de seguridad)
├── templates/ # Templates HSM personalizados del usuario
│ └── aprobados.md # Templates aprobados por Meta con sus IDs
└── logs/ # Log de envíos (opcional)
🔒 Seguridad:
~/centriqs/whatsapp/config.mdpuede contener tokens de acceso. Asegurar que el directorio tenga permisoschmod 700 ~/centriqs/whatsapp/. Nunca compartir el contenido de este archivo en canales públicos o grupos.
# Configuración WhatsApp Business API
## Credenciales (completar después del setup)
phone_number_id: "" # ID del número en Meta Business Manager
whatsapp_business_account_id: "" # WABA ID
access_token: "" # Token de acceso permanente (System User)
webhook_verify_token: "" # Token de verificación del webhook (elegido por vos)
app_id: "" # App ID en Meta for Developers
## Número
numero_whatsapp: "" # Formato: +5491112345678
nombre_display: "" # Nombre que verán los contactos
## Estado
cuenta_verificada: false # true cuando Meta aprueba la cuenta de negocio
templates_aprobados: 0 # Cantidad de templates aprobados
Prerequisito obligatorio. Si ya tenés una cuenta empresarial de Facebook/Meta, saltar al paso 2.
business.facebook.comhola@tudominio.com, no Gmail personal)⚠️ Usar datos reales del negocio. Las cuentas con datos falsos o inconsistentes son marcadas como spam por los algoritmos de Meta y pueden ser suspendidas.
developers.facebook.com[NombreEmpresa] WA Bot (ej: Centriqs WA Bot)Guardar en config.md: el App ID que aparece en el dashboard de la app.
Dentro de la app en Meta for Developers, ir a WhatsApp → Getting Started
Meta provee un número de prueba gratuito para testing (solo para 5 contactos)
Para producción: agregar un número real dedicado
Proceso de verificación del número:
+5491112345678Guardar en config.md:
phone_number_id (aparece en la sección del número)whatsapp_business_account_id (WABA ID)El token temporal de prueba expira en 24 horas. Para producción, crear un System User con token permanente:
whatsapp_business_messagingwhatsapp_business_managementGuardar en config.md: access_token
🔒 Este token tiene acceso completo al número de WhatsApp. Tratar como una contraseña. Rotarlo si se sospecha que fue comprometido desde Meta Business Suite.
El webhook es la URL donde Meta envía los mensajes que recibe tu número. OpenClaw necesita exponerse como servidor para recibirlos.
Opción A — Vercel (recomendada para Centriqs):
Crear un endpoint en tu proyecto de Vercel en centriqs.io/api/whatsapp:
// api/whatsapp.js (Next.js / Vercel serverless function)
export default function handler(req, res) {
if (req.method === 'GET') {
// Verificación inicial del webhook por Meta
const mode = req.query['hub.mode'];
const token = req.query['hub.verify_token'];
const challenge = req.query['hub.challenge'];
if (mode === 'subscribe' && token === process.env.WEBHOOK_VERIFY_TOKEN) {
return res.status(200).send(challenge);
}
return res.status(403).end();
}
if (req.method === 'POST') {
// Reenviar el payload a OpenClaw (webhook local o túnel)
// Implementar según arquitectura: ngrok en dev, VPS en producción
console.log('Mensaje entrante:', JSON.stringify(req.body, null, 2));
return res.status(200).json({ status: 'ok' });
}
}
Variable de entorno en Vercel: WEBHOOK_VERIFY_TOKEN=<tu_token_elegido>
Opción B — VPS del cliente (producción):
Para clientes en managed services, el webhook apunta al VPS del cliente. OpenClaw escucha en el puerto configurado (por defecto 3000 o el que definas).
Configurar el webhook en Meta:
https://centriqs.io/api/whatsapp (o la URL de tu VPS)webhook_verify_token en tu config.mdmessages, message_deliveries, message_readsAgregar el canal de WhatsApp en la configuración de OpenClaw:
// ~/.openclaw/openclaw.json — sección "channels"
{
"channels": {
"whatsapp": {
"enabled": true,
"provider": "meta-cloud-api",
"phoneNumberId": "<phone_number_id_de_config.md>",
"accessToken": "<access_token_de_config.md>",
"webhookVerifyToken": "<webhook_verify_token_de_config.md>",
"webhookPath": "/webhook/whatsapp",
"wabaId": "<whatsapp_business_account_id_de_config.md>"
}
}
}
⚠️ No hardcodear tokens directamente en
openclaw.jsonsi el archivo es accesible desde el repositorio. Usar variables de entorno y referenciarlas con${VAR_NAME}.
Para desbloquear límites de mensajes y poder enviar mensajes de plantilla a cualquier número (no solo a los 5 de prueba), es necesario verificar la empresa ante Meta.
La verificación desbloquea también la posibilidad de usar el nombre de display personalizado (en vez del número de teléfono) en los chats.
Los HSM (Highly Structured Messages) son plantillas pre-aprobadas por Meta para enviar mensajes fuera de la ventana de 24 horas. Son obligatorios para iniciar conversaciones o para mensajes automatizados (recordatorios, alertas, notificaciones).
Cómo enviar un template aprobado:
curl -X POST \
"https://graph.facebook.com/v23.0/<PHONE_NUMBER_ID>/messages" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"to": "5491112345678",
"type": "template",
"template": {
"name": "<NOMBRE_DEL_TEMPLATE>",
"language": { "code": "es_AR" },
"components": [
{
"type": "body",
"parameters": [
{ "type": "text", "text": "<VALOR_VARIABLE_1>" },
{ "type": "text", "text": "<VALOR_VARIABLE_2>" }
]
}
]
}
}'
Nombre sugerido: confirmacion_turno_v1 Categoría Meta: UTILITY Idioma: es_AR
Hola {{1}}, tu turno está confirmado para el {{2}} a las {{3}} hs.
Dirección: {{4}}
Si necesitás reprogramar, respondé este mensaje o llamanos al {{5}}.
— {{6}}
Variables:
Ejemplo de uso real:
"Hola María, tu turno está confirmado para el 15/04/2026 a las 10:30 hs. Dirección: Av. Corrientes 1234, CABA. Si necesitás reprogramar, respondé este mensaje o llamanos al 11-4444-5555. — Estudio Pérez & Asociados"
Nombre sugerido: recordatorio_turno_24hs_v1 Categoría Meta: UTILITY Idioma: es_AR
Recordatorio: {{1}}, mañana {{2}} tenés turno a las {{3}} hs en {{4}}.
Confirmá respondiendo SÍ o comunicate si necesitás cancelar.
— {{5}}
Variables:
Nombre sugerido: recordatorio_pago_pendiente_v1 Categoría Meta: UTILITY Idioma: es_AR
Hola {{1}}, te recordamos que tenés un pago pendiente por ${{2}} con vencimiento el {{3}}.
Podés abonar por transferencia al CBU {{4}} a nombre de {{5}}, o respondé este mensaje para coordinar.
— {{6}}
Variables:
Nombre sugerido: alerta_vencimiento_arca_v1 Categoría Meta: UTILITY Idioma: es_AR
📋 Recordatorio fiscal: {{1}}, el {{2}} vence {{3}}.
{{4}}
Consultá con tu contador si necesitás asistencia. Respondé este mensaje para más información.
— {{5}}
Variables:
Uso típico: estudios contables que quieren recordar a sus clientes los vencimientos del mes sin llamar uno por uno.
Nombre sugerido: pedido_listo_v1 Categoría Meta: UTILITY Idioma: es_AR
Hola {{1}}, tu pedido #{{2}} está listo para {{3}}.
{{4}}
Ante cualquier consulta respondé este mensaje.
— {{5}}
Variables:
retiro en tienda / envío a domicilio / descarga disponibleNombre sugerido: bienvenida_v1 Categoría Meta: MARKETING Idioma: es_AR
¡Hola {{1}}! Bienvenido/a a {{2}} 👋
Soy el asistente virtual. Puedo ayudarte con:
• {{3}}
• {{4}}
• {{5}}
¿En qué puedo ayudarte hoy?
Variables:
ℹ️ Los templates de categoría
MARKETINGtienen costo por conversación más alto que los deUTILITY. Usar solo cuando es el primer contacto o para campañas activas.
El agente puede ejecutar el envío de templates usando el comando curl (declarado en requires.bins). Ejemplo de función reutilizable:
# Función de envío de template WhatsApp
# Uso: wa_send_template <numero> <template_name> <var1> <var2> ...
wa_send_template() {
local numero="$1"
local template_name="$2"
shift 2
local params=""
for var in "$@"; do
params="${params}{\"type\":\"text\",\"text\":\"${var}\"},"
done
params="${params%,}" # Quitar última coma
curl -s -X POST \
"https://graph.facebook.com/v23.0/${PHONE_NUMBER_ID}/messages" \
-H "Authorization: Bearer ${WA_ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d "{
\"messaging_product\": \"whatsapp\",
\"to\": \"${numero}\",
\"type\": \"template\",
\"template\": {
\"name\": \"${template_name}\",
\"language\": {\"code\": \"es_AR\"},
\"components\": [{
\"type\": \"body\",
\"parameters\": [${params}]
}]
}
}"
}
Variables de entorno requeridas (inyectar en openclaw.json bajo skills.entries):
{
"skills": {
"entries": {
"whatsapp-business-latam": {
"env": {
"PHONE_NUMBER_ID": "<phone_number_id>",
"WA_ACCESS_TOKEN": "<access_token>"
}
}
}
}
}
Cuando un usuario te escribe un mensaje, se abre automáticamente una Customer Service Window (CSW) de 24 horas. Cada mensaje que el usuario envía reinicia el contador.
Qué podés hacer dentro de la CSW (todo gratis):
Qué NO podés hacer dentro de la CSW:
Fuera de la CSW (más de 24hs desde el último mensaje del usuario):
Regla práctica para PyMEs: mantener la conversación activa es gratis. Si un cliente escribe una consulta, el agente puede responder todo lo necesario sin costo, incluso enviar confirmaciones o recordatorios con templates de utility — siempre que sea dentro de las 24hs desde el último mensaje del cliente.
Meta exige que los contactos hayan dado consentimiento explícito para recibir mensajes de WhatsApp de tu empresa antes de que les envíes el primer template.
Formas válidas de opt-in:
Lo que NO es opt-in válido:
Guardar evidencia del opt-in por cliente. Si Meta audita tu cuenta y no podés demostrar el consentimiento, el número puede ser baneado.
Meta limita la cantidad de usuarios únicos a los que podés iniciar conversaciones por día (los mensajes entrantes y respuestas dentro de CSW no cuentan contra el límite).
| Tier | Usuarios únicos / 24hs |
|---|---|
| Sin verificar | 250 |
| Tier 1 (cuenta verificada) | 1,000 |
| Tier 2 | 10,000 |
| Tier 3 | 100,000 |
| Tier 4 | Ilimitado |
Cómo se sube de tier:
Cómo se baja de tier:
Meta mide la calidad de tu cuenta según:
Si cae a "Amarillo": recibís una advertencia. Reducir volumen de envíos inmediatamente. Si cae a "Rojo": el número queda en pausa. Puede resultar en baneo si no mejora.
Meta abre una ventana especial de 72 horas de mensajes completamente gratis cuando el usuario entra a tu WhatsApp a través de:
Durante esas 72 horas:
Por qué es importante para PyMEs argentinas:
Si hacés campañas pagas en Meta Ads con CTA a WhatsApp, el costo de los mensajes posteriores queda incluido en el costo del ad. Esto cambia la matemática del customer acquisition: lo que pagás es solo el ad, no los mensajes de follow-up.
Estrategia recomendada:
Antes de enviar el primer mensaje de producción, verificar que:
[ ] El número usado es EXCLUSIVO para WhatsApp Business API
(no está ni estuvo en la app de WhatsApp personal o Business App)
[ ] La cuenta de Meta Business está verificada con documentación real
[ ] Todos los contactos dieron opt-in explícito antes del primer envío
[ ] Los templates fueron aprobados por Meta antes de enviarlos
(no enviar templates "pendientes de revisión")
[ ] El nombre de display del número coincide con el nombre legal del negocio
o una variación reconocible
[ ] No se está usando ninguna librería no oficial:
❌ Baileys
❌ whatsapp-web.js
❌ WPPConnect
❌ venom-bot
❌ Chat-API
✅ Meta Cloud API (graph.facebook.com)
[ ] El token de acceso es de un System User, no de una cuenta personal
[ ] Los mensajes tienen un propósito claro y valor para el receptor
(no spam, no mensajes masivos sin segmentación)
[ ] El webhook responde con HTTP 200 en menos de 5 segundos
(si Meta no recibe 200, reintenta y puede marcar la cuenta como problemática)
[ ] El número tiene habilitado el desvío de llamadas o puede recibir SMS
(necesario para renovar la verificación del número si caduca)
⚠️ Cambio importante — julio 2025: Meta migró de un modelo de pricing "per-conversation" (24hs) a un modelo per-message. Todo este skill está actualizado al nuevo modelo. Referencia oficial:
business.whatsapp.com/products/platform-pricing
| Categoría | Costo |
|---|---|
| Service messages (cualquier mensaje dentro de la Customer Service Window) | GRATIS sin límite |
| Utility templates enviados dentro de la CSW | GRATIS sin límite |
| Free Entry Points — usuarios que entran via Click-to-WhatsApp Ads o CTA de Facebook Page | 72hs de mensajes gratis (incluido marketing) |
Esto es un cambio estructural: una PyME con tráfico entrante orgánico (clientes que inician la conversación) puede operar con costo casi nulo.
| Categoría | Cuándo aplica |
|---|---|
| Utility template | Enviado fuera de la CSW (recordatorio proactivo sin conversación previa reciente) |
| Marketing template | Campañas, promociones, bienvenidas sin conversación previa |
| Authentication template | Códigos de verificación, OTPs, 2FA |
Las tarifas exactas por país y categoría están en el sitio oficial de Meta. Meta ajusta precios periódicamente — no hardcodear valores en integraciones productivas.
Desde julio 2025, Meta aplica tiered pricing para utility y authentication: cuanto más envíes, menor es el costo unitario. Los tiers se definen por mercado y se calculan mensualmente según el volumen acumulado del mes.
Escenario A — Estudio contable con 50 clientes, solo recordatorios ARCA:
Escenario B — E-commerce chico con 500 pedidos/mes:
Escenario C — PyME con estrategia de CTWA Ads:
Factor clave: el costo real depende de la proporción entre mensajes dentro y fuera de la CSW. Una PyME que fomenta que el cliente inicie la conversación (respondiendo rápido, usando CTWA Ads, mostrando el número en redes) paga muy poco.
Cuando el usuario escribe al número, el agente puede responder con texto libre durante las siguientes 24 horas. Ejemplo de respuesta automática vía API:
curl -X POST \
"https://graph.facebook.com/v23.0/${PHONE_NUMBER_ID}/messages" \
-H "Authorization: Bearer ${WA_ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"to": "5491112345678",
"type": "text",
"text": {
"body": "¡Hola! Recibimos tu mensaje y te respondemos en breve. — Equipo Centriqs"
}
}'
Una vez completado el setup, enviar un mensaje de prueba:
# Reemplazar con tus valores reales
PHONE_NUMBER_ID="tu_phone_number_id"
ACCESS_TOKEN="tu_access_token"
NUMERO_DESTINO="549XXXXXXXXXX" # Tu propio número para prueba
curl -X POST \
"https://graph.facebook.com/v23.0/${PHONE_NUMBER_ID}/messages" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d "{
\"messaging_product\": \"whatsapp\",
\"to\": \"${NUMERO_DESTINO}\",
\"type\": \"text\",
\"text\": {\"body\": \"Prueba de conexión exitosa — OpenClaw + WhatsApp Business API ✓\"}
}"
Respuesta esperada:
{
"messaging_product": "whatsapp",
"contacts": [{"input": "549XXXXXXXXXX", "wa_id": "549XXXXXXXXXX"}],
"messages": [{"id": "wamid.XXXXXXXXXX"}]
}
Si obtenés "error" en la respuesta, verificar: token válido, PHONE_NUMBER_ID correcto, número de destino en formato internacional sin + (ej: 5491112345678 no +5491112345678).
access_token de System User tiene acceso completo al número. Nunca incluirlo en
código que se suba a repositorios públicos (GitHub, GitLab, etc.).skills.entries.*.env).~/centriqs/whatsapp/logs/ debe tener permisos restringidos
(chmod 600) si contiene nombres o números de clientes.| Skill | Relación |
|---|---|
| latam-timezone-briefing | Puede disparar envíos de WhatsApp como canal de entrega del briefing |
| argentina-fiscal-calendar | Provee los datos de vencimientos que el agente puede notificar por WhatsApp |
| whatsapp-business-latam-pro (paid — ClawMart, próximamente) | Automatización avanzada: menú interactivo, respuestas con botones, flows, integración con Tiendanube y MercadoPago |
Desarrollado por Centriqs — Center of your operations MIT License — Libre uso, modificación y redistribución con atribución