whatsapp-bot/
├── index.js ← Servidor Express (entrada)
├── package.json
├── .env ← Variables de entorno (creás vos)
├── .env.example ← Plantilla de variables
└── src/
├── config/
│ └── menu.js ← ✏️ Textos y menús configurables
└── services/
├── botService.js ← Lógica principal del bot
├── sessionService.js ← Manejo de sesiones en memoria
├── sheetsService.js ← Integración con Google Sheets
└── whatsappService.js ← Envío de mensajes por la API de Meta
- Entrá a https://nodejs.org y descargá la versión LTS (la recomendada).
- Instalala normalmente.
- Verificá que quedó instalado abriendo una terminal y escribiendo:
node -v # debería mostrar algo como v20.x.x npm -v # debería mostrar algo como 10.x.x
Abrí una terminal en la carpeta del proyecto y ejecutá:
npm installEsto descarga Express, Axios y la librería de Google.
- Entrá a https://developers.facebook.com y creá una cuenta si no tenés.
- Hacé clic en Mis apps → Crear app.
- Elegí tipo Empresa y dale un nombre.
- En el panel de la app, buscá el producto WhatsApp y hacé clic en Configurar.
- En la sección Primeros pasos vas a ver:
- Token de acceso temporal → copialo (lo necesitás para
WHATSAPP_TOKEN) - ID del número de teléfono → copialo (para
WHATSAPP_PHONE_ID)
- Token de acceso temporal → copialo (lo necesitás para
⚠️ El token temporal dura 24 hs. Más adelante (Paso 7) te explico cómo hacerlo permanente.
- Entrá a https://sheets.google.com y creá un nuevo archivo.
- Renombrá la primera hoja como Tickets.
- En la fila 1, escribí estos encabezados (uno por celda):
ID Ticket | Fecha | Teléfono | Empresa | Contacto | Tipo | Prioridad | Descripción | Estado - Hacé clic en + abajo para agregar una segunda hoja y llamala Leads.
- En la fila 1 de Leads escribí:
Fecha | Teléfono | Empresa | Rubro | Empleados | Necesidad | Estado - Copiá el ID del spreadsheet de la URL:
https://docs.google.com/spreadsheets/d/ ESTE_ES_EL_ID /edit
- Entrá a https://console.cloud.google.com
- Creá un proyecto nuevo (o usá uno existente).
- En el menú izquierdo: APIs y servicios → Biblioteca.
- Buscá Google Sheets API y hacíla clic en Habilitar.
- Andá a APIs y servicios → Credenciales → Crear credenciales → Cuenta de servicio.
- Dale un nombre y hacé clic en Crear y continuar.
- En el paso de roles elegí Editor y guardá.
- Hacé clic en la cuenta de servicio recién creada.
- Ir a la pestaña Claves → Agregar clave → Crear nueva clave → JSON.
- Se descarga un archivo
.json. Ábrilo y copiá todo su contenido.
- Abrí el archivo JSON descargado y buscá el campo
client_email(termina en@...iam.gserviceaccount.com). - En tu Google Sheet hacé clic en Compartir.
- Pegá ese email y dale permisos de Editor. Confirmá.
- Copiá el archivo
.env.exampley renombralo como.env:cp .env.example .env
- Abrí
.envcon cualquier editor de texto y completá los valores:
# Token de acceso de tu app de Meta (Paso 3)
WHATSAPP_TOKEN=EAAxxxxxxxxxxxxxxx
# ID del número de teléfono de Meta (Paso 3)
WHATSAPP_PHONE_ID=1234567890123
# String secreto que vos inventás (puede ser cualquier cosa, ej: "mi-token-secreto-2024")
VERIFY_TOKEN=mi-token-secreto-2024
# ID del Google Sheet (Paso 4a)
GOOGLE_SHEET_ID=1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms
# JSON completo de la service account en UNA SOLA LÍNEA (Paso 4b)
# Copiá el contenido del archivo .json y pegalo todo en una línea entre las comillas
GOOGLE_SERVICE_ACCOUNT={"type":"service_account","project_id":"..."}
PORT=3000
SESSION_TIMEOUT_HOURS=4Meta necesita una URL pública para enviarte los mensajes. En desarrollo usamos ngrok.
-
Descargá ngrok desde https://ngrok.com/download e instalalo.
-
Abrí dos terminales:
Terminal 1 — Levantá el bot:
npm run dev
Deberías ver:
🤖 Bot de WhatsApp corriendo en http://localhost:3000Terminal 2 — Levantá ngrok:
ngrok http 3000
Vas a ver algo como:
Forwarding https://abc123.ngrok-free.app → http://localhost:3000Copiá esa URL (
https://abc123.ngrok-free.app).
- En el panel de tu app de Meta, andá a WhatsApp → Configuración.
- En la sección Webhook, hacé clic en Editar.
- Completá:
- URL de devolución de llamada:
https://abc123.ngrok-free.app/webhook - Token de verificación: el mismo que pusiste en
VERIFY_TOKENdel.env
- URL de devolución de llamada:
- Hacé clic en Verificar y guardar.
- Una vez verificado, suscribite al evento messages haciendo clic en Administrar → activá
messages.
- En el panel de Meta, en la sección Primeros pasos, buscá el número de teléfono de prueba.
- Agregá tu número personal como número de prueba permitido.
- Desde tu WhatsApp personal, escribile al número de prueba: hola
- ¡El bot debería responder con el menú principal!
El token temporal dura 24 hs. Para uno permanente:
- En Meta, andá a Configuración → Avanzada → Tokens de acceso.
- O usá un System User Token desde el Business Manager.
En lugar de ngrok, podés deployar en:
- Railway: https://railway.app (fácil, gratis para empezar)
- Render: https://render.com (gratis con limitaciones)
- VPS: cualquier servidor con Node.js instalado
El proceso es el mismo: subís el código, configurás las variables de entorno en el panel del hosting, y reemplazás la URL de ngrok por la URL pública del servidor.
| Escribe | Acción |
|---|---|
hola |
Muestra el menú principal |
inicio |
Muestra el menú principal |
0 |
Vuelve al paso o menú anterior |
00 |
Vuelve al menú principal desde cualquier lugar |
asesor |
Conecta con un agente humano |
hablar |
Conecta con un agente humano |
Para cambiar textos, opciones o agregar nuevas secciones al menú, solo editá el archivo:
src/config/menu.js
No necesitás tocar ningún otro archivo para cambios de contenido.
El webhook no se verifica
→ Asegurate de que ngrok esté corriendo y que VERIFY_TOKEN en .env coincida con el que pusiste en Meta.
No llegan mensajes
→ Verificá que te suscribiste al evento messages en la configuración del webhook de Meta.
Error de Google Sheets
→ Asegurate de que el JSON de la service account esté en una sola línea en .env y que compartiste el Sheet con el email de la service account.
El bot no responde
→ Revisá los logs en la terminal donde corre npm run dev. Cualquier error va a aparecer ahí.