Setting up pipeline notifications: Slack, Telegram, Email

Build failures surface too late, after the team has already switched to something else. We set up managed pipeline notification delivery: the signal reaches the right person in a convenient channel without unnecessary noise. We handle it end to end — incident response time is reduced several times over.

Our competencies:

Frequently Asked Questions

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1365
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1330
  • B2B Advance company logo design
    B2B Advance company logo design
    776
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1077
  • AIDER company logo development
    AIDER company logo development
    1022
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1113

Why pipeline notifications don't reach the team

The build fails silently: the test step is run in such a way that a non-zero return code is suppressed, the report is taken from cache, and the notification is configured only for a successful outcome.

From the outside, there is a green status and silence, while the defect travels further down the chain and surfaces where troubleshooting costs more. Silent failures are more dangerous than loud ones: they do not create an event that someone will react to.

The second point of loss is noise in the notification channel. When all branches, every intermediate commit, and every automatic recovery go into one chat, pipeline notifications stop being read: the channel is muted, and genuinely important signals disappear along with it.

The value of a message is inversely proportional to their quantity — those on duty are the first to notice this.

The third is routing. A message goes to a shared channel where everyone sees it and no one responds: repository areas are not tied to owners, there is no escalation to the on-call engineer, and a failure on the main branch and in an experiment look the same. This is how lost build notifications appear — formally sent, effectively not received.

Meanwhile, delivery channels live separately: Slack for the team, Telegram for the on-call engineer, email for history — and they diverge on what counts as an event and whom to address it to. Below, we look at how this is closed.

What managed delivery of build signals gives

Managed delivery starts with each signal getting an owner. The build fails at the test stage — the message goes to the service team's channel, not the general feed; a critical failure during deployment — to the on-call engineer personally, bypassing the noise. Notification routing is built by rules: signal source, branch, severity, build stage.

Targeted notifications remove the main reason the on-call engineer stops reading the channel — a stream of identical messages. Duplicates are merged into one thread with a repeat count, outdated signals are closed automatically when the build completes successfully.

Reducing alert noise has a measurable effect: the share of delivered signals approaches almost full, because the message no longer drowns in the feed.

Incident response time is reduced not by motivation, but by the context inside the message: the author of the change, the service, the failed stage, a link to the log.

Moving from a shared channel to routing by service owners cuts the path to the start of investigation severalfold — from tens of minutes to single-digit minutes.

A separate class of failures that used to go unnoticed is eliminated: silent failures of nightly builds, stuck jobs, failures of delivery itself.

That is why we add channel monitoring — if a signal does not reach Slack within the allotted time, it goes via a backup path, and this is also treated as an incident.

Pipeline notifications: comparing delivery channels

Notification channels differ not in message format, but in what happens when it is not read.

A team chat (Slack, Telegram) creates a visible trail and quickly gathers context around an incident; email notifications catch those who are not in the chat, and phone escalation wakes the on-call engineer even if they are asleep. Choosing one channel for all events means either drowning in noise or missing a production failure.

Channel When it fits Limitations
Team chat Daily builds, test environments, incident triage Noise with frequent runs, message gets lost in the stream
Email notifications Release summaries, scheduled reports, audit and trail Delivery delay, weak "here and now" signal
Phone escalation Production failure, missed release window, nighttime outage Requires an on-call schedule and rules, otherwise burnout
Tracker ticket Tasks closed manually No urgency, arrives during working hours

Channels are combined by event criticality, not by convenience. A regular build goes to chat, a report goes to email, and a call is raised only when the previous channels did not produce a reaction within the allotted time.

Such a ladder preserves a trail: you can see who received the notification and at which step they got involved.

Compatibility is handled at the level of routing rules: one pipeline sends different events to different destinations, and the on-call engineer changes the route without editing the pipeline itself.

We test this on a training failure — we shut down the build and see whether the notification traveled through the entire ladder.

How notification implementation works: stages of work

Implementation starts not with connecting a bot, but with understanding which events are worth a message at all.

Otherwise the team gets a stream of noise, gets used to ignoring it, and misses a real failure — and that means hours of downtime that no one later connects to a notification.

  1. Notification audit. We collect all sources: builds, deployments, monitoring, on-call mailing lists. We look at which messages over the past period led to action and which were muted unread.
  2. Route scheme. The output is a table "event → channel → recipient → priority": a build failure goes to the team channel, an environment outage — to the on-call engineer, release summaries — to email.
  3. We also add deduplication of identical triggers, quiet hours for non-priority events, and escalation if the on-call engineer does not respond within the allotted time.
  4. Integration setup. We create bots and accounts with minimal permissions, keep secrets in a vault rather than in build files. The message template is the same: what failed, where to look, who the owner is.
  5. Delivery verification. First test events along each route, then a live test: we deliberately break the build and make sure the notification reached the right person, once, and with a working link to the log.
  6. Handover and maintenance. We provide the on-call regulations, route documentation, and a clear point where rules can be changed. Once a quarter, we review the list of events — new stages in the build pipeline usually add unnecessary noise.

Route templates, configurations, and regulations

Notifications live not in the messenger interface, but in the repository: what is described by code survives a change of on-call engineer and a team move.

If routes are configured manually in personal dashboards, in six months no one will be able to explain why the release branch build writes to one channel and a nightly run failure to another.

Below is the minimum set of artifacts that remains with the team along with a working notification system.

  • Route file: which event goes to which channel — failed build, test failure, successful deploy, environment failure.
  • Message templates: a unified text structure with a link to the build, branch, and change author — investigation starts without a back-and-forth of "what failed?"
  • Grouping and quiet rules: a repeat suppression window, batching of identical failures, quiet mode outside on-call hours.
  • On-call regulations: who receives critical notifications, escalation order, response time, and shift handover.
  • Access policies: who may change routes and mute notifications, channel owners, integration key rotation procedure.
  • Notification documentation: route diagram, event dictionary with importance levels, instructions for "what to do when triggered".
  • Post-change verification: a test event to each channel, delivery confirmation, and a review of whether any dangling routes remain from previous settings.

Case: removed noise and cut response time

The client is a product development team with several dozen services and one shared notification channel.

Builds failed regularly, but signals drowned in the stream: about four hundred messages per day, duplicates on repeated job runs, nighttime filters that muted notifications entirely. The on-call engineer stopped reading the feed and learned about failures from support.

The cause turned out to be not delivery but routing: in Slack, both a build failure on the main environment and a warning from the test environment went as a single stream.

There was no deduplication — a repeated job run generated a new message, and a successful rebuild did not close the previous signal.

At the start: about 60% of notifications delivered, time to first response 35–40 minutes, three failures per quarter were found by users rather than the on-call engineer.

What changed

Notifications were separated by criticality: a blocking build failure goes personally to the on-call engineer with timer-based escalation, degradations — to a group channel, everything else — to a morning digest.

We added deduplication by error fingerprint and auto-closing of the notification on successful rebuild; each signal includes a link to the log, build number, and change author — investigation starts without a back-and-forth of "where to look".

Metric Before After
Share of delivered signals ~60% 99%
Time to first response 35–40 min 4–6 min
Missed failures 3 per quarter 0
Messages per day ~400 40–60

The key effect is build recovery time: the on-call engineer learns about a failure in the first minutes and immediately sees the context, so the path from failure to a green pipeline dropped from ~50 to 12 minutes.

How a build failure notification differs from a monitoring alert

Build signals and monitoring alerts answer different questions: the former — "was the task completed or not"; the latter — "is the system behaving as expected or not." The former are born inside the pipeline and arrive on the fact of an event: a test failed, a check did not pass, an artifact did not build, a migration did not apply.

The latter are formed by observing a running service: latency deviation, growth in error rate, resource exhaustion. Their failure classes are different, and confusing them in one channel means losing the cause.

They intersect at one point — when a build rolls out a change and it breaks production. Then both streams arrive: the build signal reports what exactly changed, the alert reports what became bad. Without correlating these events, the on-call engineer sees the effect and not the cause.

There is also a difference in routes: a failure of a nightly build on a work branch is not a reason to wake someone, while degradation in production is.

That is why build signals and monitoring alerts have different channels, different thresholds, and different authority to wake the on-call engineer.

Technical doubts when configuring notifications

Notifications are configured once, but they are tested at the moment of failure — and that is exactly when it turns out that the channel is disabled and the on-call engineer receives a hundred identical lines instead of one.

We have collected the questions that most often come up when handing over configuration to the team and during the first real incidents.

How do you avoid a message avalanche during a mass build failure?

Events are grouped by key: branch, stage, error type. The first failure goes to the channel immediately; the rest are collapsed into it with a counter during the suppression window — instead of fifty lines, one arrives, with the number of affected builds.

Priorities are separated as well: a failure on the main branch goes to the on-call engineer, a failure on a personal branch — only to the change author.

What happens if the channel is unavailable or has been disabled?

The message is not lost: it is stored in a queue until delivery is confirmed, and if sending fails, it goes via a backup route — to email instead of the messenger.

If the channel is disabled on the recipient's side, the availability check triggers, and the responsible person learns that notifications are not getting through before an incident occurs, not after.

How does escalation work if the on-call engineer does not respond?

A critical notification requires acknowledgment. Until it is acknowledged, after a set interval a repeat goes to the next person in the chain — from the on-call engineer to the department manager.

Notification escalation is configured as a cascade, so a nighttime failure does not wait until morning.

Is notification history stored?

Yes, linked to the build and stage: you can see who received the notification, when they acknowledged it, and what caused the failure. This also provides material for tuning — the history shows which notifications are duplicated and which thresholds should be raised.

Let's discuss the task and come back with an implementation plan

To make the implementation plan rely on facts rather than guesses, we start by reviewing the current scheme: which events generate notifications at all, where they go now, and who reads them.

In practice, it turns out that some messages are noise from unstable checks, while critical failures are lost in the general stream.

Then we fix the scope of work and the order of steps — the plan includes:

  • inventory of event sources: build, tests, deployment, availability monitoring, infrastructure checks;
  • recipient map: team, on-call engineer, department manager, external channels;
  • routing rules by criticality — separate streams for a failed build, service degradation, and informational events;
  • delivery scheme to Slack, Telegram, and email with responsibility assigned for each channel;
  • duplicate protection: grouping of identical events and suppression of repeats from multiple sources;
  • escalation — if the on-call engineer does not respond within the allotted time, the notification goes to the next person;
  • message templates: what exactly the engineer sees, which link leads to the logs, and how to quickly understand the cause;
  • test environment verification: we simulate a failure and confirm that the notification reached the right person in the right channel.

Describe the task: which systems are already connected, which channels you use, and what is annoying about the current notifications. We will come back with an estimate and an implementation plan containing the scope of work, the order of steps, and control points at each stage.