Slack ya se adueñó de la superficie de chat de tu equipo, así que bien puede acortar tus enlaces también. La app de Elido para Slack hace dos cosas: le da a cada miembro un comando slash /shorten y enruta alertas de eventos de enlace a los canales que elijas. La instalación tarda unos 90 segundos. Sin código de manejador de webhook, sin Bolt SDK, sin túnel ngrok.
Este post recorre las tres piezas: el flujo del comando slash, la matriz de enrutamiento de alertas y el handshake HMAC que evita que solicitudes POST aleatorias suplanten a Slack. Si quieres entender la superficie de webhooks más amplia que alimenta estas alertas, el post webhooks para eventos de enlace documenta cada payload que Elido emite. La app de Slack es una de las integraciones preconstruidas que consume esos eventos por ti.
El comando slash /shorten
Un usuario escribe esto en cualquier canal:
/shorten https://blog.elido.app/post/launch-2026?utm_source=announce
Slack envía un POST firmado a https://api.elido.app/integrations/slack/commands. El cuerpo es application/x-www-form-urlencoded (Slack todavía usa codificación de formulario para los comandos slash, no JSON, lo que sorprende a todos la primera vez). Los campos relevantes son:
team_id=T01ABCD2EF
channel_id=C01234ABCDE
user_id=U01HJKLMNOP
command=/shorten
text=https://blog.elido.app/post/launch-2026?utm_source=announce
response_url=https://hooks.slack.com/commands/T01ABCD2EF/...
Elido busca la fila OAuth por team_id, encuentra el ID del espacio de trabajo contra el que se instaló, crea un shortlink en el dominio predeterminado del espacio de trabajo y devuelve un mensaje efímero en menos de 200ms al p95. La respuesta es efímera por defecto para que el canal no se llene de spam cada vez que alguien acorta una URL durante una reunión.
Si quien invoca el comando quiere un mensaje público, pasa --public como último token:
/shorten --public https://launch.elido.app
Se requieren tres scopes OAuth al instalar: commands (para que el comando slash pueda invocarse), chat:write (para que Elido pueda publicar mensajes de seguimiento con botones de copiar) e incoming-webhook (para que las alertas lleguen al canal que elige el instalador). La referencia de Slash Commands de Slack lista el conjunto completo, pero esos tres cubren todo lo que hace Elido. Los dominios personalizados se respetan: si tu espacio de trabajo tiene go.acme.com configurado via dominios personalizados, /shorten crea shortlinks en ese host.
Una nota sobre los presupuestos de latencia. Slack da a los comandos slash 3000ms de tiempo de reloj para responder. Elido responde en 180-220ms p95 en los POPs de edge de la UE y los EE. UU. porque el manejador del comando slash usa el mismo caché de ruta rápida que el redireccionamiento edge. Si tu equipo está en APAC y ves algo superior a los 350ms, revisa el enrutamiento regional de POPs en /docs/guides/observability.
Alertas de canal impulsadas por disparadores de eventos
La otra mitad de la app de Slack es el enrutamiento de alertas. Eliges un tipo de evento, eliges un canal y recibes una notificación. Los cuatro tipos de evento disponibles hoy:
- broken-link: el destino devolvió 4xx o 5xx la última vez que el escáner de enlaces lo rastreó
- click-threshold: los clics cruzaron un umbral guardado (por defecto: 100 en una ventana rodante de 5 minutos)
- scan-failure: el escáner de URLs marcó el destino como phishing, malware o en una lista de bloqueo pública
- new-conversion: se disparó una conversión rastreada (requiere seguimiento de conversiones)
El payload de alerta que Elido reenvía a Slack usa Block Kit, porque el texto plano en un canal activo se ignora. Así se ve una alerta click-threshold en el cable cuando Elido hace POST a la URL de incoming-webhook de Slack:
{
"text": "click-threshold crossed on go.acme.com/launch",
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": ":chart_with_upwards_trend: Click threshold crossed"
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Link:*\n<https://go.acme.com/launch|go.acme.com/launch>"
},
{ "type": "mrkdwn", "text": "*Window:*\n5m" },
{ "type": "mrkdwn", "text": "*Clicks:*\n412" },
{ "type": "mrkdwn", "text": "*Threshold:*\n100" }
]
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": { "type": "plain_text", "text": "Open dashboard" },
"url": "https://app.elido.app/links/abc123"
}
]
}
]
}
Una alerta scan-failure tiene una apariencia similar pero usa :rotating_light: e incluye la categoría de amenaza del escáner: phishing, malware, spam o blocklist. Una alerta broken-link incluye el código de estado HTTP y la marca de tiempo de la última vez que se vio bien, que es la primera pregunta que hace quien está de guardia.
El enrutamiento es por espacio de trabajo y por evento. Una configuración típica para un equipo de crecimiento de 30 personas:
| Evento | Canal | Emoji | Pings |
|---|---|---|---|
| broken-link | #ops-alerts | :rotating_light: | @oncall |
| click-threshold | #growth | :chart_with_upwards_trend: | (ninguno) |
| scan-failure | #security | :rotating_light: | @sec-oncall |
| new-conversion | #wins | :tada: | (ninguno) |
Configuras esto en el panel de ajustes de la integración de Slack. Cada ruta es una fila en Postgres - sin YAML, sin archivo de configuración JSON, sin redeploy. El mismo motor de enrutamiento impulsa las integraciones de Linear y Pipedrive, por lo que el modelo mental se transfiere si usas ambos.
Si quieres que las alertas lleguen a múltiples destinos, espeja el mismo evento en una suscripción de webhook genérica y enruta el JSON donde más lo necesites. Ese patrón está documentado en automatización de acortador de URLs con Zapier para quienes prefieren el enfoque sin código.
Verificación HMAC y el problema de la reinstalación
Slack firma cada solicitud entrante a tu endpoint de comando slash. La firma es HMAC SHA256 sobre una cadena que Slack construye a partir de la versión, el timestamp y el cuerpo raw de la solicitud. El procedimiento está en la guía de verificación de solicitudes de Slack. El verificador de Elido en Go se ve más o menos así:
func verifySlackSignature(secret, ts, body, sig string) error {
// Reject anything older than 5 minutes to block replays.
age := time.Since(parseTs(ts))
if age > 5*time.Minute || age < -1*time.Minute {
return errReplay
}
base := fmt.Sprintf("v0:%s:%s", ts, body)
mac := hmac.New(sha256.New, []byte(secret))
mac.Write([]byte(base))
expected := "v0=" + hex.EncodeToString(mac.Sum(nil))
if !hmac.Equal([]byte(expected), []byte(sig)) {
return errBadSig
}
return nil
}
Tres cosas salen mal aquí, en orden de frecuencia:
1. El body se parsea antes de firmar. Si tu framework HTTP llama a r.ParseForm() antes de que leas el body raw, el body desaparece y la firma nunca coincidirá. Lee r.Body primero, luego parsea. El manejador de comandos slash de Elido lee el body en un buffer y lo reparsea, lo que cuesta una asignación de memoria y ahorra una semana de depuración.
2. Desfase de reloj en el timestamp. La ventana de replay recomendada por Slack es de 5 minutos. Si el reloj de tu servidor se desvía más que eso (algo habitual en bare-metal sin chrony), cada solicitud firmada parece un replay. Ejecuta chronyc tracking en la máquina y confirma Leap status: Normal.
3. Reinstalación con signing secret rotado. Este es el que te despierta a las 3 de la mañana. Si rotas el signing secret en el panel de la app de Slack (Basic Information > Signing Secret > Regenerate), todas las instalaciones OAuth existentes en todos los espacios de trabajo empiezan a fallar en la verificación de firma de inmediato. El administrador del espacio de trabajo debe reinstalar la app para obtener un nuevo handshake. No hay rotación silenciosa - Slack no propaga el nuevo secreto a las instalaciones existentes.
El radio de explosión depende de tu modelo de distribución. Si tu app de Slack es de un único espacio de trabajo (la app interna de tu empresa), la rotación es una reinstalación de 90 segundos por un solo administrador. Si tu app está en el directorio público de Slack y 4000 espacios de trabajo la tienen instalada, acabas de romperlos todos. Elige las ventanas de rotación en consecuencia y anúncialas en el changelog con al menos 48 horas de antelación.
Un modo de fallo relacionado: instalar la misma app de Slack en un espacio de trabajo diferente usando la misma sesión de navegador. Slack a veces devuelve un token vinculado al equipo equivocado si las cookies son persistentes. La solución es una ventana privada o ?ignore_session=1 en la URL de instalación. El flujo de instalación de Elido en /dashboard/integrations/slack ya pasa ese flag porque nos quemamos en la Beta temprana.
Cuándo el bot de Slack no es la respuesta correcta
Slack es ideal para alertas con intervención humana. Es el destino equivocado para eventos programáticos de alto volumen. Si generas más de ~20 eventos por minuto, Slack limita el endpoint de incoming-webhook a aproximadamente 1 mensaje por segundo por canal y perderás alertas. Enruta esos a una métrica de Datadog o a un consumidor de webhook raw, y solo reenvía a Slack el resumen del cruce de umbral.
El otro caso donde Slack es la opción equivocada: los rastros de auditoría de cumplimiento. Los mensajes de Slack son mutables (puedes editarlos y eliminarlos) y la política de retención la controla el espacio de trabajo. Si tu auditor necesita un registro inmutable de quién acortó qué enlace y cuándo, envía los eventos del comando slash a tu data warehouse mediante la exportación de ClickHouse y trata Slack solo como capa de notificación.
Para equipos de crecimiento que enrutan alertas de clics de campañas, el bot de Slack cubre el 95% de lo que la gente pide en /solutions/marketers. Para equipos de plataforma que usan nuestra API + SDKs, es uno de varios destinos a los que puedes hacer fan-out.
Precios y límites
La integración con Slack está disponible en todos los planes, incluido el gratuito. No hay cargo por mensaje - el límite está en los shortlinks y los clics en sí, que puedes revisar en la página de precios. Cada espacio de trabajo puede configurar hasta 32 reglas de enrutamiento (combinaciones de tipo de evento y canal), más de lo que cualquier equipo con el que he hablado ha llegado a usar.
Las instalaciones de Elido autohospedadas también funcionan. Apuntas la URL de solicitud de la app de Slack a tu propio dominio, estableces el signing secret en el entorno de api-core y el resto es idéntico. Los docs de self-host cubren las variables de entorno; la guía de observabilidad cubre los nombres de las métricas para que puedas graficar la latencia del comando slash y la tasa de éxito en la entrega de alertas en Grafana o Datadog.
Qué hacer a continuación
Si ya usas Elido, abre /dashboard/integrations/slack, haz clic en Conectar, elige un canal predeterminado para cada tipo de evento y empieza. La instalación de verdad tarda 90 segundos. Si estás evaluando, el catálogo de integraciones lista cada conector y en qué tier está disponible, y la comparativa con Bitly muestra cómo se compara la superficie de Slack con los incumbentes (spoiler: Bitly no tiene comando slash).
Si estás construyendo tu propio bot, copia el patrón HMAC de arriba y respeta los 3000ms de tiempo de reloj. La UX de comandos slash de Slack penaliza todo lo que sea lento, y un bot que se siente rápido es la mitad de la razón por la que la gente instala uno.
Preguntas frecuentes
¿Cómo instalo el bot acortador de URLs de Elido para Slack?
Abre /dashboard/integrations/slack en Elido y haz clic en Conectar. Serás redirigido a la pantalla OAuth de Slack, elige el espacio de trabajo, aprueba los scopes (commands, chat:write, incoming-webhook) y estarás de vuelta en Elido en aproximadamente 90 segundos. La instalación escribe una fila de token vinculada por team_id, de modo que cada espacio de trabajo obtiene sus propias credenciales.
¿Funciona /shorten en canales privados y DMs?
Sí. Los comandos slash se ejecutan en el canal donde el usuario los escribe, incluidos los canales privados y los DMs, porque Slack pasa el channel_id en el payload firmado. Elido responde con un mensaje efímero visible solo para quien lo invoca, lo que mantiene el canal tranquilo para acortamientos puntuales.
¿Cómo se firman los payloads de alerta de Slack?
Las alertas salientes de Elido a Slack usan la URL de incoming-webhook de Slack, que es en sí un secreto de tipo bearer vinculado a un canal. Los comandos slash entrantes de Slack a Elido se verifican con HMAC SHA256 sobre el cuerpo raw de la solicitud y el encabezado X-Slack-Request-Timestamp, siguiendo el esquema de signing-secret de Slack.
¿Qué ocurre con el bot de Slack si reinstalo la app OAuth?
Reinstalar genera un nuevo token de bot e invalida el anterior. El signing secret solo rota si lo regeneras en el panel de la app de Slack; en ese caso, todos los espacios de trabajo que usan tu distribución deben reinstalar. Planifica las rotaciones en ventanas de bajo tráfico y anúncialas en #ops.
¿Qué tipos de alerta puedo enrutar a canales de Slack?
Hoy se incluyen cuatro tipos de evento: broken-link (4xx o 5xx detectado en el destino del shortlink), click-threshold (un umbral guardado se superó en una ventana de 5 minutos), scan-failure (el escáner de URLs marcó el destino como phishing o malware) y new-conversion (se disparó una conversión rastreada). Cada alerta puede apuntar a un canal diferente.
Prueba Elido
Pega una URL, obtén un enlace corto
Sin registro. El enlace vive 30 días. Crea una cuenta para conservarlo.
Gratis, sin registro · 2 por día