Pasar al contenido principal
osky
Cómo integrar WhatsApp Business API en tu bot sin que Meta te vacíe la cartera
Tema WhatsApp Business API costos y bot

Integra WhatsApp Business API a tu bot en 2026 sin morir en el intento

Antes de tocar una sola línea de código, hay algo que tienes que entender con toda claridad: la WhatsApp Business API no es gratis. Meta cobra por conversación, y el precio varía según la categoría (marketing, utilidad, autenticación o servicio) y el país de destino. Las conversaciones de marketing son las más caras. Si arrancas sin entender esto, vas a recibir una factura que te va a quitar el sueño.

Tabla comparativa de categorías de costo en WhatsApp API

Este tutorial asume que ya tienes una idea de bot funcionando —o al menos en papel— y que quieres conectarla a WhatsApp de forma profesional, no con algún wrapper pirata que te puede banear la cuenta en cualquier momento.


Requisitos previos

  • Cuenta de Meta Business verificada (no una cuenta personal)
  • Número de teléfono que no esté registrado en WhatsApp regular ni en WhatsApp Business app
  • Servidor o instancia con HTTPS (ngrok sirve para desarrollo, pero no para producción)
  • Node.js 18+ o Python 3.11+ (el tutorial usa Node, pero los endpoints son iguales)
  • Acceso a Meta for Developers
  • Tarjeta de crédito o método de pago configurado en Meta Business Suite

Paso 1: Crear la app en Meta for Developers

  1. Entra a developers.facebook.com y haz clic en "Mis apps" > "Crear app".
  2. Selecciona el tipo "Business".
  3. Ponle nombre, asocia tu cuenta de Meta Business y confirma.
  4. En el dashboard de la app, busca el producto "WhatsApp" y haz clic en "Configurar".
  5. Acepta los términos del API. Aquí Meta te va a pedir que confirmes que entiendes el modelo de precios. Léelo, en serio.

Paso 2: Obtener el número de teléfono y el token de acceso

En la sección de WhatsApp dentro de tu app verás:

  • Phone Number ID: el identificador de tu número en la API
  • WhatsApp Business Account ID (WABA ID)
  • Temporary access token: válido 24 horas, suficiente para pruebas

Para producción necesitas un System User Token permanente:

  1. Ve a Meta Business Suite > Configuración > Usuarios del sistema.
  2. Crea un usuario del sistema con rol Admin.
  3. Genera un token con los permisos: whatsapp_business_messaging y whatsapp_business_management.
  4. Guarda ese token en un vault o variable de entorno. Nunca en el código fuente.
# .env
WHATSAPP_TOKEN=EAABsbCS...tuTokenLargo
PHONE_NUMBER_ID=1234567890
WABA_ID=0987654321

Paso 3: Configurar el webhook

Meta necesita verificar que tu servidor existe antes de enviarte mensajes entrantes.

// webhook.js (Express)
const express = require('express');
const app = express();
app.use(express.json());

const VERIFY_TOKEN = process.env.WEBHOOK_VERIFY_TOKEN; // define esto tú

// Verificación inicial de Meta
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) {
    console.log('Webhook verificado');
    res.status(200).send(challenge);
  } else {
    res.sendStatus(403);
  }
});

// Recepción de mensajes
app.post('/webhook', (req, res) => {
  const body = req.body;

  if (body.object === 'whatsapp_business_account') {
    body.entry?.forEach(entry => {
      entry.changes?.forEach(change => {
        const messages = change.value?.messages;
        if (messages) {
          messages.forEach(msg => {
            console.log('Mensaje recibido:', msg.from, msg.text?.body);
            // Aquí va tu lógica de bot
          });
        }
      });
    });
    res.sendStatus(200);
  } else {
    res.sendStatus(404);
  }
});

app.listen(3000, () => console.log('Servidor en puerto 3000'));

En el dashboard de Meta, registra la URL de tu webhook (https://tudominio.com/webhook) y el VERIFY_TOKEN que definiste.


Paso 4: Enviar mensajes desde tu bot

// sendMessage.js
const axios = require('axios');

async function sendTextMessage(to, text) {
  const url = `https://graph.facebook.com/v20.0/${process.env.PHONE_NUMBER_ID}/messages`;

  const payload = {
    messaging_product: 'whatsapp',
    to: to, // formato internacional: 521XXXXXXXXXX
    type: 'text',
    text: { body: text }
  };

  try {
    const response = await axios.post(url, payload, {
      headers: {
        Authorization: `Bearer ${process.env.WHATSAPP_TOKEN}`,
        'Content-Type': 'application/json'
      }
    });
    return response.data;
  } catch (error) {
    console.error('Error enviando mensaje:', error.response?.data);
    throw error;
  }
}

module.exports = { sendTextMessage };

Paso 5: Entender la ventana de 24 horas y las categorías de costo

Aquí está el punto donde la mayoría de los developers se queman:

Ventana de servicio (gratis relativa): Cuando un usuario te escribe, se abre una ventana de 24 horas. Dentro de esa ventana puedes responder con mensajes de texto libre sin costo adicional de conversación (ya pagaste la categoría "servicio" que es la más barata).

Fuera de la ventana: Si quieres iniciar tú la conversación o responder después de 24 horas, necesitas usar una plantilla aprobada (template). Y aquí sí pagas por categoría:

Categoría Caso de uso Costo relativo
Marketing Promociones, ofertas El más caro
Utilidad Confirmaciones, recordatorios Medio
Autenticación OTPs, verificación Medio-bajo
Servicio Respuesta a usuario El más bajo

Regla de oro para no quebrar: Diseña tu bot para que el usuario siempre inicie la conversación. Usa un QR o un link wa.me/521XXXXXXXXXX?text=Hola para que el primer mensaje lo mande el usuario. Así abres ventana de servicio y respondes sin usar templates de marketing.


Paso 6: Crear y enviar una plantilla aprobada

Para mensajes fuera de ventana necesitas templates aprobados por Meta (pueden tardar de minutos a 48 horas):

async function sendTemplate(to, templateName, languageCode, components) {
  const url = `https://graph.facebook.com/v20.0/${process.env.PHONE_NUMBER_ID}/messages`;

  const payload = {
    messaging_product: 'whatsapp',
    to: to,
    type: 'template',
    template: {
      name: templateName,
      language: { code: languageCode },
      components: components // variables del template
    }
  };

  const response = await axios.post(url, payload, {
    headers: {
      Authorization: `Bearer ${process.env.WHATSAPP_TOKEN}`,
      'Content-Type': 'application/json'
    }
  });
  return response.data;
}

Advertencias de producción que nadie te dice

1. Rate limits reales: Meta permite aproximadamente 80 mensajes por segundo por número de teléfono. Si haces un blast masivo sin controlar el rate, te van a throttlear o suspender.

2. Calidad del número: Meta monitorea la tasa de bloqueos por parte de usuarios. Si muchos te bloquean, tu número baja de calificación y eventualmente te lo inhabilitan. No hagas spam, aunque técnicamente puedas.

3. Webhooks caídos: Si tu webhook no responde con 200 en tiempo, Meta reintenta y eventualmente deja de enviar eventos. Siempre responde 200 inmediatamente y procesa el mensaje de forma asíncrona (cola de trabajo, no procesamiento síncrono en el handler).

4. Números de México: Los números mexicanos tienen el prefijo 521 (no 52) en formato internacional cuando son celulares. Si mandas a 52 sin el 1, el mensaje puede fallar silenciosamente.

5. Monitorea tu gasto diario: Configura alertas de presupuesto en Meta Business Suite. Un bug en tu lógica que dispare miles de mensajes de marketing te puede costar caro antes de que te des cuenta.


Stack recomendado para producción en 2026

  • API layer: Node.js con Express o Fastify, o Python con FastAPI
  • Cola de mensajes: BullMQ (Node) o Celery (Python) para procesar webhooks sin bloquear
  • Base de datos de conversaciones: PostgreSQL con tabla de sesiones y timestamps
  • Monitoreo: Grafana + Prometheus o simplemente Datadog si tienes presupuesto
  • Secrets: Vault de HashiCorp, AWS Secrets Manager, o al menos variables de entorno en tu plataforma de deploy

Con esto tienes la base para un bot de WhatsApp que no se caiga, no te cueste una fortuna y no te meta en problemas con Meta. El resto es lógica de negocio, que esa ya es tu bronca.