Skip to content
13 min read Rider Experience Design

How to Write Transit Alerts Riders Can Actually Use

Transit alerts often fail because they are written from the control room's perspective rather than the rider's. Discover how operations and customer experience teams can build practical decision trees, style guides, and templates to turn confusing jargon into clear, actionable guidance.

How to Write Transit Alerts Riders Can Actually Use

A Practical Guide for Operations and Customer Experience (CX) Teams

When a rider looks at a service alert, they have one question: Should I change my trip?

Transit agencies often frame alerts around operational events, such as a late bus, an unavailable vehicle, a service gap, a detour, or a closed station. But inconsistent terminology, mismatches between alert language and structured service data, and the overuse of alerts make it difficult for riders to understand what’s happening and what it means for their trip. Without a consistent, rider-centered strategy for communicating service changes, alerts can create confusion instead of clarity or become background noise.

The goal of an alert isn’t to share everything the control center knows, it is to give riders the information they need to decide whether to wait, walk, or change their journey.

This guide applies to both planned and unplanned disruptions. Inside an agency, those are often handled by different teams on different timelines. But riders don’t experience that distinction. A disruption shows up in the same app, the same push notification, and the same digital sign either way, and riders need the same answers. What follows are the practices we suggest for making those answers consistent, whoever is writing them and however much notice they had.

If You Only Do One Thing This Week...

If you are leading an operations or customer experience team, you do not need to overhaul your entire alert software ecosystem overnight to make an immediate impact. Start with these three quick actions:

  1. Audit your top five most-used alert headers. Pull your logs from last month. Check if your most common alerts lead with the route and effect, and whether they would survive a mobile push-notification cutoff.
  2. Ban internal jargon on public channels. Replace words like bustitution, single-tracking, or diversion with plain-language equivalents (shuttle buses, slower trains, detour) across your team's templates.
  3. Commit to clock times. Replace vague durations ("for 45 minutes") with explicit estimates or next-update commitments ("until about 6:00 PM" or "next update by 4:15 PM").

Once your team masters these three habits, you can build out the full decision trees, style guide, and playbook detailed below.

Operations vs. Rider Comparison

Most alert problems start with a mismatch in perspective: The operations in the control room sees the system and a rider on a platform sees one trip.

Side-by-side comparison. Left, the control room view: a system status table of routes, blocks, and vehicles flagged GAP, LATE, DETOUR, and DROPPED, with a draft alert reading “Route 42 experiencing delays of up to 20 minutes.” Right, the rider view: a phone showing upcoming arrivals at Elm St and 3rd St, with the next inbound Route 42 bus expected at 4:36 PM. The table below compares both views.
The control room sees the whole system, the rider sees one trip.
Dimension Operations View (Control Room) Rider View (Platform)
Starting question What is wrong with the service? Should I change my trip?
Unit of concern Route, block, vehicle My stop, my direction, my trip
Trigger An operational threshold is crossed My trip is affected
How the problem is described “Delays of up to 20 mins” “The next bus is expected at 4:36”
Vocabulary Bus bridge, single tracking, diversion, dropped trip Shuttle bus, slower trains, detour, canceled trip

How Operations Language Shows Up in Alerts

When alerts are written live, under pressure, by the people closest to the incident, the control room’s view leaks into the copy. Common signs:

What Riders Need From an Alert

Across my research, riders looked for the same four answers, in roughly this order:

  1. Is my trip affected? (route, direction, stops)
  2. What should I do? (wait, walk to a different stop, take another route)
  3. When will it be over? (a clock time, or when the next update is coming)
  4. Why is this happening? (a plain-language cause, which also tells riders how serious it is)

I suggest teams use this view as the lens for everything that follows. Map your own alerts through it, then use what you find to build your templates, style guide, decision trees, and a playbook.

Planned vs. Unplanned Disruptions = Different Timelines, Same Expectation

Planned and unplanned disruptions follow different operating processes. CX teams may spend weeks preparing communications for planned disruptions, while control rooms must respond to unplanned events in minutes. The principles in this guide apply to both, but the time available for writing and review, and the role the alert needs to play in helping riders respond, will differ.

Riders understand this difference in that they don’t expect a polished map for an incident that happened ten minutes ago. But they do expect to hear about it promptly and in words they can act on. A timely, clear alert that gets more detailed if the disruption continues is better than a perfect one that arrives after the bus has already gone.

Using Structured Data to Free Up Your Alerts

Before deciding what an alert should say, ask whether this needs to be an alert at all. In the ideal case, structured real-time data (GTFS Realtime) carries most of the information. It flows into trip planners, countdown signs, and apps automatically, so riders see updated times and paths wherever they look. The alert then does what data can’t by explaining what is happening, why it is happening, and guiding riders through it.

Note: This section covers digital rider information, such as apps, trip planners, websites, text and push alerts, real-time countdown signs, and digital screens. Printed signs at stops and stations are outside its scope. Data feeds can’t update them, so they need their own process for posting and removal.
What Changed What the Rider Needs to See Where It Should Come From
Bus is running 8 minutes late Updated arrival time Real-time trip data
A trip is canceled That specific departure is canceled Real-time trip data, plus an alert if riders need options
Bus will skip a stop The stop is skipped Real-time trip data
Bus is detoured Updated path, stops, and times Real-time detour data, plus an alert for context
Shuttle buses replace service Shuttle times and where to board Shuttle schedules in trip data, plus an alert
Stop is temporarily moved Where to go instead and why Updated stop data, plus an alert
Major disruption affects many trips What happened and what to do An alert tied to the affected service

When the Data Can’t Keep Up

In practice, structured data often can’t do all of this, especially during unplanned disruptions:

When data can’t carry the weight, alerts tend to try to do too much to make up for it and that is where alert consistency matters most.

Building Your Playbook Before the Next Incident

Imagine walking into an airport where every airline posts its own departure board. One shows departure times. Another shows a countdown. A third lists flights by destination instead of time. Some say “boarding,” others “now loading.” You could probably find your gate, but you would have to decode each board first.

Two airport scenes. Left, four departure boards from different airlines, each with its own layout and wording for the same flights, such as “Leaving soon!”, “Gate opens soon”, and “boarding”. Right, a single shared departure board listing every flight with the same columns and status terms.
Free-text alerts work like separate boards. Shared structure gives riders the same answers in the same place every time.

Riders experience something similar to this when alerts are written in free text without agency guidelines. Each writer brings their own interpretation of what is happening and their own words for it. One dispatcher calls it a detour, another says the stop moved, a third describes the bus’s new path. Operationally, it is the same event. To the rider, it reads like three different situations, and they have to work out what each one means.

Airports solved this by having every airline feed the same data into one board. Structured data can do the same for transit, and I encourage agencies to use it as much as their tools allow. Until it is available everywhere, the structure has to come from the people publishing alerts. That means deciding in advance, so that dispatchers aren’t making wording and judgment calls live during an incident.

I suggest four tools, ideally developed by operations and CX together:

Decision Tree: Detours and Stop Moves

A short decision tree removes the most common judgment calls. For example, when a bus can’t follow its usual path:

The criteria matter less than having them written down, shared, and applied the same way by everyone.

Style Guide: One Term per Situation

Pick one plain-language term for each type of disruption and use it everywhere. Here is a starting point:

Instead of Say
Bus bridge, bustitution → Shuttle buses replace trains
Diversion, re-route → Detour
Dropped, missed trip, not operating → Canceled
Stop relocated, temporary stop location → Stop moved
Suspended, service disruption → No service
Reduced frequency, single tracking → Trains are running less often

Template: The Anatomy of an Alert

A template works like a fill-in-the-blank: the writer supplies the facts, and the template supplies the order and the wording. Each blank answers a rider question and has a set place in the alert.

The header is what everyone sees in push notifications, text messages, and app previews. How much of a header riders see depends on the device, the app, and the channel. There is no reliable character limit to write to, so assume the header will be cut off and put the most important details first. Lead with the route and effect, then scope and end time. Add the cause and the rider’s next step after that, when they fit in a few words. If they get cut off, the rider still has what they need to decide whether their trip is affected.

Building Block Rider Question Where It Goes Example Feed Field
Route Is my line affected? Header Route 42 Affected service
Effect What kind of change is this? Header Detoured, No service, Shuttle buses Effect
Scope Which direction or stretch? Header Inbound, between Elm St and 5th St Affected service
End Time When will this be over? Header Route 42 Affected service
Cause Why is this happening? Header if short, otherwise description Due to police activity Cause, plus text
Alternative What should I do instead? Header if short, otherwise description Take Route 40 at Oak Ave Text
Skipped stops Is my stop affected? Descripton (header if only one) Stops at Elm, Oak, and Pine not served Affected stops, trip data
Temporary stops Where do I wait instead? Description Board on 3rd St at Oak Ave Stop moved effect, updated stop data

Put together, the header follows one pattern:

[Route] [direction]: [Effect] [scope] [end time] plus [cause] and [next step] when they fit in a few words

Some examples of the same pattern across planned and unplanned disruptions:

Unplanned detour:
Route 14 inbound: Detoured off Elm St until about 6:00 PM due to police activity. Board at 3rd St and Oak Ave.
Unplanned suspension, end unknown:
Red Line: No trains between Park and Harbor in both directions. No estimate yet, next update by 5:15 PM. A disabled train is blocking the tracks
Planned shuttles:
Header: Blue Line, [Dates]: Shuttle buses replace trains between [Station A] and [Station B] due to [cause]. Description: Learn more: [Link]
Planned partial shuttles:
Header: Blue Line, [Dates]: No trains between [Station A] and [Station B] due to [cause]. Shuttle buses run between [Station C] and [Station D] only. Description: [Alternative]. Learn more: [Link]
Planned bus detour (events or construction):
Header: Route 42, [Dates and hours]: Detoured off Main St due to [Event Name]. Board temporary stops on [Alternate St]. Description: Stops between [Location A] and [Location B] are not served. Learn more: [Link]

For planned disruptions, there is time to publish the change as structured data first, so trip planners such as the agency app, Google Maps, Apple Maps, and Transit can route riders around it automatically. I suggest doing that for every planned change, then leading the header with the dates and putting the diversion page link in the description, rather than fitting full schedules into the alert.

⚠️
In many apps, these headers will be cut off partway through. That is expected. The template puts the details in order so that whatever survives answers the rider’s first question.

Timing, Updates, and Clearing the Board

Rider research shows that generic delay notices (for example, “Delays up to 25 minutes”) cause confusion. Riders can’t tell if they will wait an extra 25 minutes, if the bus will come later than its prediction, or whether it applies to their stop at all.

Flowchart of the alert lifecycle, from disruption to removal. The numbered list below the image describes each step.

A quick decision-tree graphic for dispatchers and CX staff:

  1. Disruption happens → Check whether real-time trip or detour data can show the change.
  2. Data already shows the change and riders need no context? → No alert needed. Let live predictions carry it.
  3. Riders need context or a different action? → Publish an alert using your template, with a clock-time end or next update time.
  4. Estimate changes? → Update the original alert (no second alert).
  5. Service restored? → Remove the alert (no “all clear”) and let live predictions take over.

Examples: Before and After

The examples below are composites based on real alerts, with identifying details removed. They are not meant to single out any agency. Every agency publishing alerts is working on a hard problem, often with limited tools.

Three phone screens. Before: a lock-screen alert reading “Red Line delays. Updates to follow.” After: a lock-screen alert reading “Red Line: No trains between Park and Harbor in both directions. No estimate yet. Next update by 5:15 PM,” with the cause cut off. After, opened in the app: the full alert adds that a disabled train is blocking the tracks and suggests a bus alternative.
Three phone screens. Before: a lock-screen alert listing Route 14’s turn-by-turn path, cut off before it reaches the new stops. After: a lock-screen alert reading “Route 14 inbound: Detoured off Elm St until about 6:00 PM due to police activity. Board at 3rd St and Oak Ave.” After, opened in the app: the full alert lists the skipped stops, the temporary stop location, and an alternate route.
Three phone screens. Before: a lock-screen alert reading “Route 42 experiencing delays of up to 25 minutes due to operational issues.” After: a lock-screen alert reading “Route 42 inbound: Canceled 4:15 PM trip from Central Station due to a staffing shortage. Next bus at 4:35 PM.” After, opened in the app: the full alert adds another option and says other trips are on time.

The Pre-Publication Checklist

Before publishing any alert, check:

☐ Read the header on its own. Assume it is the only text the rider will see, because on text messages and push notifications, it is. Do the first few words name the route and the effect?

☐ Is it specific? Does it name the direction, location, and time rather than a vague, route-wide notice?

☐ Does it describe the service riders will get? Avoid internal terms. Use the words in your style guide.

☐ Does it follow your template? Same building blocks, same order, same terms as every other alert of this type.

☐ Time check. Unplanned: Is the end time a clock time? If unknown, does it say when the next update is coming? Planned: Do the dates and hours lead the header, with a link to a diversion page in the description?

☐ Structured data check. Is the change also published as real-time trip, detour, or schedule data where your tools allow? For planned changes, was it published ahead of time so trip planners can route around it?

☐ Plain-language cause. Is the cause written in plain words (for example, staffing, traffic, maintenance, construction, an event)? Leaving out the cause can make riders feel they are being kept in the dark. If the cause is unknown, don’t guess.

☐ Alternatives and links, when they help. For major changes such as a rail suspension with shuttles or a multi-stop detour, is there a clear alternative or a link to a diversion page? Skip this for minor or single-trip changes where live predictions already show the next vehicle.

☐ Clutter control. Are longer causes, multiple alternatives, stop lists, and links in the description, so the header leads with what riders need most?

☐ Accessibility. Are accessible van instructions included whenever shuttle buses are in service?

☐ Lifecycle owner. Is someone assigned to update estimates and remove the alert as soon as service returns to normal?


Making This Work in Your Tools

The practices in this guide apply to any agency, but how far you can take them depends on your software. Whether you can set an effect, name affected stops, publish detours as structured data, and more all varies by vendor and setup. That is often where the biggest gap sits between what riders need and what an alert can deliver.

If you’d like help working out what your tools can support today, where the gaps are, or what to ask your vendor, I’m happy to talk it through. Book a time to talk.

Acknowledgments

Thank you to Cameron Monagle for reviewing this guide and for being a thoughtful partner throughout. Our conversations helped me see that what I’d learned about writing service alerts was worth codifying for other agencies, and his feedback made this guide sharper and more useful.