Documentacion Agente Secretaria GroupGarre

Documentacion completa del agente WhatsApp secretaria — arquitectura, flujos, credenciales, quirks tecnicas

project Modificado: 15/4/2026 agente_secretaria_doc.md

Agente Secretaria WhatsApp — GroupGarre

Estado: MVP en producción (28 marzo 2026) Objetivo: Agente IA que actúa como secretaria por WhatsApp para GroupGarre. Producto vendible a autónomos/PYMEs a 59-79€/mes.


Stack Técnico

Componente Detalle
n8n 217.154.106.6:5678 · https://n8n.lucasgarre.com · v2.6.3
WAHA http://100.126.176.115:3010 · sesión default · número 652237257 · API key GarreWaha2025!
Claude Haiku 4.5 (claude-haiku-4-5-20251001) · API key GroupGarre
Google Calendar OAuth2 n8n cred ID AT7L5CboAr5r4Vg5 · lucas@lucasgarre.com
SMTP Gmail · n8n cred ID SL3nmGOFlKqnedtg · lucas@lucasgarre.com / omdkjaumjnecycww
Webhook https://n8n.lucasgarre.com/webhook/whatsapp-agent
Workflow ID kz7snVzkUOLDHQJJ
Deploy script C:\Users\lucas\AppData\Local\Temp\build_wf4.py

Arquitectura del Workflow

WAHA Webhook
    └─► Filtro (fromMe≠true, event=message, body≠vacío)
            └─► Read State (Code) → lee staticData por teléfono
                    └─► IF Awaiting Slot?
                            ├─ TRUE ─► Claude Parse Slot (HTTP)
                            │              └─► Decode Slot (Code)
                            │                      └─► IF Slot OK?
                            │                              ├─ TRUE ─► Save + Ask Email State (Code)
                            │                              │              └─► Claude Ask Email (HTTP)
                            │                              │                      └─► WAHA Ask Email
                            │                              └─ FALSE ─► Claude Clarify (HTTP)
                            │                                              └─► WAHA Clarify
                            └─ FALSE ─► IF Awaiting Email?
                                            ├─ TRUE ─► Extract Email (Code)
                                            │              └─► IF Email Valid?
                                            │                      ├─ TRUE ─► Prepare Event (Code)
                                            │                      │              └─► GCal Crear Evento
                                            │                      │                      └─► Email al cliente
                                            │                      │                              └─► Email a Lucas
                                            │                      │                                      └─► WAHA Notif Lucas
                                            │                      │                                              └─► WAHA Confirmar
                                            │                      └─ FALSE ─► IF Wants Change?
                                            │                                      ├─ TRUE ─► Claude Gestiona Cambio
                                            │                                      │              └─► WAHA Cambio
                                            │                                      └─ FALSE ─► WAHA Pide Email Otra Vez
                                            └─ FALSE ─► Claude Aria (HTTP)
                                                            └─► Check Cita (Code)
                                                                    └─► IF Needs Calendar?
                                                                            ├─ TRUE ─► GCal Get Events
                                                                            │              └─► Process Slots (Code)
                                                                            │                      └─► Claude Proponer Huecos (HTTP)
                                                                            │                              └─► WAHA Slots
                                                                            └─ FALSE ─► Save History (Code)
                                                                                            └─► WAHA General

Máquina de Estados

Estado guardado en $getWorkflowStaticData('global').conversations[phone]:

{
  "state": "idle | awaiting_slot | awaiting_email",
  "slots": [...],
  "selectedSlot": { "label": "lunes 30 de marzo a las 9h", "iso": "...", "isoEnd": "..." },
  "history": [{ "role": "user|assistant", "content": "..." }]
}
Estado Qué significa Siguiente acción
idle Conversación normal Claude Aria responde, guarda historial (últimos 8 mensajes)
awaiting_slot Se propusieron huecos, esperando elección Claude parsea el número elegido
awaiting_email Hueco guardado en selectedSlot, esperando email Extrae email con regex, detecta intento de cambio

Flujo Completo de Cita

  1. Cliente: "Quiero una reunión" → Aria detecta [[PIDE_CITA]]
  2. Sistema consulta Google Calendar (próximos 14 días, excluye fines de semana)
  3. Genera 4 huecos libres de 1h (horarios: 9h, 10:30h, 12h, 15h, 16:30h)
  4. Claude propone los huecos con texto amigable → WAHA al cliente
  5. Estado: awaiting_slot
  6. Cliente elige número (1-4) → Claude parsea → si válido:
  7. Guarda selectedSlot → Claude pide email → WAHA al cliente
  8. Estado: awaiting_email
  9. Cliente da email → extrae con regex
  10. Crea evento Google Calendar
  11. Envía email de confirmación al cliente
  12. Envía email de notificación a lucas@lucasgarre.com
  13. Envía WhatsApp a 690121938 (personal Lucas) con: teléfono cliente, fecha, email
  14. Envía WhatsApp de confirmación al cliente
  15. Estado: idle

Detección de Cambio de Hueco

Si el cliente está en awaiting_email y en vez del correo dice algo como "cambia", "espera", "otro", "prefiero", "puede", etc.:

  • Extract Email (Code) detecta la intención con keywords
  • Resetea estado a idle
  • Claude Gestiona Cambio responde con empatía
  • Si el cliente vuelve a pedir cita, empieza el flujo desde cero

Keywords detectadas: cambiar, borrar, eliminar, modificar, cancel, otro, otra, diferente, espera, mejor, quiero, prefiero, puede, podr


System Prompt de Aria

Eres Aria, la secretaria virtual de GroupGarre, agencia de inteligencia artificial en Madrid.
PERSONALIDAD: Amable, profesional, eficiente. Siempre en español. Respuestas concisas (max 4 frases).
SERVICIOS: Agentes IA para atención al cliente, automatización de procesos con IA,
desarrollo de soluciones IA personalizadas, consultoría IA.
CITAS: Si el cliente quiere concertar reunión, visita o llamada, incluye [[PIDE_CITA]]
al INICIO de tu respuesta, seguido de tu mensaje.
PRECIOS: Dependen del proyecto. Un asesor les contactará.

Quirks Técnicas Importantes (n8n 2.6.3)

Problema Causa Solución
$helpers is not defined en Code nodes Task runner sandbox no expone $helpers Todos los HTTP calls en nodos HTTP Request, Code nodes son pure logic
Boolean equals: false no funciona en IF Bug/quirk de n8n Usar notEquals: true
Spread operator ...arr falla en expresiones Limitación del evaluador Usar .concat([...])
$json.body.event con .body. prefix Webhook wrappea la request en {body, headers, params, query} Siempre usar $json.body.payload.from, etc.
GCal Get Events para calendario vacío detiene el workflow n8n para si output = 0 items alwaysOutputData: true en el nodo GCal
Mensajes vacíos (fotos, reacciones) rompen Claude WAHA envía webhook con body: "" 3ª condición en el filtro: body notEquals ""

Credenciales Relevantes

Servicio Cred ID n8n Usuario Contraseña/Key
Google Calendar OAuth2 AT7L5CboAr5r4Vg5 lucas@lucasgarre.com OAuth
SMTP Gmail SL3nmGOFlKqnedtg lucas@lucasgarre.com omdkjaumjnecycww
Anthropic API (en HTTP headers) sk-ant-api03-BfHj_...
WAHA (en HTTP headers) GarreWaha2025!

Para Adaptar a Otro Cliente

Cambiar en build_wf4.py:

  1. ARIA_SYSTEM — adaptar nombre de la empresa, servicios, tono
  2. LUCAS_PHONE — número personal del cliente para notificaciones
  3. FROM_EMAIL / SMTP_CRED_ID — email desde el que se envían confirmaciones
  4. GCAL_CRED_ID — credencial Google Calendar del cliente
  5. WAHA_KEY y URL — si tienen su propia instancia WAHA
  6. Crear nuevo workflow en n8n y actualizar WF_ID