- Descripción del Proyecto
- Arquitectura del Bot
- Funcionalidades Principales
- Configuración del Entorno
- Despliegue
- Flujos de Conversación
- Tracking y Analytics
- Mantenimiento
- Solución de Problemas
- Documentación Técnica
El Bot de WhatsApp Alpix Chile es un asistente virtual inteligente diseñado para automatizar la atención al cliente y generar leads para los cursos de capacitación industrial de Alpix Chile. Especializado en:
- Cursos IRATA - Certificación en trabajo con cuerdas y acceso por cuerdas
- Cursos GWO - Certificación para la industria eólica (BST y ART)
- Promociones combinadas - Ofertas especiales IRATA + GWO
- FAQ automatizadas - Respuestas a preguntas frecuentes
- Derivación inteligente - Conexión con asesores humanos cuando es necesario
- Automatización: ~80% de consultas resueltas sin intervención humana
- Tiempo de respuesta: < 3 segundos promedio
- Conversión: Tracking automático de leads en HubSpot
- Disponibilidad: 24/7 con monitoreo automático
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ WhatsApp │ │ Twilio │ │ Cloud Run │
│ Business │◄──►│ WhatsApp API │◄──►│ (server.js) │
│ │ │ │ │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
┌─────────────────┐ │
│ Dialogflow │◄─────────────┤
│ (NLU/Intent │ │
│ Recognition) │ │
└─────────────────┘ │
│
┌─────────────────┐ │
│ HubSpot │◄─────────────┘
│ (CRM/Lead │
│ Tracking) │
└─────────────────┘
- Número empresarial:
+56 9 5659 4744 - Interfaz nativa de WhatsApp
- Soporte para textos, botones interactivos y documentos PDF
- Manejo de mensajes bidireccionales
- Templates de WhatsApp Business
- Gestión de medios (PDFs)
- Webhooks para eventos en tiempo real
- Ruta principal (
/): Procesamiento de mensajes de Twilio - Ruta fulfillment (
/fulfillment): Webhook de Dialogflow - Reconocimiento inteligente de intenciones
- Gestión de contextos y estados de conversación
- Reconocimiento de intenciones
- Extracción de entidades
- Manejo de contextos conversacionales
- Fallback inteligente
- Creación/actualización automática de contactos
- Tracking de eventos e interacciones
- Generación de tickets para leads calientes
- Analytics y reporting
- IRATA (3 niveles): Nivel 1, 2 y 3
- GWO (2 tipos): BST (Primera vez) y ART (Actualización/Avanzado)
- Promociones combinadas: PROMO 1 (IRATA + BST) y PROMO 2 (IRATA + BST + ART)
- PDFs específicos por curso con información detallada
- Envío automático tras selección de curso
- Promociones optimizadas:
- PROMO 1 → Solo PDF de BST (contiene info completa)
- PROMO 2 → Solo PDF de ART (contiene info completa)
- Precios y métodos de pago
- Duración y cronogramas
- Requisitos de inscripción
- Ubicación y direcciones
- Respuestas contextualizadas según el curso de interés
- Reconocimiento de abreviaciones: "L1", "BST", "IRATA"
- Fallback contextualizado: Ayuda específica según el estado
- Limpieza automática de contextos
- Transiciones fluidas entre secciones
- Links personalizados de WhatsApp con contexto
- Mensaje pre-escrito con información del curso de interés
- Escalamiento automático para consultas complejas
Crear archivo .env en /twilio/ con:
# === CREDENCIALES TWILIO ===
TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_AUTH_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# === INTEGRACIÓN HUBSPOT ===
HUBSPOT_API_KEY=pat-na1-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# === CONFIGURACIÓN DIALOGFLOW ===
GOOGLE_APPLICATION_CREDENTIALS=./dialogflow-key.json
PROJECT_ID=alpixchat
# === CONFIGURACIÓN DEL SERVIDOR ===
PORT=8080
NODE_ENV=production/twilio/.env- Variables de entorno de producción/twilio/.env.example- Template de variables (sin valores sensibles)/twilio/dialogflow-key.json- Credenciales de servicio de Google Cloudcloudbuild.yaml- Configuración de build para Cloud RunDockerfile- Configuración de contenedor
Todos los PDFs están almacenados en Google Cloud Storage:
// URLs centralizadas en server.js
const IRATA_NIVEL_1_PDF_URL = "https://storage.googleapis.com/alpix_docs_course/PROPUESTA%20IRATA%20NIVEL%201.pdf";
const IRATA_NIVEL_2_PDF_URL = "https://storage.googleapis.com/alpix_docs_course/PROPUESTA%20IRATA%20NIVEL%202.pdf";
const IRATA_NIVEL_3_PDF_URL = "https://storage.googleapis.com/alpix_docs_course/PROPUESTA%20IRATA%20NIVEL%203.pdf";
const BST_PDF_URL = "https://storage.googleapis.com/alpix_docs_course/PROPUESTA%20CURSO%20%20BST.pdf";
const ART_PDF_URL = "https://storage.googleapis.com/alpix_docs_course/PROPUESTA%20CURSO%20ART.pdf";-
Configuración de gcloud CLI
# Verificar proyecto configurado gcloud config get-value project # Configurar proyecto si es necesario gcloud config set project alpixchat
-
Habilitación de APIs
# Habilitar Cloud Build y Cloud Run gcloud services enable cloudbuild.googleapis.com gcloud services enable run.googleapis.com
-
Configuración de Service Account
- Crear Service Account con rol "Dialogflow API Client"
- Descargar key JSON y colocar en
/twilio/dialogflow-key.json
# Clonar repositorio
git clone [repository-url]
cd dialogflow-integrations
# Configurar variables de entorno
cp twilio/.env.example twilio/.env
# Editar twilio/.env con las credenciales reales
# Desplegar a Cloud Run
gcloud builds submit --config cloudbuild.yaml .Editar Dockerfile en la raíz:
# Configurar integración específica
ENV INTEGRATION=twilio# Listar servicios activos
gcloud run services list
# Verificar logs
gcloud run services logs tail dialogflow-twilio
# Probar endpoint
curl -X POST https://[SERVICE-URL]/ \
-H "Content-Type: application/json" \
-d '{"test": "message"}'graph TD
A[Usuario inicia conversación] --> B[Saludo + Menú principal]
B --> C{Selección}
C -->|IRATA| D[Submenú IRATA Niveles]
C -->|GWO| E[Submenú GWO]
C -->|Promociones| F[Submenú Promociones]
C -->|FAQ| G[Preguntas Frecuentes]
D --> D1[Nivel 1] --> H[Envío PDF + FAQ]
D --> D2[Nivel 2] --> H
D --> D3[Nivel 3] --> H
E --> E1[BST] --> H
E --> E2[ART] --> H
F --> F1[PROMO 1: IRATA+BST] --> I[Envío PDF BST + FAQ]
F --> F2[PROMO 2: IRATA+BST+ART] --> J[Envío PDF ART + FAQ]
H --> K[¿Más información?]
I --> K
J --> K
K -->|Sí| G
K -->|No| L[Derivar a asesor]
G --> K
- INICIO - Menú principal
- IRATA_MENU - Selección de nivel IRATA
- GWO_MENU - Selección BST/ART
- PROMO_MENU - Selección de promociones
- FAQ_ACTIVE - Modo preguntas frecuentes
- CURSO_SELECTED - Curso seleccionado, esperando acción
curso-context(5 turnos) - Mantiene curso seleccionadofaq-context(3 turnos) - Contexto de FAQ activopromo-context(5 turnos) - Contexto de promociones
// Intenciones principales en Dialogflow
const INTENTS = {
'curso.irata.nivel1': 'Selección IRATA Nivel 1',
'curso.irata.nivel2': 'Selección IRATA Nivel 2',
'curso.irata.nivel3': 'Selección IRATA Nivel 3',
'curso.gwo.bst': 'Selección GWO BST',
'curso.gwo.art': 'Selección GWO ART',
'promocion.1': 'Promoción IRATA + BST',
'promocion.2': 'Promoción IRATA + BST + ART',
'faq.precio': 'Preguntas sobre precios',
'faq.duracion': 'Preguntas sobre duración',
'faq.requisitos': 'Preguntas sobre requisitos',
'hablar.asesor': 'Solicitud de asesor humano'
};-
Conversación Iniciada
{ eventType: 'bot_conversation_started', phone: userPhone, timestamp: new Date().toISOString() }
-
Curso Seleccionado
{ eventType: 'course_selected', phone: userPhone, course: 'IRATA_NIVEL_1', // BST, ART, PROMO_1, PROMO_2 timestamp: new Date().toISOString() }
-
PDF Enviado
{ eventType: 'pdf_sent', phone: userPhone, course: courseName, pdfUrl: pdfUrl, timestamp: new Date().toISOString() }
-
FAQ Consultada
{ eventType: 'faq_consulted', phone: userPhone, question: 'precio', // duracion, requisitos, ubicacion course: activeCourse, timestamp: new Date().toISOString() }
-
Derivación a Asesor
{ eventType: 'transferred_to_advisor', phone: userPhone, course: activeCourse, reason: 'manual_request', // complex_query, fallback timestamp: new Date().toISOString() }
// Creación/actualización automática de contactos
const contactData = {
phone: userPhone,
firstname: extractedName || 'Usuario WhatsApp',
lastname: 'Bot Alpix',
lead_source: 'WhatsApp Bot',
last_interaction: new Date().toISOString(),
bot_conversation_count: existingCount + 1,
interested_courses: [courseName],
bot_last_course_selected: courseName
};- Automatización Rate: % de consultas resueltas sin asesor
- Engagement Rate: % de usuarios que seleccionan cursos
- Conversion Rate: % de usuarios que consultan FAQ después de seleccionar curso
- Bounce Rate: % de usuarios que abandonan en el primer mensaje
- PDF Download Rate: % de PDFs enviados exitosamente
// Formato de logs para analytics
console.log(`[ANALYTICS] ${eventType} | Phone: ${phone} | Course: ${course} | Time: ${timestamp}`);Todos los enlaces de PDFs están centralizados como variables globales en server.js:
// === CONFIGURACIÓN DE PDFs (CENTRALIZADA) ===
const IRATA_NIVEL_1_PDF_URL = "https://storage.googleapis.com/alpix_docs_course/PROPUESTA%20IRATA%20NIVEL%201.pdf";
const IRATA_NIVEL_2_PDF_URL = "https://storage.googleapis.com/alpix_docs_course/PROPUESTA%20IRATA%20NIVEL%202.pdf";
const IRATA_NIVEL_3_PDF_URL = "https://storage.googleapis.com/alpix_docs_course/PROPUESTA%20IRATA%20NIVEL%203.pdf";
const BST_PDF_URL = "https://storage.googleapis.com/alpix_docs_course/PROPUESTA%20CURSO%20%20BST.pdf";
const ART_PDF_URL = "https://storage.googleapis.com/alpix_docs_course/PROPUESTA%20CURSO%20ART.pdf";- Subir nuevo PDF a Google Cloud Storage
- Actualizar la URL correspondiente en las variables globales
- Redesplegar el servicio
- Localizar la función correspondiente en
server.js - Editar el contenido del mensaje
- Verificar que el contexto se mantenga correctamente
- Redesplegar
- Crear nueva variable global para el PDF
- Agregar intención en Dialogflow
- Implementar lógica en
processMessage()yprocessFulfillmentRequest() - Actualizar menús y FAQ correspondientes
# Verificar estado del servicio
curl https://dialogflow-integrations-twilio-1045549844007.us-central1.run.app/health
# Verificar logs en tiempo real
gcloud run services logs tail dialogflow-twilio --follow[TWILIO_WEBHOOK]- Mensajes entrantes de Twilio[DIALOGFLOW_REQUEST]- Requests a Dialogflow[HUBSPOT_EVENT]- Eventos enviados a HubSpot[PDF_SENT]- PDFs enviados exitosamente[ERROR]- Errores críticos del sistema
# Backup de variables de entorno
cp twilio/.env twilio/.env.backup.$(date +%Y%m%d)
# Backup de credenciales de Dialogflow
cp twilio/dialogflow-key.json twilio/dialogflow-key.backup.json- Verificar estado del Cloud Run service
- Revisar logs para identificar el problema
- Rollback a versión anterior si es necesario:
gcloud run services update dialogflow-twilio --image=[PREVIOUS_IMAGE]
Síntomas:
- Mensajes de WhatsApp no generan respuesta
- No aparecen logs de webhook en Cloud Run
Diagnóstico:
# Verificar configuración de webhook en Twilio
curl -X GET "https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/IncomingPhoneNumbers.json" \
-u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKENSolución:
- Verificar que la URL del webhook esté configurada correctamente en Twilio
- Verificar que el servicio Cloud Run esté activo
- Revisar logs del servicio
Síntomas:
- Bot responde con fallback genérico
- Logs muestran intent "Default Fallback Intent"
Diagnóstico:
# Verificar logs de Dialogflow
gcloud run services logs tail dialogflow-twilio | grep DIALOGFLOWSolución:
- Verificar que las credenciales de Dialogflow sean válidas
- Entrenar el agente con más ejemplos de entrenamiento
- Revisar que el proyecto ID coincida
Síntomas:
- Error al enviar documentos por WhatsApp
- Logs muestran errores de media/documentos
Diagnóstico:
# Verificar acceso a Google Cloud Storage
curl -I "https://storage.googleapis.com/alpix_docs_course/PROPUESTA%20IRATA%20NIVEL%201.pdf"Solución:
- Verificar que las URLs de PDFs sean accesibles públicamente
- Revisar permisos de Google Cloud Storage
- Validar formato y tamaño de archivos PDF
Síntomas:
- Contactos no se crean/actualizan
- Eventos no aparecen en timeline de HubSpot
Diagnóstico:
# Verificar API key de HubSpot
curl -X GET "https://api.hubapi.com/contacts/v1/lists/all/contacts/all?hapikey=$HUBSPOT_API_KEY&count=1"Solución:
- Verificar validez del API key de HubSpot
- Revisar permisos del API key (contacts, timeline events)
- Verificar formato de datos enviados
Síntomas:
- Bot "olvida" el curso seleccionado
- Respuestas fuera de contexto
Diagnóstico:
- Revisar logs de contextos de Dialogflow
- Verificar duración de contextos configurada
Solución:
- Ajustar duración de contextos en Dialogflow (lifespan)
- Implementar almacenamiento de estado en memoria/base de datos
- Revisar limpieza de contextos en transiciones
# Verificar estado del servicio
gcloud run services describe dialogflow-twilio
# Monitorear logs en tiempo real
gcloud run services logs tail dialogflow-twilio --follow
# Verificar configuración de Twilio
twilio phone-numbers:list
# Test de conectividad a Dialogflow
gcloud auth application-default print-access-token
# Verificar credenciales de HubSpot
curl -X GET "https://api.hubapi.com/contacts/v1/lists/all/contacts/all?hapikey=$HUBSPOT_API_KEY&count=1"- Problemas de código y lógica de negocio
- Configuración de respuestas y flujos
- Integración con APIs
- Problemas de infraestructura (Cloud Run, Twilio)
- Configuración de networking y webhooks
- Monitoreo y alertas
- Problemas específicos de Twilio WhatsApp API
- Issues complejos de Dialogflow
- Problemas de la plataforma HubSpot
dialogflow-integrations/
├── twilio/
│ ├── server.js # Lógica principal del bot
│ ├── package.json # Dependencias Node.js
│ ├── .env # Variables de entorno (no en repo)
│ ├── .env.example # Template de variables
│ ├── dialogflow-key.json # Credenciales GCP (no en repo)
│ └── ENV_CONFIG.md # Documentación de configuración
├── botlib/ # Librería común Dialogflow
│ ├── dialogflow_session_client.js
│ ├── filter_responses.js
│ ├── json_to_proto.js
│ └── proto_to_json.js
├── cloudbuild.yaml # Configuración Cloud Build
├── Dockerfile # Configuración contenedor
├── README.md # Esta documentación
└── CENTRALIZACION-PDFS-COMPLETADO.md # Docs de centralización PDFs
- Método: POST
- Propósito: Webhook de Twilio para mensajes de WhatsApp
- Input: Formato webhook de Twilio
- Output: TwiML response
- Método: POST
- Propósito: Webhook de Dialogflow
- Input: Formato fulfillment request de Dialogflow
- Output: Fulfillment response JSON
{
"express": "^4.18.0", // Servidor web
"twilio": "^3.77.0", // API de Twilio
"@google-cloud/dialogflow": "^5.2.0", // Cliente Dialogflow
"dotenv": "^16.0.1", // Variables de entorno
"axios": "^0.27.2" // Cliente HTTP para HubSpot
}# === CREDENCIALES TWILIO ===
TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_AUTH_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# === INTEGRACIÓN HUBSPOT ===
HUBSPOT_API_KEY=pat-na1-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# === CONFIGURACIÓN DIALOGFLOW ===
GOOGLE_APPLICATION_CREDENTIALS=./dialogflow-key.json
PROJECT_ID=alpixchat
# === CONFIGURACIÓN DEL SERVIDOR ===
PORT=8080
NODE_ENV=production
# === CONFIGURACIÓN OPCIONAL ===
LOG_LEVEL=info
WEBHOOK_TIMEOUT=30000
MAX_RETRIES=3- Procesa mensajes directos de Twilio
- Maneja lógica de estados y navegación
- Envía respuestas directas cuando no requiere NLP
- Maneja requests de Dialogflow
- Procesa intenciones detectadas
- Gestiona contextos y entidades
- Envía PDFs través de Twilio
- Maneja errores de envío de medios
- Registra eventos en HubSpot
- Registra eventos en timeline de HubSpot
- Crea/actualiza contactos automáticamente
- Maneja rate limiting y retries
- Generan menús dinámicos de navegación
- Mantienen consistencia en la experiencia de usuario
- Facilitan mantenimiento de contenidos
console.log(`[ANALYTICS] ${eventType} | Phone: ${phone} | Course: ${course}`);
console.log(`[TWILIO_WEBHOOK] Message from ${from}: ${body}`);
console.error(`[ERROR] ${context}: ${error.message}`);try {
// Operación que puede fallar
} catch (error) {
console.error(`[ERROR] Context: ${error.message}`);
// Fallback graceful
return res.status(500).json({ error: 'Internal server error' });
}const STATES = {
INICIO: 'inicio',
IRATA_MENU: 'irata_menu',
GWO_MENU: 'gwo_menu',
PROMO_MENU: 'promo_menu',
FAQ_ACTIVE: 'faq_active'
};- ✅ Todas las URLs de PDFs centralizadas como variables globales
- ✅ Eliminación de enlaces hardcodeados en todo el código
- ✅ Documentación de cambios en
CENTRALIZACION-PDFS-COMPLETADO.md
- Implementar cache de respuestas frecuentes
- Agregar métricas de performance avanzadas
- Implementar A/B testing para diferentes flujos
- Agregar soporte para múltiples idiomas
- Implementar chatbot analytics dashboard
Documentación actualizada: Junio 2025 Versión del Bot: 2.1.0 Mantenido por: Equipo Alpix Chile DevOps