Add README.md for WhatsApp promotion system documentation
This commit is contained in:
@@ -0,0 +1,337 @@
|
||||
# Promoción por WhatsApp
|
||||
|
||||
Sistema automatizado de promoción vía WhatsApp utilizando n8n, Supabase y WhatsApp Cloud API.
|
||||
|
||||
---
|
||||
|
||||
# Descripción General
|
||||
|
||||
Este flujo administra la interacción completa con usuarios mediante WhatsApp para registrar participantes en una promoción.
|
||||
|
||||
Incluye:
|
||||
|
||||
- Validación de mensajes entrantes
|
||||
- Gestión de consentimiento de privacidad y marketing
|
||||
- Registro de información del usuario
|
||||
- Validación y registro de códigos de productos
|
||||
- Control de estados del usuario
|
||||
- Prevención de fraude y spam
|
||||
|
||||
---
|
||||
|
||||
# Tecnologías Utilizadas
|
||||
|
||||
- n8n
|
||||
- Supabase
|
||||
- PostgreSQL
|
||||
- WhatsApp Cloud API
|
||||
|
||||
---
|
||||
|
||||
# Arquitectura del Flujo
|
||||
|
||||
El sistema funciona mediante una máquina de estados (`state machine`) donde cada usuario tiene un estado actual que determina la siguiente acción del flujo.
|
||||
|
||||
## Estados Disponibles
|
||||
|
||||
- `CONSENT_PRIVACY`
|
||||
- `CONSENT_MARKETING`
|
||||
- `ASK_NAME`
|
||||
- `ASK_ID`
|
||||
- `ASK_EMAIL`
|
||||
- `ASK_LOCATION`
|
||||
- `ASK_CODE`
|
||||
- `MENU_AFTER_CODE`
|
||||
- `DONE`
|
||||
|
||||
---
|
||||
|
||||
# Flujo General
|
||||
|
||||
## 1. Recepción y Normalización
|
||||
|
||||
El flujo recibe mensajes desde WhatsApp y:
|
||||
|
||||
- Extrae el contenido del mensaje
|
||||
- Detecta el tipo de mensaje:
|
||||
- Texto
|
||||
- Imagen
|
||||
- Interactivo
|
||||
- Normaliza caracteres y acentos
|
||||
- Filtra números bloqueados
|
||||
|
||||
---
|
||||
|
||||
## 2. Validación Inicial
|
||||
|
||||
Si el mensaje no contiene contenido válido:
|
||||
|
||||
- El flujo se detiene automáticamente
|
||||
|
||||
---
|
||||
|
||||
## 3. Creación o Consulta del Usuario
|
||||
|
||||
Se ejecuta la función RPC:
|
||||
|
||||
```sql
|
||||
ensure_user_wa
|
||||
```
|
||||
|
||||
Esta función:
|
||||
|
||||
- Crea el usuario si no existe
|
||||
- Consulta el estado actual del usuario
|
||||
- Devuelve `out_state`
|
||||
|
||||
---
|
||||
|
||||
# Router de Estados
|
||||
|
||||
Según el valor de `out_state`, el flujo dirige al usuario a la etapa correspondiente.
|
||||
|
||||
| Estado | Acción |
|
||||
| ----------------- | ---------------------------------- |
|
||||
| CONSENT_PRIVACY | Solicitar aceptación de privacidad |
|
||||
| CONSENT_MARKETING | Solicitar consentimiento marketing |
|
||||
| ASK_NAME | Solicitar nombre completo |
|
||||
| ASK_ID | Solicitar identificación |
|
||||
| ASK_EMAIL | Solicitar correo electrónico |
|
||||
| ASK_LOCATION | Solicitar ubicación |
|
||||
| ASK_CODE | Solicitar código del producto |
|
||||
| MENU_AFTER_CODE | Mostrar menú posterior |
|
||||
| DONE | Finalizar flujo |
|
||||
|
||||
---
|
||||
|
||||
# Consentimientos
|
||||
|
||||
## Consentimiento de Privacidad
|
||||
|
||||
El usuario puede responder:
|
||||
|
||||
- `SI`
|
||||
- `NO`
|
||||
|
||||
### Comportamiento
|
||||
|
||||
- `SI` → continúa el flujo
|
||||
- `NO` → se detiene el avance
|
||||
|
||||
### RPC utilizada
|
||||
|
||||
```sql
|
||||
set_consent_privacy_wa
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Consentimiento de Marketing
|
||||
|
||||
El usuario puede responder:
|
||||
|
||||
- `SI`
|
||||
- `NO`
|
||||
|
||||
### Comportamiento
|
||||
|
||||
- `SI` → opt-in marketing
|
||||
- `NO` → opt-out marketing
|
||||
|
||||
### RPC utilizada
|
||||
|
||||
```sql
|
||||
set_consent_marketing_wa
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Captura de Datos
|
||||
|
||||
## Nombre
|
||||
|
||||
### Validaciones
|
||||
|
||||
- Mínimo 6 caracteres
|
||||
- Debe contener al menos 2 palabras
|
||||
- Solo letras permitidas
|
||||
|
||||
### RPC
|
||||
|
||||
```sql
|
||||
set_name_wa
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Identificación
|
||||
|
||||
### Validaciones
|
||||
|
||||
- Campo obligatorio
|
||||
- No vacío
|
||||
|
||||
### RPC
|
||||
|
||||
```sql
|
||||
set_id_wa
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Email
|
||||
|
||||
### Opciones permitidas
|
||||
|
||||
- Correo válido
|
||||
- `NO` para omitir
|
||||
|
||||
### Validación
|
||||
|
||||
Se utiliza validación mediante regex para verificar formato email.
|
||||
|
||||
### RPC
|
||||
|
||||
```sql
|
||||
set_email_wa
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Ubicación
|
||||
|
||||
### Validación
|
||||
|
||||
- Debe pertenecer a una lista cerrada de departamentos
|
||||
|
||||
### RPC
|
||||
|
||||
```sql
|
||||
set_location_wa
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Registro de Códigos
|
||||
|
||||
## Formato del Código
|
||||
|
||||
El sistema valida códigos con la siguiente estructura:
|
||||
|
||||
- 4 números
|
||||
- 1 letra
|
||||
- 3 números
|
||||
- marcador (`C`, `S`, `M`, `T`)
|
||||
- 1 número
|
||||
|
||||
### Ejemplo
|
||||
|
||||
```txt
|
||||
1234A567C9
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Registro del Código
|
||||
|
||||
### RPC utilizada
|
||||
|
||||
```sql
|
||||
register_lot_code
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Posibles Respuestas
|
||||
|
||||
| Respuesta | Descripción |
|
||||
| --------------------- | ----------------------------------------- |
|
||||
| ❌ Código inválido | Formato incorrecto |
|
||||
| ⚠️ Código duplicado | Código ya registrado |
|
||||
| 🚫 Límite diario | Usuario alcanzó límite |
|
||||
| 🚫 Bloqueo por fraude | Detección antifraude |
|
||||
| 🎉 Código exitoso | Registro correcto y generación de cupones |
|
||||
|
||||
---
|
||||
|
||||
# Menú Posterior al Registro
|
||||
|
||||
Después de registrar un código, el usuario puede elegir:
|
||||
|
||||
1. Seguir ingresando códigos
|
||||
2. Salir
|
||||
|
||||
## Opción 1
|
||||
|
||||
El estado cambia a:
|
||||
|
||||
```txt
|
||||
ASK_CODE
|
||||
```
|
||||
|
||||
## Opción 2
|
||||
|
||||
El estado cambia a:
|
||||
|
||||
```txt
|
||||
DONE
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Reinicio del Flujo
|
||||
|
||||
Si el usuario envía alguno de estos mensajes:
|
||||
|
||||
- `hola`
|
||||
- `buenas`
|
||||
- `hello`
|
||||
|
||||
El sistema reinicia el flujo mediante:
|
||||
|
||||
```sql
|
||||
restart_wa
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Tipos de Mensajes
|
||||
|
||||
El flujo soporta:
|
||||
|
||||
- Texto simple
|
||||
- Botones interactivos
|
||||
- Listas interactivas
|
||||
|
||||
---
|
||||
|
||||
# API Utilizada
|
||||
|
||||
- WhatsApp Cloud API
|
||||
|
||||
---
|
||||
|
||||
# Características Técnicas
|
||||
|
||||
- Arquitectura basada en estados
|
||||
- Integración con Supabase mediante RPC
|
||||
- Manejo intensivo de nodos `Code`
|
||||
- Normalización de texto y caracteres
|
||||
- Sistema antifraude
|
||||
- Validaciones avanzadas
|
||||
- Manejo de errores
|
||||
|
||||
---
|
||||
|
||||
# Estructura del Proyecto
|
||||
|
||||
```txt
|
||||
Base de datos Supabase/
|
||||
├── Base de datos Postgre Presto.txt
|
||||
├── Triggers.png
|
||||
└── pg-dump-postgres1-1776492006.dmp
|
||||
|
||||
Flujo n8n/
|
||||
├── Flujo WhatsApp.docx
|
||||
└── Flujo con WSP.json
|
||||
```
|
||||
Reference in New Issue
Block a user