Notifications
Where an alert goes when it fires — a Slack channel, a webhook, or both — how to write the message, and exactly when Trodo sends it.
An alert can post to a Slack channel, POST to a webhook, or both. Pick under Send to on the alert form.
When Trodo sends
Only on the crossing — the evaluation where the alert goes from healthy to breaching.
Crosses
The value breaches your threshold for the first time. One notification is sent.
Stays breached
Every minute after, the value is still over the line. Nothing more is sent. The alert shows as Alerting in the product.
Recovers, then crosses again
Back under the threshold: it returns to OK silently. The next breach is a new crossing and notifies again.
So an incident lasting an hour is one message. There is no "recovered" notification.
Slack
Choose a channel from your team's connected Slack workspace. If the picker is empty, connect Slack in your integration settings first — the connection is per Trodo team, and one Slack workspace connects to one team.
Trodo posts as the app into the channel you chose. Private channels work if the app has been invited to them.
Webhooks
Give any HTTPS URL and Trodo POSTs JSON when the alert fires, with a 10-second timeout.
{
"alert": {
"id": "6d1f…",
"name": "Checkout p95 latency",
"scope": "span",
"measure": "duration",
"aggregation": "p95"
},
"value": 8412.5,
"threshold": 8000,
"operator": "above",
"window_seconds": 900,
"sample_size": 214,
"text": "Checkout p95 latency\nDuration p95: 8.4 s (> 8 s) over the last 15 min · 214 spans\nhttps://app.trodo.ai/…",
"link": "https://app.trodo.ai/…",
"fired_at": "2026-09-09T14:32:07.184Z"
}sample_size is how many rows produced the value — worth reading, because a p95 over 6 rows and a p95 over 6,000 deserve different reactions. text is the same rendered message that goes to Slack, so a simple receiver can forward it as-is.
Any 2xx response counts as delivered. Anything else is recorded as a failed delivery and surfaced in the product; Trodo does not retry.
The message
Leave the message blank and Trodo composes a default:
Checkout p95 latency Duration p95: 8.4 s (> 8 s) over the last 15 min · 214 spans https://app.trodo.ai/…
Write your own to control it. Click a variable below the box to drop it in at the cursor.
| Variable | Becomes |
|---|---|
{{name}} | The alert's name |
{{measure}} | The measure and aggregation, e.g. Duration p95 |
{{value}} | The value that fired, formatted in its units — 8.4 s |
{{operator}} | The comparison symbol — >, ≥, <, ≤ |
{{threshold}} | Your threshold, formatted — 8 s |
{{window}} | The window — 15 min |
{{count}} | How many rows produced the value |
{{scope}} | run or span |
{{link}} | A link into Trodo, scoped to the window that fired |
Slack's *bold* and _italic_ work in the message.
Example
🚨 *{{name}}*
{{measure}} hit {{value}} (limit {{threshold}}) across {{count}} {{scope}}s in {{window}}.
<{{link}}|Open in Trodo>Where the link goes
{{link}} — and the link in the default message — opens Traces or Runs already filtered to the window that fired, so you land on the rows that caused it rather than on today's traffic.
The link always points at app.trodo.ai, whoever receives it. A notification is read somewhere else — Slack, a phone, another service — so a link only helps if it resolves for the person reading it.
When delivery fails
If Slack rejects the message or the webhook doesn't answer, the alert still records that it fired — it just marks the delivery as failed, and the row shows a Not delivered badge in the list.
Check for that badge after changing a Slack channel or rotating a webhook URL. An alert whose channel was archived looks exactly like a healthy alert otherwise, which is the worst way for an alerting tool to fail.
Next
Filters
Filter an alert to a slice of your traffic — one agent, one tool, one model, one customer — with rules on run and span fields, metadata and attributes.
Monitoring alerts
Read the alerts list, the value-over-time chart with its breach band, how often an alert has triggered, and the full history of every fire.