Módulo 4: Slack
Canales y Usuarios
Descripción de la cápsula
En la cápsula 04 quedó una deuda: para mencionar a una persona necesitas su ID de usuario, y dijimos "la cápsula 05 lo enseña". Aquí está.
Esta cápsula cubre cómo gestionar canales y usuarios desde un workflow: buscarlos, obtener sus IDs, listar los que existen. No suena a gran automatización, pero es la pieza de plomería que hace funcionar todo lo demás. Sin saber el ID del usuario, no puedes mencionarlo dinámicamente. Sin saber el ID del canal, no puedes mandar al canal correcto según los datos. Las operaciones de canales y usuarios son las que convierten "mandar siempre al mismo canal fijo" en "mandar al canal y persona que el caso requiere".
También cubre algunas operaciones de gestión más activas — crear canales, invitar gente — que tienen casos de uso reales pero que conviene usar con criterio.
Lo que vas a aprender
Al terminar esta cápsula serás capaz de:
- ✅ Entender los IDs de Slack (de canal y de usuario) y por qué importan
- ✅ Obtener el ID de un usuario a partir de su email o nombre
- ✅ Listar y buscar canales de tu workspace
- ✅ Obtener el ID de un canal para destinos dinámicos
- ✅ Crear canales e invitar usuarios desde un workflow (con criterio)
- ✅ Aplicar "buscar antes de actuar" para enrutar mensajes dinámicamente
Los IDs de Slack: por qué todo gira alrededor de ellos
Slack identifica todo con IDs — cadenas cortas, no nombres:
| Cosa | ID se ve como... | Ejemplo |
|---|---|---|
| Usuario | empieza con U | U12345678 |
| Canal | empieza con C | C0ABCDEFG |
¿Por qué no usar nombres? Porque los nombres cambian. Alguien cambia su nombre de usuario, un canal se renombra — pero el ID es estable para siempre. Slack usa IDs internamente; los nombres son solo etiquetas para humanos.
Consecuencia práctica: las operaciones que de verdad son robustas (mencionar, enviar, enrutar) usan IDs. El nodo de n8n a veces te deja usar nombres por comodidad, pero detrás todo se resuelve a IDs. Cuando un workflow falla "porque no encuentra al usuario", casi siempre es porque dependía de un nombre que cambió, o de un nombre escrito con un typo.
Obtener el ID de un usuario
El caso más común: tienes el email de alguien (porque vino de un formulario, de una hoja, de un CRM) y necesitas su ID de Slack para mencionarlo.
El nodo Slack tiene una operación para esto:
- Resource:
User - Operation:
Get(por email) — busca el usuario de Slack cuyo email coincide
Email a buscar: {{ $json.assignee_email }}
Resultado: el usuario, incluyendo su id (U...). Ese id es el que usas para la mención dinámica de la cápsula 04:
Asignado a: <@{{ $json.id }}>
Esto conecta los módulos: un lead llega con el email del vendedor asignado (de una hoja del Módulo 1) → buscas su usuario de Slack por ese email → lo mencionas en la notificación. El email es el "puente" entre sistemas.
Listar todos los usuarios
- Resource:
User - Operation:
Get Many
Trae todos los usuarios del workspace. Útil para construir, por ejemplo, una hoja de "directorio" que mapee emails a IDs de Slack — y luego consultar esa hoja en vez de llamar a Slack cada vez.
Listar y buscar canales
Para mandar a un canal de forma dinámica, primero hay que poder identificarlo.
- Resource:
Channel - Operation:
Get Many
Trae los canales del workspace, cada uno con su id (C...), su nombre, si es privado, cuántos miembros tiene.
Para qué sirve
- Destinos dinámicos: tu workflow decide a qué canal mandar según los datos (
#salespara leads,#supportpara tickets). Si tienes los IDs de los canales, puedes elegir el correcto con un Switch o un mapeo. - Validación: confirmar que un canal existe antes de intentar mandarle algo.
- Inventario: listar canales para reportes o limpieza.
Patrón recomendado: en vez de llamar a
Get Manyde canales en cada ejecución, crea una vez una pequeña tabla de referencia (en una hoja de Sheets, o incluso fija en un nodo Set) que mapeetipo de mensaje → ID de canal. Es más rápido y no gasta llamadas a la API. Los IDs de canal casi nunca cambian.
El patrón: "buscar antes de actuar" aplicado al enrutamiento
Ya conoces este patrón del Módulo 1. Aquí toma una forma nueva: buscar el destino correcto antes de enviar.
Trigger (llega un caso con un email de responsable)
│
▼
Slack (User → Get by email) ← busca el usuario de Slack
│
▼
IF: ¿se encontró el usuario?
│
┌──────────┴──────────┐
▼ SÍ ▼ NO
Slack (Send, Slack (Send a un canal
mención dinámica de "sin asignar" — el
con el ID encontrado) caso no se pierde)
La rama "NO se encontró" importa: si el email del responsable no corresponde a ningún usuario de Slack (un typo, alguien que ya no está), el mensaje no debe perderse — va a un canal de respaldo. El workflow es robusto: siempre notifica a alguien.
Crear canales e invitar usuarios (con criterio)
El nodo Slack también puede crear canales e invitar usuarios a ellos:
- Channel → Create — crea un canal nuevo
- Channel → Invite — agrega usuarios a un canal
Casos de uso reales
- Un canal por proyecto/cliente: llega un cliente nuevo → el workflow crea
#cliente-acmee invita al equipo asignado. Útil en agencias y consultoras. - Onboarding: entra un empleado → se le invita automáticamente a los canales de su área.
El criterio
Crear canales automáticamente es potente pero acumula desorden rápido. Un workflow que crea un canal por cada lead deja el workspace con cientos de canales muertos en un mes. Antes de automatizar la creación de canales, pregúntate: ¿este canal tendrá vida propia, o es basura en cuanto el caso termine? Crea canales automáticamente solo para cosas con duración real (un proyecto, un cliente), no para eventos efímeros. Y ten un plan para archivarlos cuando terminen.
Para invitar usuarios, recuerda: el bot solo puede invitar a canales de los que es miembro (y necesita los scopes adecuados — cápsula 02).
Trampas comunes
Trampa 1: Depender de nombres en vez de IDs
Qué pasa: Tu workflow menciona @Ana Lopez por nombre. Ana cambia su nombre de usuario, o hay dos "Ana", y el workflow falla o menciona a la equivocada.
Cómo evitar: Resuelve a ID lo antes posible (buscar por email es lo más estable) y trabaja con el ID.
Trampa 2: Buscar usuario por email y no manejar el "no encontrado"
Qué pasa: El email del responsable tiene un typo, o esa persona no está en Slack. La búsqueda devuelve nada y el workflow se rompe — o peor, el mensaje no se manda y nadie se entera.
Cómo evitar: Después de buscar el usuario, un IF. Si no se encontró → manda a un canal de respaldo. El caso nunca se pierde.
Trampa 3: Llamar a la API de canales/usuarios en cada ejecución
Qué pasa: Cada workflow hace Get Many de canales o usuarios para resolver un destino que casi nunca cambia. Gasta llamadas a la API y es lento.
Cómo evitar: Construye una vez una tabla de referencia (email → ID, tipo → canal) y consúltala. Los IDs son estables.
Trampa 4: Crear canales automáticamente sin plan de limpieza
Qué pasa: El workflow crea un canal por evento. En un mes hay 300 canales muertos y el workspace es un caos.
Cómo evitar: Crea canales solo para cosas con duración real (proyecto, cliente), y ten un plan para archivarlos al terminar.
Trampa 5: Asumir que el bot puede invitar a cualquier canal
Qué pasa: El workflow intenta invitar usuarios a un canal y falla.
Cómo evitar: El bot solo gestiona canales de los que es miembro, y necesita los scopes correctos. Verifica ambos.
Ejercicio: enrutamiento dinámico
Objetivo: practicar la búsqueda de usuarios y el envío al destino correcto.
Preparación
Asegúrate de saber tu propio email de Slack y tener #pruebas-n8n y otro canal de respaldo, ambos con el bot invitado.
Tu tarea
- Obtener tu ID: Manual Trigger → Slack (User, Get by email = tu email) → mira el output y localiza tu
idde usuario (U...) - Mención con el ID encontrado: encadena un Slack (Send) que te mencione usando ese
id:<@{{ $json.id }}> - El patrón completo: construye Set (con un campo
assignee_email) → Slack (User Get by email) → IF (¿se encontró?) → en TRUE: Send mencionando al usuario; en FALSE: Send a un canal de respaldo con "responsable no encontrado" - Prueba el 3 dos veces: una con tu email real, otra con un email inventado. Verifica que el caso inventado va al canal de respaldo, no se pierde
Ver pistas
- En el 3, la condición del IF puede ser
{{ $('Slack').item.json.id ? true : false }}o verificar que el resultado de la búsqueda no esté vacío — ajusta según lo que veas en el output. - La lección clave: el caso "no encontrado" siempre tiene una salida. Un mensaje que no se puede dirigir no se descarta — va a un respaldo.
Resumen y siguiente paso
- Slack identifica todo con IDs (
U...usuarios,C...canales) — estables, a diferencia de los nombres que cambian - Las operaciones robustas (mencionar, enrutar) usan IDs; resuelve a ID lo antes posible
- User → Get by email convierte un email (de una hoja, un formulario) en un ID de Slack — el "puente" entre sistemas
- Channel → Get Many lista los canales con sus IDs — para destinos dinámicos y validación
- Patrón recomendado: una tabla de referencia (email → ID, tipo → canal) construida una vez, en vez de llamar a la API en cada ejecución
- "Buscar antes de actuar" aplicado al enrutamiento: busca el destino, y si no se encuentra, manda a un canal de respaldo — el caso nunca se pierde
- Crear canales/invitar es posible pero acumula desorden — automatízalo solo para cosas con duración real
- 5 trampas: depender de nombres, no manejar "no encontrado", llamar a la API cada vez, crear canales sin limpieza, asumir que el bot puede invitar a cualquier canal
Antes de avanzar deberías poder:
- Obtener el ID de un usuario a partir de su email
- Listar los canales del workspace
- Construir un enrutamiento con respaldo para el caso "no encontrado"
Lo que sigue (cápsula 06):
Hasta ahora Slack solo recibe lo que tu workflow le manda. La cápsula 06 invierte la dirección: hacer que un mensaje o un comando en Slack dispare un workflow. Es lo que convierte Slack de un tablero de avisos en una interfaz desde la que el equipo actúa.
Recursos adicionales
- n8n Slack node Docs - Operaciones de User y Channel.
- Slack API: IDs de objetos - Cómo Slack identifica usuarios, canales y demás.
- n8n Google Sheets node Docs - Para construir la tabla de referencia email→ID.
Creado: Mayo 14, 2026 Versión: 1.0