Static Documentation

Teams, Rotations, Layers and Routes

Version latest · Updated 2026-05-29
Interactive docs View on GitHub

Teams, Rotations, Layers and Routes#

IncidentRelay routes alerts through teams, rotations, layers and notification channels.

Incoming alert
  -> Route
  -> Service
  -> Team
  -> Rotation / Escalation policy
  -> Final schedule
  -> On-call user
  -> Channels

Team#

A team is an on-call ownership unit inside a group.

Example:

Group: Production
Team: Infrastructure
Team slug: infra

The team slug is commonly used in alert labels, for example with Alertmanager:

team: infra

Teams define ownership and escalation behavior. Users must be active team members before they can be added to rotation layers.

Service#

A service is a logical affected system owned by a team.

Example:

Team: Infrastructure
Service: RabbitMQ Cloud
Service slug: rabbitmq-cloud
Type: queue
Environment: production
Criticality: critical

Services help group alerts by the system that is broken, not only by the route that received the alert.

A service can have:

links to dashboards, logs, traces and repositories; runbooks; dependencies; status and impact analytics; optional default rotation or escalation policy.

Rotation#

A rotation is the route-facing schedule object. Routes point to rotations, and rotations produce the final on-call user.

A rotation belongs to one team and can contain one or more layers.

Example:

Team: infra
Rotation: infra-primary
Timezone: Europe/Berlin
Reminder interval: 300 seconds

When a rotation is created, IncidentRelay creates a default layer. If Add all active team members to this rotation is enabled, active team members are added to that default layer in order.

Layer#

A layer is a schedule rule inside a rotation.

Each layer has:

  • name;
  • priority;
  • enabled flag;
  • start time;
  • rotation type;
  • handoff time;
  • optional weekly handoff day;
  • timezone;
  • ordered members;
  • optional active time restrictions.

A rotation may have multiple layers. This is useful for different coverage patterns, for example:

Layer: Business hours
Members: Ivan -> Petr -> Anna
Active: Monday-Friday 09:00-18:00

Layer: Nights
Members: Petr -> Anna -> Ivan
Active: Monday-Friday 18:00-09:00

Layer: Weekend
Members: Anna -> Ivan -> Petr
Active: Saturday-Sunday 00:00-00:00

Layer priority#

When more than one layer is active at the same time, the layer with the higher priority wins.

priority 10: Business hours
priority 20: Nights
priority 30: Weekend

A higher priority layer overrides a lower priority layer for overlapping time windows.

Layer restrictions#

Restrictions define when a layer is active.

If a layer has no restrictions, it is active 24/7.

Restriction examples:

Monday-Friday 09:00-18:00
Monday-Friday 18:00-09:00
Saturday-Sunday 00:00-00:00

00:00-00:00 means the whole day.

Times are interpreted in the layer timezone. Store absolute timestamps in UTC, but define recurring weekly/daily restrictions in local layer time.

Final schedule#

The final schedule is the effective schedule used by the calendar and alert routing.

Order of precedence:

rotation override > highest-priority active layer > no assignee

If no layer is active, IncidentRelay returns no scheduled on-call user for that rotation. Routing and escalation logic can then decide how to handle the alert.

Overrides#

An override temporarily replaces the final scheduled user for a rotation.

Overrides apply on top of all layers.

Example:

Rotation: infra-primary
Override: Anna replaces current on-call user
Window: 2026-05-25 12:00 -> 2026-05-26 12:00

Route#

A route can have a default service. This is useful when all alerts entering the route belong to the same logical system.

If one route receives alerts for multiple systems, configure service match rules. A service match rule can use alert labels, annotations or payload fields to attach the alert to the right service.

Example:

Source: alertmanager
Team: infra
Rotation: infra-primary
Channels: infra-mattermost, infra-voice-critical
Matchers: {"labels": {"team": "infra"}}

A route may exist without a rotation. This can happen if a rotation is deleted. The route remains, but rotation_id is cleared. In that state, the route still exists as configuration, but it does not assign a scheduled on-call user from that rotation.

Multiple routes for one team#

One team can have multiple independent intake routes:

infra-alertmanager -> source alertmanager -> Alertmanager token
infra-webhook      -> source webhook      -> Generic webhook token
infra-zabbix       -> source zabbix       -> Zabbix token

Routes can point to the same team, rotation and channels, or they can use different rotations and channels.

Multiple rotations for one team#

One team can have multiple rotations.

Example:

Team: Cloud
Rotation: Cloud primary
Rotation: Cloud secondary
Rotation: Cloud weekend

In the calendar UI, a rotation is treated as a separate calendar. This prevents multiple rotations for the same team from being mixed into one schedule.