DevOps · On-Call

What a Page Must Carry to Be Actionable

The fields a notification needs so a responder can decide whether to act, where to look first, and who else is affected, within the length limits of a phone screen.

A page arrives in the worst possible conditions for reading: a phone screen, an interrupted sleep cycle, and no access to a terminal. The payload has a few seconds to answer questions that the monitoring system already knows the answers to. When it does not, the responder’s first action is to reconstruct context that could have been sent for free, and those minutes are charged directly against the time to mitigation.

The decisions a payload has to support

There are four, and they are sequential. The first is whether the page is real and belongs to the recipient. A notification that does not name the owning service forces a search through the routing configuration at the worst moment. The second is how urgent it is, which is a question about scope and rate rather than about the metric’s absolute value. The third is what to do first, which is a pointer to a procedure rather than the procedure itself. The fourth is who else needs to know, which determines whether the responder starts alone or opens a channel.

A payload that supports all four is a page. A payload that supports none is a log line with a ringtone. Most of the design work is deciding which facts serve which decision, because the payload has a hard length budget and every field competes with every other field for the first line.

What belongs in the first line

The first line survives truncation on every transport, so it has to carry the two facts that determine the response: what is broken, in user-visible terms, and how widely. “Checkout failures above 10% in eu-west” does both. “HighErrorRate” does neither, because the alert’s internal name describes a rule, not a condition, and the reader cannot tell whether the failure is total or marginal.

The symptom phrasing is not cosmetic. A page that says “database replication lag 45s” leaves the responder to infer whether anyone is affected; a page that says “orders delayed by more than a minute, all regions” states the consequence and lets the lag figure follow as supporting detail. Cause-based titles are attractive because the cause is what the rule measures, but the cause is frequently wrong, and a wrong cause in the title sends the first responder down the wrong path before any evidence has been seen.

Scope is the second half of the first line because it determines both severity and ownership. The same error rate is a different incident at one percent of traffic in one region and at forty percent globally. Scope labels that already exist in the alert’s identity, such as service, region, and tenant, should be rendered rather than hidden behind a count.

Fields that earn their space

Beyond the first line, a working payload carries a small set of facts:

  • The current value and the threshold, with units, so the reader can judge trajectory without opening a dashboard.
  • The start time, in both the reader’s local time and UTC, because “firing for 12 minutes” and “firing since 02:14” answer different questions and the local time reveals whether the responder was already awake.
  • A runbook link that lands on the section for this alert, not on a wiki home page.
  • A dashboard link scoped to the affected service and region, with the time range already set.
  • The incident channel or bridge, so coordination does not start with a search.
  • The alert’s identity, in a form that can be pasted into a query or a ticket.
  • The owning team and the escalation path, for the case where the recipient is not the right person.

Everything else is optional, and most of it is a liability. A payload that lists every label on the alert, or every instance that matched, buries the two links that matter. The page is a pointer, and a pointer with fifty lines of context is a document that has to be read.

{
  "status": "firing",
  "title": "Checkout failures above 10% in eu-west",
  "severity": "critical",
  "value": "14.2% (threshold 10%)",
  "started": "2026-03-29T02:14:07Z",
  "runbook": "https://runbooks.example/checkout/error-rate#eu-west",
  "dashboard": "https://dashboards.example/checkout?region=eu-west&range=1h",
  "channel": "#inc-checkout",
  "fingerprint": "5f2c1a9e"
}

The shape is less important than the ordering. When the transport truncates, the title, severity, and value should survive; when a human reads the whole thing, the links should be one tap away.

Length limits are part of the design

The short message service is the most constrained transport still in use for paging. A single message carries 160 characters in the GSM 7-bit alphabet, or 70 characters when the text requires UCS-2 encoding, which includes most non-Latin scripts and any message containing characters outside the GSM set. Longer messages are concatenated, and each segment then carries less payload because of the user-data header: 153 characters for 7-bit and 67 for UCS-2.

Those numbers set a floor for what must be in the first line, but they also create a subtler failure. A message that mixes a Latin-script title with a single character from another script switches the entire message to UCS-2, cutting the capacity by more than half. Notification systems that assemble a title, a value, and a link without tracking the encoding will silently truncate in exactly the cases where the message was already tight.

Push notifications have their own truncation, usually at the level of the notification shade, and the collapsed view shows far less than the expanded one. The practical rule is the same for every transport: the first line must be self-sufficient, and the link that the responder needs most should appear before any link that is merely useful.

Failure modes of the payload

The most common is a link that does not work from where the page is read. A dashboard behind a corporate VPN is unreachable from a phone at home, so the link is decoration. Runbook links that resolve to a page requiring authentication the responder has not yet performed have the same problem. Links should be tested from the device class that will receive them, not from a workstation.

The second is unit drift. The alert threshold is expressed in one unit and the payload renders another, so the reader compares a ratio against a count. This is usually a template that formats every value as a percentage, regardless of the metric. It is a small bug that produces large misreadings, and it is invisible until someone is awake enough to notice.

The third is stale scope. An alert that aggregates by service but is routed to a team that owns only one region will page the wrong team whenever the failure is elsewhere. Scope in the payload does not fix routing, but it lets the recipient redirect quickly instead of beginning an investigation that belongs to someone else.

The fourth is the missing next step. A payload with a title and a value but no runbook and no channel leaves the responder to reconstruct the procedure from memory at the moment when memory is least reliable. The runbook is the part of the payload that converts a notification into a response; its structure is a separate problem, treated in the anatomy of a runbook step.

Finally, the payload should not invite action that the incident does not require. A one-tap acknowledge in the notification is convenient and, in the presence of escalation timers, becomes the snooze button described in escalation policies as state machines. If the transport offers it, the acknowledgement should be distinguishable from silencing, and the distinction should be visible on the lock screen.

Severity is a payload field, not a title decoration

The severity rendered in a page is the output of a classification that also determines the channel, the responder set, and the communication cadence. If the payload shows a severity that the routing did not use, the two disagree and the reader cannot tell which one is authoritative. The definition of those levels, and how they map to channels, is covered in severity classification as a routing input; the payload’s job is simply to render the same level that the router acted on.

The same principle applies to the grouping. A notification that represents a group of alerts should say so in the first line, because a responder who believes there is one failing check behaves differently from one who knows there are nine. How alerts are collapsed into a group, and how inhibition removes the ones that are consequences, is described in alert fingerprints and grouping.

References

  1. Site Reliability Engineering, Chapter 11: Being On-Call — Google
  2. 3GPP TS 23.040: Technical realization of the Short Message Service — 3GPP
  3. Alertmanager — Prometheus project