Sistema de webhook para WhatsApp Cloud API que se ejecuta en Google Apps Script. Automatiza la gestión de contactos y el envío de archivos PDF cuando los usuarios solicitan documentos mediante frases específicas.
Code.gs → Punto de entrada (doGet, doPost)
Config.gs → Configuración y mapeo de palabras clave
WhatsAppAPI.gs → Integración con WhatsApp Cloud API
SheetsManager.gs → CRUD de contactos en Google Sheets
DriveManager.gs → Acceso a archivos de Google Drive
MessageProcessor.gs → Detección de palabras clave y lógica
ValidationSecurity.gs → Validaciones y seguridad del webhook
- WhatsApp Cloud API envía POST al webhook
doPost()recibe y valida el payload- Se extrae nombre y teléfono del contacto
- Si el contacto no existe, se registra en Google Sheets
- Se analiza el texto buscando palabras clave ("catálogo", "precios", etc.)
- Si se detecta keyword y no se envió antes, se obtiene el PDF de Drive y se envía por WhatsApp
- Se marca el envío en Sheets para evitar duplicados
- Ir a https://developers.facebook.com/
- Crear nueva app → Tipo "Business"
- Agregar producto "WhatsApp"
- Obtener Phone Number ID y Token permanente:
- Business Settings → System Users → Crear System User (Admin)
- Generar token con permisos:
whatsapp_business_messaging,whatsapp_business_management
Google Sheets:
- Crear nueva hoja de cálculo llamada "Contactos WhatsApp"
- Copiar el ID de la hoja desde la URL:
https://docs.google.com/spreadsheets/d/[SHEET_ID]/edit - Los encabezados se crean automáticamente al primer uso
Google Drive:
- Subir los archivos PDF que se enviarán
- Para cada archivo, copiar el ID desde la URL:
https://drive.google.com/file/d/[FILE_ID]/view - Los permisos de acceso se configuran automáticamente por el código
- Ir a https://script.google.com/
- Nuevo proyecto → Nombrar "WhatsApp Webhook System"
- Crear los 7 archivos
.gscopiando el contenido de este repositorio - Ejecutar la función
setupConfiguration()una sola vez, después de reemplazar los valores de ejemplo enConfig.gs:WHATSAPP_TOKEN: Token permanente de MetaPHONE_NUMBER_ID: Phone Number ID de MetaVERIFY_TOKEN: String aleatorio seguro (inventar uno)SHEET_ID: ID de la Google SheetKEYWORD_PDF_CATALOGO: ID del archivo catálogo en DriveKEYWORD_PDF_PRECIOS: ID del archivo de precios en Drive
- Click "Deploy" → "New deployment"
- Tipo: Web app
- Execute as: Me
- Who has access: Anyone
- Deploy → Copiar la URL generada
- WhatsApp → Configuration → Webhook → Edit
- Callback URL: La URL de la Web App
- Verify token: El mismo
VERIFY_TOKENque configuraste - Click "Verify and Save"
- Suscribirse al campo messages
-
En
Config.gs, agregar entradas al objetoKEYWORD_MAPPINGS:var KEYWORD_MAPPINGS = { 'catalogo': 'KEYWORD_PDF_CATALOGO', 'nuevo documento': 'KEYWORD_PDF_NUEVO', // ← Nueva entrada };
-
En
setupConfiguration()(o directamente en Script Properties), agregar el ID del archivo:'KEYWORD_PDF_NUEVO': 'ID_DEL_ARCHIVO_EN_DRIVE'
-
Redesplegar la Web App (Deploy → Manage deployments → Edit → New version)
Test de webhook:
GET https://[TU-WEB-APP-URL]?hub.mode=subscribe&hub.verify_token=[TU_TOKEN]&hub.challenge=TEST123
Resultado esperado: TEST123
Test de mensaje: Enviar un texto al número de WhatsApp Business y verificar:
- El contacto aparece en Google Sheets
- Se recibe respuesta en WhatsApp
Test de keyword: Enviar "catálogo" y verificar:
- Se recibe el PDF
- La columna "PDF Enviado" se actualiza en Sheets
- Tiempo máximo de ejecución: 6 minutos por invocación
- UrlFetch: 20,000 llamadas/día
- Propiedades del script: 500 KB total
- Los tokens se almacenan en
PropertiesService, nunca en código - Los payloads se validan antes de procesarse
- Los números de teléfono se sanitizan (solo dígitos)
- El texto del usuario se limita a 500 caracteres y se eliminan caracteres de control