WhatsApp se ha convertido en el canal de mensajería más usado del planeta con más de 2 mil millones de usuarios activos. Integrar WhatsApp en tu aplicación o negocio ya no es un lujo — es una necesidad competitiva. Y la forma más sencilla y robusta de hacerlo es a través de la API de WhatsApp Business de Twilio.

En este tutorial te guío paso a paso: desde crear tu cuenta en Twilio hasta enviar y recibir mensajes de WhatsApp desde tu propio código, con ejemplos prácticos en Python, Node.js y cURL.


1. ¿Qué es Twilio y la WhatsApp Business API?

Twilio es una plataforma de comunicación en la nube que actúa como intermediario oficial entre tu aplicación y Meta (Facebook). En lugar de lidiar directamente con la compleja API de Meta, Twilio te da una interfaz unificada y simplificada para enviar y recibir mensajes de WhatsApp, SMS, voz y más.

Ventajas de usar Twilio para WhatsApp:

  • No necesitas gestionar servidores de WhatsApp ni la infraestructura de Meta.
  • ✅ Un solo endpoint REST para todas tus comunicaciones.
  • Sandbox gratuito para pruebas sin costo.
  • ✅ Soporte para mensajes de plantilla (template messages), perfecto para notificaciones.
  • ✅ Webhooks para recibir mensajes entrantes en tiempo real.
  • ✅ SDKs oficiales en Python, Node.js, PHP, Java, C#, Go y Ruby.

2. Prerrequisitos

Antes de empezar necesitas:

  • 🔹 Una cuenta de Twilio (crear cuenta gratuita — recibirás $15 de crédito).
  • 🔹 Un número de teléfono móvil con WhatsApp instalado (para pruebas en el sandbox).
  • 🔹 Opcional si quieres ir a producción: una cuenta de Meta Business verificada.

3. Configuración del Sandbox de WhatsApp

Twilio ofrece un sandbox gratuito que te permite probar la API sin pasar por la verificación de Meta. Así se configura:

Paso 1: Accede al Sandbox

  1. Inicia sesión en console.twilio.com
  2. Ve a Messaging → Try it out → Send a WhatsApp message
  3. Verás un número de WhatsApp del sandbox (ej: +14155238886) y un código de unión único (ej: join your-sandbox-code)

Paso 2: Únete al Sandbox desde tu WhatsApp

Envía el código de unión como mensaje de WhatsApp al número del sandbox. Por ejemplo:

join yellow-umbrella

Recibirás una respuesta automática confirmando que estás dentro del sandbox. ¡Listo! Ya puedes enviar y recibir mensajes programáticamente.

Paso 3: Obtén tus credenciales

En la consola de Twilio, ve a Account → API keys & tokens. Necesitarás:

  • Account SID — tu identificador de cuenta (empieza con AC...)
  • Auth Token — tu token secreto de autenticación
⚠️ Importante: Nunca subas tu Auth Token a GitHub ni lo expongas en el frontend. Usa variables de entorno.

4. Tu Primer Mensaje de WhatsApp

El endpoint base de Twilio para WhatsApp es:

POST https://api.twilio.com/2010-04-01/Accounts/{AccountSid}/Messages.json

Ejemplo con cURL

curl -X POST "https://api.twilio.com/2010-04-01/Accounts/TU_ACCOUNT_SID/Messages.json"   --data-urlencode "From=whatsapp:+14155238886"   --data-urlencode "To=whatsapp:+521234567890"   --data-urlencode "Body=🚀 ¡Hola desde Twilio! Tu primer mensaje de WhatsApp automático."   -u "TU_ACCOUNT_SID:TU_AUTH_TOKEN"

Ejemplo con Python

Instala el SDK:

pip install twilio
from twilio.rest import Client
import os

# Credenciales desde variables de entorno
account_sid = os.environ["TWILIO_ACCOUNT_SID"]
auth_token = os.environ["TWILIO_AUTH_TOKEN"]
client = Client(account_sid, auth_token)

message = client.messages.create(
    from_="whatsapp:+14155238886",   # Número del sandbox
    to="whatsapp:+521234567890",      # Tu número con código de país
    body="🚀 ¡Hola desde Python! Primer mensaje con Twilio + WhatsApp."
)

print(f"✅ Mensaje enviado. SID: {message.sid}")
print(f"   Status: {message.status}")

Ejemplo con Node.js

Instala el SDK:

npm install twilio
const twilio = require("twilio");

const accountSid = process.env.TWILIO_ACCOUNT_SID;
const authToken = process.env.TWILIO_AUTH_TOKEN;
const client = twilio(accountSid, authToken);

client.messages
  .create({
    from: "whatsapp:+14155238886",
    to: "whatsapp:+521234567890",
    body: "🚀 ¡Hola desde Node.js! Primer mensaje con Twilio + WhatsApp.",
  })
  .then((message) => console.log("✅ Mensaje enviado. SID:", message.sid))
  .catch((err) => console.error("❌ Error:", err.message));

5. Webhooks: Recibir y Procesar Mensajes

Esta es la parte más potente de la API de Twilio. Los webhooks son el mecanismo que permite que WhatsApp "le hable" a tu aplicación en tiempo real. Cada vez que un usuario te escribe, Twilio hace una petición HTTP POST a tu servidor con los datos del mensaje. Sin webhooks, solo podrías enviar mensajes — con webhooks, tu app se convierte en un bot conversacional completo.

💡 ¿Por qué son tan importantes los webhooks?
Son el puente que convierte una simple herramienta de envío en una plataforma de comunicación bidireccional. Con webhooks puedes: automatizar respuestas, integrar chatbots con IA, registrar conversaciones en tu CRM, disparar flujos de trabajo, y mucho más.

Paso 1: Crea un endpoint en tu servidor

Ejemplo con Flask (Python):

from flask import Flask, request
from twilio.twiml.messaging_response import MessagingResponse

app = Flask(__name__)

@app.route("/whatsapp-webhook", methods=["POST"])
def whatsapp_webhook():
    incoming_msg = request.values.get("Body", "").strip().lower()
    sender = request.values.get("From", "")
    
    print(f"📩 Mensaje de {sender}: {incoming_msg}")
    
    resp = MessagingResponse()
    msg = resp.message()
    
    if "hola" in incoming_msg:
        msg.body("👋 ¡Hola! Soy un bot de WhatsApp. ¿En qué puedo ayudarte?")
    elif "precio" in incoming_msg or "costo" in incoming_msg:
        msg.body("💰 Nuestros planes empiezan desde .99/mes. ¿Te interesa saber más?")
    else:
        msg.body("🤖 Recibí tu mensaje. Un agente humano te responderá pronto.")
    
    return str(resp)

if __name__ == "__main__":
    app.run(port=5000)

Paso 2: Expón tu endpoint públicamente

Durante el desarrollo local, usa ngrok para exponer tu servidor:

ngrok http 5000

Te dará una URL pública como https://abc123.ngrok.io.

Paso 3: Configura el webhook en Twilio

En la consola de Twilio, en Messaging → Try it out → Send a WhatsApp message, pega tu URL de ngrok en el campo "When a message comes in" y guarda.


🔐 Seguridad: Validación de Firmas

En producción, cualquiera podría hacer POST a tu endpoint. Twilio incluye una firma criptográfica (header X-Twilio-Signature) en cada petición para que puedas verificar que realmente viene de Twilio:

from twilio.request_validator import RequestValidator
from flask import Flask, request, abort

app = Flask(__name__)
auth_token = os.environ["TWILIO_AUTH_TOKEN"]
validator = RequestValidator(auth_token)

@app.route("/whatsapp-webhook", methods=["POST"])
def secure_webhook():
    url = "https://miapp.com/whatsapp-webhook"
    params = request.form.to_dict()
    signature = request.headers.get("X-Twilio-Signature", "")
    
    if not validator.validate(url, params, signature):
        abort(403)  # ¡Petición no autorizada!
    
    # ... procesar mensaje normalmente
    pass
⚠️ Siempre valida las firmas en producción. Sin esta verificación, un atacante podría enviar mensajes falsos a tu sistema.

📎 Recibir Imágenes, Documentos y Multimedia

Cuando un usuario envía una foto, PDF o audio, el webhook incluye el campo MediaUrl0 con una URL temporal para descargar el archivo:

@app.route("/whatsapp-webhook", methods=["POST"])
def handle_media():
    num_media = int(request.values.get("NumMedia", 0))
    
    if num_media > 0:
        media_url = request.values.get("MediaUrl0")
        media_type = request.values.get("MediaContentType0")
        print(f"📎 Archivo recibido: {media_type}")
        
        import requests as req
        r = req.get(media_url, auth=(account_sid, auth_token))
        with open("/tmp/archivo_recibido", "wb") as f:
            f.write(r.content)
        
        return str(MessagingResponse().message("📎 ¡Archivo recibido! Procesando..."))

📍 Recibir Ubicación

Si el usuario comparte su ubicación, el webhook incluye coordenadas:

if request.values.get("Latitude"):
    lat = request.values.get("Latitude")
    lon = request.values.get("Longitude")
    print(f"📍 Ubicación: {lat}, {lon}")

📊 Callbacks de Estado (Delivery Receipts)

Además del webhook de mensajes entrantes, Twilio ofrece un webhook de status que te notifica cuando tu mensaje fue enviado, entregado, leído o falló:

message = client.messages.create(
    from_="whatsapp:+141****8886",
    to="whatsapp:+521****7890",
    body="Tu pedido está en camino 🚚",
    status_callback="https://miapp.com/status-webhook"
)

@app.route("/status-webhook", methods=["POST"])
def status_webhook():
    msg_sid = request.values.get("MessageSid")
    status = request.values.get("MessageStatus")
    print(f"📊 Mensaje {msg_sid}: {status}")
    return "OK"

🏭 Producción: Más Allá de ngrok

Para entornos reales, ngrok no es suficiente. Opciones recomendadas:

  • ☁️ Cloudflare Tunnel — gratuito, estable, con SSL automático
  • 🐳 Docker + Nginx + SSL — despliegue autogestionado en VPS
  • Serverless — AWS Lambda + API Gateway, Vercel Functions o Google Cloud Run
  • 🔄 Colas de mensajes — para alta carga, encola los webhooks en Redis/RabbitMQ y procesa asíncronamente con workers

Patrón recomendado para producción:

  1. Webhook recibe → valida firma → encola en Redis
  2. Worker procesa de la cola → respuesta al usuario
  3. Si el procesamiento es lento, responde inmediatamente con "estoy procesando..." y envía la respuesta real en un segundo mensaje

6. Mensajes de Plantilla (Template Messages)

Una vez que salgas del sandbox a producción, WhatsApp restringe el envío de mensajes proactivos: solo puedes iniciar conversaciones usando plantillas pre-aprobadas por Meta. Esto evita spam.

¿Cuándo necesitas plantillas?

  • ✅ Notificaciones de pedido ("Tu pedido #1234 ha sido enviado")
  • ✅ Recordatorios de cita ("Tu cita es mañana a las 10:00 AM")
  • ✅ Códigos de verificación OTP ("Tu código es 456789")
  • ✅ Alertas de cuenta ("Se detectó un inicio de sesión sospechoso")

Crear una plantilla en Twilio

En la consola de Twilio: Messaging → Senders → WhatsApp templates → "Create template".

Una plantilla se ve así:

Hola {{1}}. Tu pedido #{{2}} ha sido enviado y llegará el {{3}}. 
Gracias por comprar en {{4}}.

Luego la envías desde código:

message = client.messages.create(
    from_="whatsapp:+14155238886",
    to="whatsapp:+521234567890",
    content_sid="HX1234567890abcdef",  # SID de la plantilla aprobada
    content_variables=json.dumps({
        "1": "María",
        "2": "98765",
        "3": "15 de junio",
        "4": "TecnoTactil"
    })
)

7. Del Sandbox a Producción

El sandbox es excelente para desarrollo, pero tiene limitaciones:

  • ❌ Solo tú y hasta 5 números pueden estar unidos al sandbox.
  • ❌ Los mensajes incluyen el código de unión en las conversaciones.
  • ❌ No apto para uso real con clientes.

Para producción necesitas:

  1. Una cuenta de Meta Business verificada (business.facebook.com)
  2. Registrar tu número de teléfono en WhatsApp Business Platform
  3. Crear un perfil de WhatsApp Business (nombre, logo, descripción)
  4. Aprobar tus plantillas de mensaje con Meta

Twilio gestiona todo este proceso desde su consola en Messaging → Senders → WhatsApp senders. El proceso de verificación de Meta suele tomar 24-72 horas.


8. Precios

Twilio cobra por mensaje enviado o recibido. Los precios varían según el país de destino:

PaísCosto por mensaje (aprox.)
🇲🇽 México$0.015 USD
🇺🇸 Estados Unidos$0.013 USD
🇪🇸 España$0.080 USD
🇦🇷 Argentina$0.085 USD
🇨🇴 Colombia$0.014 USD

Nota: Las conversaciones iniciadas por el usuario (sesiones de 24h) no requieren plantilla ni costo adicional. Los precios son referenciales — consulta la página oficial de precios.


9. Buenas Prácticas y Consejos

  • 🔐 Guarda las credenciales en variables de entorno, nunca en el código fuente.
  • 📝 Registra (loguea) todos los mensajes con su message.sid para debugging.
  • ⏱️ Respeta las sesiones de 24 horas de WhatsApp: si el usuario te escribió, tienes 24h para responder libremente sin plantilla.
  • 🔢 Formato de número internacional: siempre usa whatsapp:+<código_país><número> sin espacios ni guiones.
  • 📊 Monitorea tus entregas: el webhook de status te avisa si un mensaje fue enviado, entregado, leído o falló.
  • 🌐 Usa ngrok o servicios similares en desarrollo para exponer tu webhook local.
  • 🧪 Prueba todo en el sandbox antes de migrar a producción.


11. ¿Necesito una Empresa Verificada? La Verdad que Nadie Explica

Esta es una de las mayores confusiones con WhatsApp Business API. Vamos a separar los dos tipos de "verificación" que pide Meta:

📱 Verificación del número de teléfono

  • Meta te envía un código por SMS o llamada al número que quieres usar
  • ✅ Es obligatorio. Sin esto no puedes enviar NI recibir mensajes
  • ⏱️ Toma 2 minutos

🏢 Verificación de empresa (Business Verification)

  • Meta revisa documentos legales de tu empresa (acta constitutiva, RFC, comprobante fiscal)
  • ❌ Solo es necesaria para producción a gran escala
  • ⏱️ Toma 24-72 horas (o semanas si hay problemas)

✅ Lo que SÍ puedes hacer SIN verificación de empresa

Con solo tener tu número vinculado a un Meta Business Portfolio (sin verificar), ya puedes:
  • Recibir mensajes de WhatsApp → tu webhook los procesa
  • Responder automáticamente con bots o flujos
  • Manejar imágenes, documentos, ubicaciones y audios
  • Usar ngrok, Cloudflare Tunnel o tu propio servidor
  • Hasta 1,000 conversaciones únicas al mes

❌ Lo que NO puedes hacer SIN verificación de empresa

  • Iniciar conversaciones (escribirle al usuario primero)
  • Usar plantillas de mensaje aprobadas por Meta
  • Superar el límite de 1,000 contactos únicos/mes
  • Que tu número aparezca como "Cuenta de empresa verificada" con check verde ✅

🎯 La conclusión práctica

Si tu caso de uso es un chatbot de atención al cliente, soporte técnico, o asistente conversacional donde el usuario te escribe primero, NO necesitas verificar tu empresa. Solo necesitas:

  1. Un Meta Business Portfolio (crear uno es gratis en business.facebook.com)
  2. Vincular tu número de WhatsApp al portfolio
  3. Verificar el número (el código por SMS, no la empresa)
  4. Configurar tu webhook en Twilio

En menos de 30 minutos puedes tener un bot de WhatsApp funcionando sin haber enviado un solo documento legal. La verificación de empresa solo la necesitas cuando quieras dar el salto a notificaciones proactivas masivas.

10. Conclusión

Twilio hace que integrar WhatsApp en tus aplicaciones sea sorprendentemente sencillo. En menos de 30 minutos puedes tener un bot respondiendo mensajes, enviando notificaciones o automatizando la atención al cliente.

Si quieres ir más allá, explora:


¿Te resultó útil este tutorial? Compártelo y déjame tu comentario abajo 👇