Módulo 2: Gmail y Email
Mini-Proyecto: Respuesta Automática Inteligente
Descripción de la cápsula
Hora de juntar todo el módulo en un workflow real.
El proyecto: un sistema de respuesta automática para una bandeja de soporte. Cada correo que llega a support@ se procesa solo: el workflow lo lee, clasifica de qué trata (consulta de ventas, problema técnico, o pregunta de facturación), envía una respuesta automática apropiada al tipo, registra el ticket en una hoja de Google Sheets, y marca el correo como procesado para no tocarlo dos veces.
Es un proyecto pequeño pero completo y realista: usa el Gmail Trigger con filtros (cápsula 04), el routing con IF/Switch (de G2), el envío con Reply para mantener el hilo (cápsulas 03 y 07), el registro en Sheets con el patrón "buscar antes de actuar" (Módulo 1), y el etiquetado como estado (cápsula 06). Cuando lo termines, tendrás el esqueleto de un asistente de bandeja que puedes adaptar a casi cualquier tipo de correo entrante.
Lo que vas a construir
Un workflow llamado Asistente de Soporte que:
- Se dispara cuando llega un correo a la bandeja de soporte (sin la etiqueta
processed) - Clasifica el correo en uno de tres tipos según palabras clave del asunto/cuerpo
- Envía una respuesta automática distinta según el tipo, dentro del mismo hilo
- Registra el ticket en una hoja de Google Sheets (sin duplicar)
- Marca el correo con la etiqueta
auto/processedpara no volver a tocarlo
Lo que vas a practicar
- ✅ Gmail Trigger con filtros y la estrategia anti-doble-procesamiento (cápsula 04 + 06)
- ✅ Routing con Switch según el contenido del correo (G2 aplicado)
- ✅ Reply para responder dentro del hilo (cápsulas 03 + 07)
- ✅ Registro en Sheets con el patrón del Módulo 1
- ✅ Etiquetado como estado para cerrar el ciclo (cápsula 06)
- ✅ Integrar dos herramientas (Gmail + Sheets) en un solo flujo de negocio
Preparación
La hoja de tickets
Crea una hoja Tickets Soporte con estas columnas en la fila 1:
| email_id | date | sender | subject | type | status |
|---|
Formatea email_id como Texto sin formato (es un identificador, cápsula 07 del Módulo 1).
La etiqueta
Crea en Gmail una etiqueta llamada auto/processed.
Las direcciones de prueba
Para probar, necesitas poder mandarte correos. Usa tu propia cuenta (o una segunda) y un asunto reconocible como [SUPPORT].
Arquitectura del workflow
Gmail Trigger (filtro: subject:[SUPPORT] -label:auto/processed)
│
▼
Set: extraer y normalizar datos del correo
│
▼
Switch: ¿de qué tipo es? (según palabras clave)
│
┌──────────────┬──────────────┬──────────────┐
▼ sales ▼ technical ▼ billing ▼ (other)
Gmail Reply Gmail Reply Gmail Reply Gmail Reply
(resp. ventas) (resp. técnica)(resp. factur.)(resp. genérica)
│ │ │ │
└──────────────┴──────┬───────┴──────────────┘
▼
Google Sheets: registrar ticket (Append, con id como clave)
│
▼
Gmail: Add Label "auto/processed"
Paso 1: el Gmail Trigger
- Credential: tu credencial de Gmail
- Poll Times:
Every Minute - Filters → Search:
subject:[SUPPORT] -label:auto/processed
El filtro hace dos cosas: solo procesa correos de soporte, y excluye los que ya tienen la etiqueta — la defensa anti-doble-procesamiento de la cápsula 06.
Paso 2: normalizar los datos del correo
Un nodo Set que extrae lo que necesitamos del correo entrante, limpio:
email_id = {{ $json.id }}
thread_id = {{ $json.threadId }}
sender = {{ $json.from }}
subject = {{ $json.subject }}
body = {{ $json.textPlain || $json.snippet }}
date = {{ $now.toFormat('yyyy-LL-dd HH:mm') }}
Nota: usamos textPlain para el cuerpo (texto limpio, no HTML — cápsula 04), con snippet como respaldo por si textPlain viene vacío.
Paso 3: clasificar con Switch
Un nodo Switch que decide el tipo según palabras clave. Configura las reglas (modo expression) revisando el asunto y el cuerpo:
| Salida | Condición (se cumple si...) |
|---|---|
| sales | el asunto o cuerpo contiene "precio", "cotización", "comprar", "plan" |
| technical | contiene "error", "no funciona", "falla", "problema" |
| billing | contiene "factura", "pago", "cobro", "reembolso" |
| fallback | ninguna de las anteriores |
Una forma de escribir cada condición (ejemplo para "técnico"):
{{ /error|no funciona|falla|problema/i.test($json.subject + ' ' + $json.body) }}
(/.../i hace la búsqueda insensible a mayúsculas; .test() devuelve true/false.)
Esto es clasificación por palabras clave — simple y suficiente para muchos casos. En G6 y G7 del path verás clasificación con IA, que entiende el correo de verdad en vez de buscar palabras. Por ahora, las palabras clave nos dan un sistema funcional.
Paso 4: responder según el tipo
En cada salida del Switch, un nodo Gmail con operación Reply. La operación Reply (no Send) hace que la respuesta continúe el hilo (cápsula 07):
- Operation:
Reply - Message ID:
{{ $('Set').item.json.email_id }} - Message: la respuesta apropiada al tipo
Ejemplo para la rama ventas:
<p>Hola,</p>
<p>Gracias por tu interés. Un asesor del equipo de ventas te contactará
en menos de 24 horas con la información que necesitas.</p>
<p>Mientras tanto, puedes ver nuestros planes en el enlace de abajo.</p>
<p>Saludos,<br>Equipo de Soporte</p>
Ejemplo para técnico:
<p>Hola,</p>
<p>Recibimos tu reporte y nuestro equipo técnico ya está revisándolo.
Te responderemos con una solución lo antes posible.</p>
<p>Si es urgente, responde a este correo con más detalles del error.</p>
<p>Saludos,<br>Equipo de Soporte</p>
Haz lo mismo para facturación y para el fallback (una respuesta genérica de "recibimos tu mensaje").
Configura Sender Name =
Equipo de Soportey un Reply To real en cada nodo (cápsula 03) — hace que la respuesta automática se sienta humana.
Paso 5: registrar el ticket en Sheets
Las cuatro ramas del Switch convergen en un nodo Google Sheets. Como cada correo tiene un id único, no habría duplicados naturales — pero aplicamos el patrón del Módulo 1 por robustez. Lo más simple aquí es Update or Append con email_id como clave:
- Operation:
Update or Append Row - Document:
Tickets Soporte - Column to match on:
email_id - Mapping (manual):
email_id→{{ $('Set').item.json.email_id }}date→{{ $('Set').item.json.date }}sender→{{ $('Set').item.json.sender }}subject→{{ $('Set').item.json.subject }}type→ el tipo de esta rama (texto fijo:sales,technical, etc.) — o{{ $json.type }}si lo pasaste por el Switchstatus→replied(texto fijo)
Usar Update or Append con el id como clave garantiza: si por cualquier razón el mismo correo llega de nuevo, se actualiza la fila en vez de duplicarla.
Paso 6: marcar como procesado
El último paso, después del registro: un nodo Gmail con Add Label.
- Operation:
Add Label - Message ID:
{{ $('Set').item.json.email_id }} - Label:
auto/processed
Esto cierra el ciclo. El correo queda etiquetado, y el filtro del trigger (-label:auto/processed) garantiza que nunca se procese de nuevo — ni en la siguiente revisión del polling, ni si pruebas el workflow.
Este
Add Labeldebe ejecutarse para todas las ramas. Como las cuatro ramas del Switch ya convergieron en el nodo de Sheets (paso 5), el Add Label después de Sheets cubre todos los casos.
Paso 7: probar el workflow
Prueba 1: correo de ventas
- Activa el workflow
- Mándate un correo: asunto
[SUPPORT] consulta de precio, cuerpo "¿cuánto cuesta el plan anual?" - Espera ~1 minuto
- Verifica: recibiste la respuesta de ventas dentro del mismo hilo, hay una fila nueva en
Tickets Soportecontype = sales, y el correo tiene la etiquetaauto/processed
Prueba 2: correo técnico
- Mándate: asunto
[SUPPORT] la app no funciona, cuerpo "me sale un error al entrar" - Verifica: respuesta técnica, fila con
type = technical, etiquetado
Prueba 3: el anti-doble-procesamiento
- Espera otro ciclo de polling (~1-2 minutos)
- Verifica: los correos de las pruebas 1 y 2 no se procesaron de nuevo — el filtro
-label:auto/processedlos excluye
Prueba 4: el fallback
- Mándate: asunto
[SUPPORT] hola, cuerpo "solo quería saludar" - Verifica: recibiste la respuesta genérica (ninguna palabra clave coincidió)
Checklist de éxito
- El workflow dispara solo con correos
[SUPPORT], no con otros - Clasifica correctamente en ventas / técnico / facturación / fallback
- La respuesta llega dentro del hilo del correo original (Reply, no Send)
- Cada ticket queda registrado en la hoja con su tipo
- Cada correo procesado recibe la etiqueta
auto/processed - Un correo ya procesado no se vuelve a procesar
- Las cuatro ramas terminan registrando y etiquetando (ninguna se queda a medias)
Cómo llevar esto a producción
Lo que construiste es un esqueleto reutilizable. Para producción:
- Conecta una bandeja real de soporte. Cambia el filtro del trigger de
subject:[SUPPORT]ato:support@yourdomain.com. - Afina las palabras clave. Las del Switch son un punto de partida; ajústalas según los correos reales que recibes.
- Considera clasificación con IA. Las palabras clave fallan con correos ambiguos. G6/G7 del path enseñan a clasificar con un modelo que entiende el correo. Este workflow es el esqueleto perfecto para esa mejora — solo cambias el Switch.
- Avisa al equipo humano. Para tipos que necesitan atención humana (técnico, facturación), agrega un nodo que notifique al equipo — eso conecta con el Módulo 4 (Slack).
- Maneja errores. Si Gmail o Sheets fallan, ahora mismo el workflow se detiene. G10 (Production) cubre cómo hacerlo resiliente.
Resumen del módulo
Con este proyecto cierras el Módulo 2 — Gmail y email. Recapitulando lo que ahora dominas:
- Conectar Gmail con OAuth2 y entender sus permisos (cápsula 02)
- Enviar correos con HTML, destinatarios y cuerpo dinámico (cápsula 03)
- Recibir y disparar workflows desde correos entrantes — y entender el polling (cápsula 04)
- Buscar correos con el lenguaje de búsqueda de Gmail (cápsula 05)
- Etiquetar y organizar usando etiquetas como estado (cápsula 06)
- Diagnosticar spam, límites, threading y permisos (cápsula 07)
- Integrar todo — y dos herramientas — en un asistente de bandeja funcional (esta cápsula)
El patrón estrella del módulo: el email es un canal asíncrono que se vuelve un disparador de automatizaciones — y las etiquetas son el estado que mantiene esas automatizaciones confiables.
Lo que sigue (Módulo 3):
Gmail mueve mensajes. El Módulo 3 — Google Calendar mueve el tiempo: crear eventos automáticamente, listar la agenda, programar recordatorios. Vas a poder cerrar otro círculo: un lead entra a la hoja (M01), recibe un correo (M02) y se le agenda una llamada (M03).
Recursos adicionales
- n8n Gmail node Docs - Operaciones Reply y Add Label.
- n8n Switch node Docs - El nodo que clasifica el correo.
- n8n Google Sheets node Docs - Update or Append para registrar tickets.
Creado: Mayo 14, 2026 Versión: 1.0