---
title: "Alertas de Sentry por llamada para errores críticos"
description: "Sentry no tiene acción de llamada. Enruta sus alertas por webhook para que solo los errores que rompen producción hagan sonar tu teléfono."
date: 2026-09-25
author: Nooc
authorAvatarLink: /images/avatars/nooc.webp
authorLink: https://nooc.me
tags:
  - Sentry
  - monitorización de errores
  - alertas por llamada
  - webhooks
  - fatiga de alertas
  - guardia
---

# Alertas de Sentry por llamada: que suene solo cuando producción se rompe

Sentry no puede llamarte por teléfono. Puede enviarte un correo, publicar en Slack o pasarle la alerta a PagerDuty, pero no existe una acción de voz integrada. La forma de conseguirla sin comprar una plataforma de incidentes es enviar la alerta de Sentry a un webhook que suene: crea una integración interna, apúntala a un canal de llamada de Echobell y pon un filtro delante para que solo pasen los errores que realmente rompen producción.

Esta guía cubre el camino completo: la integración, la regla de alerta, la carga útil que Sentry envía de verdad, las plantillas que la leen y las dos trampas que hacen que la gente abandone.

## Por qué Sentry no puede hacer sonar tu teléfono

Las acciones de las alertas de incidencias de Sentry cubren notificaciones (correo, Slack, Discord, Microsoft Teams), creación de tickets (Jira, GitHub, Azure DevOps) y traspaso a un producto de guardia (PagerDuty, Opsgenie). Todas terminan en una pantalla que tienes que estar mirando, o en un asiento de pago en otra plataforma.

A las 14:00 eso está bien. A las 03:00, un mensaje de Slack es indistinguible del silencio y una notificación push pierde contra el modo No molestar. Para ese pequeño conjunto de errores en los que dos horas de retraso cuestan dinero real —el checkout devolviendo 500, el login rechazando a todo el mundo, un worker descartando trabajos en silencio— quieres un dispositivo que suene.

El webhook es la costura. Sentry puede llamar a un endpoint HTTPS arbitrario como acción de una regla de alerta; [Echobell](https://apps.apple.com/app/apple-store/id6743597198?pt=128151925&ct=blog-sentry-phone-call-alerts-es&mt=8) convierte esa petición HTTP en una alerta tipo llamada que atraviesa el modo Concentración de iOS.

## Qué necesitas

- Una organización de Sentry donde puedas entrar en **Settings → Developer Settings** (owner o manager)
- Echobell instalado ([App Store](https://apps.apple.com/app/apple-store/id6743597198?pt=128151925&ct=blog-sentry-phone-call-alerts-es&mt=8) / [Google Play](https://play.google.com/store/apps/details?id=one.echobell.echobellandroid))
- Cinco minutos

Nada tiene que ser accesible desde internet de tu lado. Sentry hace la petición saliente; tú solo la recibes.

## Paso 1 — Crea un canal que suene

En Echobell, crea un canal y pon su tipo de notificación en **Llamada**. Ese es todo el sentido del ejercicio: un canal de llamada se comporta como una llamada entrante en lugar de como un push, así que atraviesa el modo Concentración y No molestar.

Dale plantillas que tengan sentido a las 3 de la mañana. La carga útil de Sentry está muy anidada, así que las rutas de las variables son más largas de lo habitual:

```
Título: {{data.event.level}}: {{data.event.metadata.type}}
Cuerpo: {{data.event.title}} — {{data.event.culprit}}
```

Configura la **plantilla de enlace** en los ajustes avanzados para que tocar la notificación abra la incidencia:

```
{{data.event.web_url}}
```

Copia la URL del webhook desde la vista de detalle del canal. Tiene esta forma:

```
https://hook.echobell.one/t/<channel-token>
```

## Paso 2 — Crea una integración interna en Sentry

Sentry solo ofrece un webhook como acción de regla de alerta a través de una *integración*, así que tienes que crear una. Es un formulario, no un servicio: no vas a escribir código.

1. Ve a **Settings → Developer Settings → Custom Integrations**
2. **Create New Integration → Internal Integration**
3. **Name**: `Echobell` (esta es la etiqueta que elegirás en la regla)
4. **Webhook URL**: la URL de tu canal del paso 1
5. **Activa** el interruptor **Alert Rule Action**
6. **Permissions**: `Issue & Event` → **Read** es suficiente
7. En **Webhooks**, deja **todas** las casillas **sin marcar** — ver la trampa más abajo
8. Guarda

Una integración interna está limitada a tu organización y se instala sola. Nunca necesitarás el token que genera para este montaje.

## Paso 3 — Añade la integración como acción de la regla

Ve a **Alerts → Create Alert → Issue Alert**, o edita una regla existente.

En **Then perform these actions**, añade **Send a notification via an integration** y elige **Echobell**.

Pon el **Action interval** —el limitador de "si esta alerta se ha disparado más de una vez"— en al menos `30 minutes`. El valor por defecto envía en cada disparo, y un error que salta 400 veces por minuto marcará tu número hasta que lo desactives.

Guarda y lanza la prueba de la regla para ver llegar una carga real antes de confiar en ella.

## Paso 4 — Entiende lo que llega de verdad

Aquí es donde se rompen la mayoría de los montajes, porque la carga no tiene la forma que imaginas. Sentry lo envuelve todo:

```json
{
  "action": "triggered",
  "actor": { "id": "sentry", "name": "Sentry", "type": "application" },
  "data": {
    "event": {
      "event_id": "e4874d664c3540c1a32eab185f12c5ab",
      "level": "error",
      "title": "ReferenceError: heck is not defined",
      "culprit": "?(<anonymous>)",
      "platform": "javascript",
      "project": 1,
      "release": null,
      "metadata": { "type": "ReferenceError", "value": "heck is not defined" },
      "tags": [["level", "error"], ["browser", "Chrome 75.0.3770"]],
      "issue_id": "1117540176",
      "issue_url": "https://sentry.io/api/0/issues/1117540176/",
      "web_url": "https://sentry.io/organizations/test-org/issues/1117540176/events/e4874.../"
    },
    "triggered_rule": "Very Important Alert!"
  },
  "installation": { "uuid": "a8e5d2..." }
}
```

Cuatro cosas que conviene saber antes de escribir una sola plantilla:

- **Todo lo útil está bajo `data.event`.** `{{title}}` no renderiza nada; `{{data.event.title}}` renderiza el error.
- **`data.event.project` es un ID numérico, no un slug.** Si quieres un nombre de proyecto legible en la notificación, escríbelo como texto literal en la plantilla del título y usa un canal por proyecto.
- **No hay campo `environment`.** El entorno llega dentro de `data.event.tags` como un par `["environment", "production"]`, y su posición en ese array no es estable, así que no accedas por índice. Filtra por entorno en la regla de Sentry (paso 5).
- **`data.triggered_rule`** es la etiqueta de la regla. Útil en el cuerpo cuando un canal sirve a varias reglas.

La cabecera `Sentry-Hook-Resource` vale `event_alert` para las alertas de incidencias. Puedes exigirla en una condición del canal para que nada más pueda hacerlo sonar:

```
header["sentry-hook-resource"] == "event_alert"
```

## Paso 5 — Filtra hasta lo que merece una llamada

Un canal de llamada que suena con cada incidencia nueva es peor que no tener canal: en una semana lo habrás silenciado, y entonces no sonará para la que importaba. Filtra en dos sitios.

**En Sentry**, con las condiciones y filtros de la regla:

| Objetivo | Configuración de la regla |
| --- | --- |
| Solo producción | Pon el **Environment** de la regla en `production` |
| Solo roturas reales | Filtro: `The event's level equals fatal` (o `error`) |
| Nada de picos puntuales | Condición: `The issue is seen more than 25 times in 1 hour` |
| Solo una ruta crítica | Filtro: `The event's tags match transaction contains /checkout` |
| Solo regresiones | Condición: `A resolved issue changes state from resolved to unresolved` |

**En Echobell**, usa una condición de canal como red de seguridad para lo que Sentry no puede expresar, o para cambios que hoy no puedes desplegar:

```
data.event.level == "fatal" || data.event.level == "error"
```

Filtrar por severidad en la regla de Sentry suele ser mejor, porque ahí también vive la limitación de frecuencia. Hacerlo en Echobell es mejor cuando quieres dos niveles de urgencia a partir de una sola regla.

## Paso 6 — Dale a los avisos una puerta más silenciosa

El sentido de los niveles es que la llamada conserve su significado. Crea un segundo canal de Echobell con el tipo **Urgente (Time Sensitive)**, añade una segunda regla de Sentry con un listón más bajo y apúntala a una segunda integración interna (una integración guarda una sola URL de webhook, así que un segundo canal necesita una segunda integración).

Un montaje que sobrevive a una semana real se parece a esto:

| Regla de Sentry | Nivel / umbral | Canal de Echobell | Comportamiento |
| --- | --- | --- | --- |
| `prod-fatal` | `fatal`, producción | Llamada | Suena atravesando Concentración |
| `prod-error-spike` | `error`, más de 100 en 1 h | Urgente | Llega a la pantalla bloqueada, sin sonar |
| `new-issue-digest` | cualquier incidencia nueva | Normal | Push corriente, se lee cuando toque |

## Que suene solo fuera del horario laboral

Durante el día ya estás mirando Sentry. Echobell expone variables de tiempo del sistema en UTC a las condiciones, así que un canal puede comportarse distinto según la hora sin necesidad de una segunda regla:

```
data.event.level == "fatal" && (hour >= 17 || hour < 9)
```

Añade una comprobación de día si tu fin de semana es de verdad libre:

```
data.event.level == "fatal" && (hour >= 17 || hour < 9 || dayOfWeek == 0 || dayOfWeek == 6)
```

Todo esto es UTC, así que convierte desde tu zona horaria antes de fijar los números. La [referencia de condiciones](/es/docs/conditions) tiene la lista completa de variables.

## Las dos trampas

**Trampa 1: marcar las casillas de Webhooks.** Una integración interna tiene dos rutas de webhook independientes. El interruptor **Alert Rule Action** hace que la integración sea seleccionable en las reglas: esa es la que quieres. Las casillas de **Webhooks** (`issue`, `error`, `comment`) te suscriben a *todos* los eventos de ese recurso: cada incidencia creada, resuelta, asignada, archivada o ignorada en toda la organización. Marca `issue` y tu teléfono sonará cuando un compañero resuelva algo. Déjalas todas sin marcar y solo tus reglas dispararán el webhook.

**Trampa 2: usar el plugin antiguo de Webhooks.** El viejo plugin por proyecto **Legacy Integrations → WebHooks** sigue existiendo y funcionando, y parece un atajo porque puedes pegar una URL sin crear una integración. Su carga tiene una forma distinta y más plana, sus peticiones no van firmadas y el propio Sentry desvía los montajes nuevos hacia otro lado. Si lo usas, tus plantillas necesitarán rutas de variables diferentes a las de arriba. Usa la integración interna.

## Tamaño de la carga, tormentas y truncado

Tres límites que conviene conocer antes de que algo falle a escala:

- **1 MiB de cuerpo.** Echobell rechaza con HTTP 413 los cuerpos de más de 1 MiB. Una carga de Sentry lleva la traza completa y el contexto de la petición, lo que normalmente son decenas de kilobytes, pero un evento con un cuerpo de petición grande puede acercarse. Sentry no tiene un parámetro `max_alerts`, así que la mitigación es limpiar los cuerpos grandes en el `beforeSend` de tu SDK, algo que ya quieres hacer por privacidad.
- **120 peticiones por minuto y token.** Por encima, el disparador responde `429` con `RATE_LIMIT_EXCEEDED` y un `Retry-After`. El action interval de Sentry es lo que te mantiene por debajo; `30 minutes` sobra.
- **1500 bytes de cuerpo de notificación.** Lo más largo se trunca antes de llegar al dispositivo. `data.event.title` más `culprit` cabe de sobra; volcar `data.event.exception` no, y además es ilegible en una pantalla bloqueada. Deja el detalle detrás de la plantilla de enlace.

## Compartir con el equipo

Varias personas pueden suscribirse a un canal de Echobell, y cada suscriptor elige su propio tipo de notificación. La misma regla de Sentry puede así hacer sonar el teléfono de quien está de guardia y llegar como push normal a los demás, sin precio por asiento ni configuración de rotación.

Lo que no es es una política de escalado. No existe el "si nadie confirma en cinco minutos, llama al siguiente". Si necesitas eso, necesitas una plataforma de guardia de verdad; Echobell cubre la capa de entrega que hay debajo.

## Lo que este montaje no te da

Mejor decirlo claro:

- **Sin confirmación.** Responder la llamada no le dice nada a Sentry ni detiene los teléfonos de los demás suscriptores.
- **Sin rotación ni escalado.** O lo reciben todos los suscritos, o nadie.
- **Sin más deduplicación que la de Sentry.** El agrupado y la limitación ocurren en la regla; Echobell entrega lo que llega.
- **Sin sincronización bidireccional.** Resolver la incidencia en Sentry no borra nada en tu teléfono.

Si eso es inaceptable, esta no es la herramienta. Si lo que realmente necesitas es "despiértame cuando se rompa el checkout", es probablemente la forma fiable más barata de conseguirlo.

## Resolución de problemas

**La regla se dispara pero no llega nada.** Comprueba que **Alert Rule Action** está activado en la integración. Si está apagado, la integración ni siquiera aparece en la lista de acciones, y una regla guardada antes de activarlo conserva la acción obsoleta.

**Llega una notificación pero está vacía.** Tu plantilla está leyendo claves de primer nivel. Sentry lo anida todo bajo `data.event`.

**Suena por cosas que no esperabas.** Revisa las casillas de Webhooks de la integración (trampa 1) y luego si el entorno de la regla se quedó en "All Environments".

**Suena repetidamente por un mismo error.** Sube el action interval de la regla. El reintento de Echobell es otra cosa: **Reintentar llamada fallida** en los ajustes vuelve a marcar una llamada que perdiste.

**No llega nunca nada, ni la prueba.** Dispara el canal con `curl` primero para descartar el lado de Echobell:

```bash
curl -X POST https://hook.echobell.one/t/<channel-token> \
  -H 'Content-Type: application/json' \
  -d '{"data":{"event":{"level":"fatal","title":"Test error","culprit":"manual test","metadata":{"type":"TestError"}}}}'
```

Si eso suena y Sentry no, el problema está en la integración, no en el canal.

## Preguntas frecuentes

### ¿Puede Sentry hacer una llamada de forma nativa?

No. Las acciones de alerta de Sentry son notificaciones, creación de tickets e integraciones con productos de guardia. Una llamada de voz requiere un servicio externo: o una plataforma como PagerDuty, o un receptor de webhook que suene, como Echobell.

### ¿Una alerta de Sentry atraviesa No molestar?

Solo si llega como alerta tipo llamada. Un canal de Echobell de tipo llamada se comporta como una llamada entrante, y eso lo permiten el modo Concentración y No molestar de iOS. Un push normal de cualquier app, no.

### ¿Necesito un plan de pago de Sentry para los webhooks?

Las integraciones internas y las acciones de regla están disponibles desde el plan Developer de Sentry en adelante. El webhook en sí no cuesta nada extra.

### ¿Por qué mi variable de plantilla está vacía?

Casi siempre porque la ruta es demasiado corta. La carga de alerta anida el evento bajo `data.event`, así que es `{{data.event.title}}`, no `{{title}}`. Dispara el canal una vez y revisa el cuerpo de la petición registrado en la app para ver la forma exacta que recibiste.

### ¿Cómo alerto de un solo entorno?

Configura el campo **Environment** en la regla de alerta de Sentry. No intentes leerlo de `data.event.tags`: es un array de pares `[clave, valor]` cuyo orden no está garantizado.

### ¿Pueden llamar a dos personas por el mismo error?

Sí. Comparte el canal y que cada persona se suscriba con el tipo de notificación que prefiera. Como no hay confirmación, todos los que eligieron "llamada" reciben la llamada.

### ¿Filtro en Sentry o en Echobell?

En Sentry cuando puedas: la regla es también donde viven la limitación de frecuencia y el entorno. En Echobell cuando quieras dos niveles de urgencia a partir de una regla, cuando necesites una ventana horaria o cuando no puedas cambiar la regla hoy.

## Cierre

El montaje son cuatro cosas: un canal de llamada, una integración interna con **Alert Rule Action** activado y las casillas de Webhooks sin marcar, una regla de alerta lo bastante estrecha como para merecer una llamada, y plantillas que leen `data.event`. Todo lo demás en esta página trata de mantenerla lo bastante estrecha como para que dentro de un mes el timbre siga significando algo.

[Descarga Echobell para iPhone](https://apps.apple.com/app/apple-store/id6743597198?pt=128151925&ct=blog-sentry-phone-call-alerts-es&mt=8) o [consíguelo en Google Play](https://play.google.com/store/apps/details?id=one.echobell.echobellandroid), y lanza el `curl` de arriba antes de confiarle nada importante a esta ruta.

## Artículos relacionados

- [Referencia de condiciones de canal](/es/docs/conditions)
- [Guía de integración con webhooks](/es/docs/webhook)
- [Guía para desarrolladores sobre la fatiga de alertas](/es/blog/fix-alert-fatigue-developer-guide)
- [Alertas por llamada con Prometheus Alertmanager](/es/blog/alertmanager-phone-call-alerts)
- [Saltarse el modo Concentración de iOS en alertas críticas](/es/blog/how-to-bypass-ios-focus-mode-for-critical-alerts)
