feat: n8n initial commit — JavaScript (Node.js) n8n workflow automation + axios/cheerio/puppeteer/xlsx
This commit is contained in:
@@ -0,0 +1,248 @@
|
||||
# Automatización Bot Prisa Yachts
|
||||
**Fecha:** 2 julio 2026
|
||||
**Responsable:** Álvaro
|
||||
**n8n:** https://n8n.crewinghunters.com
|
||||
|
||||
---
|
||||
|
||||
## ¿Qué es esto?
|
||||
|
||||
Sistema de automatización de captación de clientes para **Prisa Yachts LLC**, empresa de servicios náuticos en Florida. El proyecto tiene dos pilares:
|
||||
|
||||
1. **Bot de WhatsApp** — atiende consultas 24/7, clasifica el servicio solicitado y notifica al especialista correcto
|
||||
2. **Directorio marino de Florida** — base de datos de marinas, astilleros, almacenamiento y tiendas de suministros, con emails y websites, para campañas de captación
|
||||
|
||||
---
|
||||
|
||||
## Empresa: Prisa Yachts LLC
|
||||
|
||||
```
|
||||
📞 (786) 396-3315
|
||||
📧 info@prisayachts.com
|
||||
🌐 prisayachts.com
|
||||
📸 @prisayachts
|
||||
|
||||
Slogan: "Safe Command ♦ Luxury Maintenance and Care"
|
||||
```
|
||||
|
||||
### Servicios y responsables
|
||||
|
||||
| # | Servicio | Especialista | WhatsApp |
|
||||
|---|----------|-------------|----------|
|
||||
| 1 | Engines & Mechanical | Álvaro | +1 (954) 655-4084 |
|
||||
| 2 | Electrical & Electronics / NMEA | Álvaro | +1 (954) 655-4084 |
|
||||
| 3 | Teak Deck Recovery | Federico | +1 (754) 209-3375 |
|
||||
| 4 | Captaining & Crewing | Federico | +1 (754) 209-3375 |
|
||||
| 5 | Yacht Care & Detailing | Federico | +1 (754) 209-3375 |
|
||||
| 6 | Crew Placement & Staffing | Federico | +1 (754) 209-3375 |
|
||||
| 7 | Other / Otro | Ambos | — |
|
||||
|
||||
---
|
||||
|
||||
## Pilar 1 — Bot de WhatsApp
|
||||
|
||||
### Arquitectura
|
||||
|
||||
```
|
||||
Cliente WhatsApp
|
||||
│
|
||||
▼
|
||||
Meta Webhook ──► n8n Webhook (POST /prisa-whatsapp)
|
||||
│
|
||||
▼
|
||||
State Machine (Code node)
|
||||
│
|
||||
┌───────────┴───────────┐
|
||||
▼ ▼
|
||||
Is Verify? Is Send to Client?
|
||||
(GET challenge) │
|
||||
│ ▼
|
||||
Respond 200 Enviar mensaje al cliente
|
||||
│
|
||||
Notify Specialist?
|
||||
┌────────┴────────┐
|
||||
▼ ▼
|
||||
Is Both? Is Alvaro?
|
||||
┌──┴──┐ ┌──┴──┐
|
||||
▼ ▼ ▼ ▼
|
||||
Álvaro Federico Álvaro Federico
|
||||
```
|
||||
|
||||
### Flujo del bot (state machine)
|
||||
|
||||
```
|
||||
PASO 1 — "new" / reset words (hola, hello, hi, menu, start)
|
||||
→ Enviar MENÚ PRINCIPAL (opciones 1-7)
|
||||
→ Estado: waiting_category
|
||||
|
||||
PASO 2 — "waiting_category"
|
||||
→ Cliente responde 1-7
|
||||
→ Enviar formulario del servicio específico
|
||||
→ Estado: collecting_info
|
||||
|
||||
PASO 3 — "collecting_info"
|
||||
→ Cliente envía sus datos
|
||||
→ Enviar CONFIRMACIÓN al cliente
|
||||
→ Notificar especialista con resumen del caso
|
||||
→ Estado: complete
|
||||
|
||||
PASO 4 — "complete"
|
||||
→ Siguiente mensaje reinicia el flujo desde el menú
|
||||
```
|
||||
|
||||
### Estado actual del bot
|
||||
|
||||
| Ítem | Estado |
|
||||
|------|--------|
|
||||
| Workflow creado en n8n | ✅ Desplegado |
|
||||
| Credential WhatsApp_Prisa | ✅ Creada (placeholder) |
|
||||
| Workflow activo | ✅ Activo |
|
||||
| Webhook URL | `https://n8n.crewinghunters.com/webhook/prisa-whatsapp` |
|
||||
| Token de Meta | ⏳ **Pendiente aprobación Meta** |
|
||||
| Phone Number ID | ⏳ **Pendiente aprobación Meta** |
|
||||
|
||||
### Pasos pendientes — Bot WhatsApp
|
||||
|
||||
- [ ] **Meta aprueba** la cuenta de WhatsApp Business
|
||||
- [ ] Actualizar credencial `WhatsApp_Prisa` en n8n:
|
||||
- Cambiar `PLACEHOLDER_PENDING_META_APPROVAL` → `Bearer <ACCESS_TOKEN>`
|
||||
- [ ] En los 3 nodos HTTP del workflow, cambiar URL:
|
||||
- Reemplazar `PLACEHOLDER_PHONE_NUMBER_ID` → `<YOUR_PHONE_NUMBER_ID>`
|
||||
- [ ] Configurar webhook en Meta Developer Portal:
|
||||
- URL: `https://n8n.crewinghunters.com/webhook/prisa-whatsapp`
|
||||
- Verify Token: (cualquier string, ej. `prisayachts2025`)
|
||||
- Suscribir a: `messages`
|
||||
- [ ] Prueba final: enviar "hola" al número del negocio desde WhatsApp
|
||||
|
||||
---
|
||||
|
||||
## Pilar 2 — Directorio Marino de Florida
|
||||
|
||||
### Objetivo
|
||||
|
||||
Construir la base de datos más completa posible de negocios náuticos en Florida para usar en campañas de captación (email + WhatsApp). Cada registro incluye:
|
||||
|
||||
`Nombre | Dirección | Teléfono | Email | Ciudad | Condado | Website`
|
||||
|
||||
### Categorías del directorio
|
||||
|
||||
| Hoja | Descripción |
|
||||
|------|-------------|
|
||||
| `MARINAS` | Puertos deportivos y marinas |
|
||||
| `ASTILLEROS` | Boatyards y talleres náuticos |
|
||||
| `ALMACENAMIENTO` | Boat storage / dry stack |
|
||||
| `SUMINISTROS` | Tiendas de suministros marinos |
|
||||
|
||||
### Cobertura geográfica actual
|
||||
|
||||
El archivo principal es `Directorio_Marino_FL_Acumulativo_4.xlsx`.
|
||||
|
||||
| Sesión | Zona | Condados principales |
|
||||
|--------|------|---------------------|
|
||||
| 1-3 | Florida Sur | Miami-Dade, Broward, Palm Beach |
|
||||
| 4 | Florida Centro | Martin, St. Lucie, Okeechobee, Sarasota, Charlotte, Lee, Collier, Monroe (Keys) |
|
||||
| 5 | Florida Oeste-Centro | Pinellas, Hillsborough, Manatee, Pasco, Hernando |
|
||||
| 6 *(add_north_florida.js)* | Florida Norte | Volusia, Flagler, Indian River, Brevard, Citrus, Levy, Dixie, Taylor, Wakulla, Franklin, Gulf, Bay, Walton, Okaloosa, Santa Rosa, Escambia, Duval, St. Johns, Nassau |
|
||||
|
||||
**Registros Florida Norte (Sesión 6):**
|
||||
- Marinas: 128
|
||||
- Astilleros: 24
|
||||
- Almacenamiento: 16
|
||||
- Suministros: 37
|
||||
- **Total sesión 6: 205 registros**
|
||||
|
||||
### Scraper de emails (`scrape_marine_emails.js`)
|
||||
|
||||
Automatiza la búsqueda de emails y websites para los registros que no los tienen:
|
||||
|
||||
```
|
||||
Para cada negocio en el Excel:
|
||||
1. Buscar en DuckDuckGo: "nombre" ciudad Florida marina contact email
|
||||
2. Filtrar dominios basura (Yelp, Google, Facebook, etc.)
|
||||
3. Scrapear homepage → página /contact → página /about
|
||||
4. Extraer emails con regex, puntuar por relevancia
|
||||
5. Guardar resultado en el Excel (checkpoint cada 25 filas)
|
||||
```
|
||||
|
||||
**Última ejecución del scraper:**
|
||||
- Procesó hoja MARINAS (174 filas)
|
||||
- Guardado de emergencia a `_output.xlsx` (archivo bloqueado por Excel)
|
||||
- Muchos registros de Miami/Broward sin email (negocios grandes, emails corporativos difíciles de scrapear)
|
||||
|
||||
### Pasos pendientes — Directorio
|
||||
|
||||
- [ ] Verificar completitud del Excel actual (contar registros por zona y categoria)
|
||||
- [ ] Correr scraper en `MARINAS_NORTE`, `ASTILLEROS_NORTE`, `ALMACENAMIENTO_NORTE`, `SUMINISTROS_NORTE`
|
||||
- [ ] Completar emails faltantes de Florida Sur manualmente (prioridad: marinas grandes)
|
||||
- [ ] Decidir si expandir a otros estados (Georgia, Carolina del Sur, Texas...)
|
||||
- [ ] Consolidar todos los acumulativos en un único archivo maestro limpio
|
||||
|
||||
---
|
||||
|
||||
## Pilar 3 — Campañas de Captación (próximo paso)
|
||||
|
||||
Una vez el directorio esté completo con emails, lanzar campañas automáticas:
|
||||
|
||||
### Email marketing
|
||||
- Plataforma a definir: Mailchimp / Brevo / n8n con SMTP
|
||||
- Segmentación por tipo de negocio y zona geográfica
|
||||
- Template con brochure de Prisa Yachts (ya existe `Prisa_Yachts_Brochure.pdf`)
|
||||
- Medir aperturas y clicks
|
||||
|
||||
### WhatsApp marketing (futuro)
|
||||
- Usar la API aprobada de Meta para enviar mensajes masivos (templates aprobados)
|
||||
- Segmentar por servicio relevante para cada tipo de marina
|
||||
- Flujo: contacto frío → si responde, entra al bot automáticamente
|
||||
|
||||
---
|
||||
|
||||
## Archivos del proyecto
|
||||
|
||||
| Archivo | Descripción |
|
||||
|---------|-------------|
|
||||
| `create_whatsapp_workflow.js` | Despliega el bot en n8n (ejecutar una vez) |
|
||||
| `scrape_marine_emails.js` | Scraper de emails del directorio |
|
||||
| `add_north_florida.js` | Agrega datos de Florida Norte al Excel |
|
||||
| `convert_to_pdf.js` | Genera `Prisa_Yachts_Brochure.pdf` desde HTML |
|
||||
| `Directorio_Marino_FL_Acumulativo_4.xlsx` | Base de datos principal |
|
||||
| `Directorio_Marino_FL_Acumulativo_4_output.xlsx` | Copia de emergencia del scraper |
|
||||
| `Directorio_Marino_FL_Acumulativo_5.xlsx` | Datos adicionales (pendiente integrar) |
|
||||
| `Prisa_Yachts_Brochure.html` | Brochure en HTML |
|
||||
| `Prisa_Yachts_Brochure.pdf` | Brochure generado |
|
||||
| `scrape_log.txt` | Log de la última ejecución del scraper |
|
||||
|
||||
---
|
||||
|
||||
## Dependencias técnicas
|
||||
|
||||
```json
|
||||
{
|
||||
"axios": "^1.18.1", // HTTP requests
|
||||
"cheerio": "^1.2.0", // HTML parsing / scraping
|
||||
"puppeteer": "^25.1.0", // HTML → PDF
|
||||
"xlsx": "^0.18.5" // Lectura/escritura Excel
|
||||
}
|
||||
```
|
||||
|
||||
**n8n:** Self-hosted en `https://n8n.crewinghunters.com`
|
||||
**API Key n8n:** En `create_whatsapp_workflow.js` (hardcoded — mover a variable de entorno)
|
||||
|
||||
---
|
||||
|
||||
## Resumen de prioridades
|
||||
|
||||
### 🔴 Bloqueado (esperando tercero)
|
||||
1. Aprobación de Meta para WhatsApp Business API
|
||||
|
||||
### 🟡 En progreso
|
||||
2. Completar directorio marino (scraper + revisión manual)
|
||||
3. Integrar `Directorio_Marino_FL_Acumulativo_5.xlsx` al archivo principal
|
||||
|
||||
### 🟢 Listo para ejecutar cuando Meta apruebe
|
||||
4. Actualizar credenciales en n8n y probar bot en producción
|
||||
5. Lanzar primera campaña de email a marinas de Florida Sur
|
||||
|
||||
### 🔵 Próximos pasos estratégicos
|
||||
6. Diseñar templates de WhatsApp aprobados por Meta
|
||||
7. Construir workflow n8n para envío masivo de emails
|
||||
8. Expandir directorio a otras costas (Gulf Coast, Carolinas)
|
||||
Reference in New Issue
Block a user