Explainer · Quality & Compliance
Ghost buses: why the app shows a bus that never comes
A ghost bus is a prediction with no vehicle behind it. Here is how a transit app generates one, the four ways it happens, and how Chicago drove its rate down.
You are standing at the stop. The app says the bus is four minutes out, then two, then one. Then the listing disappears and no bus was ever there. That is a ghost bus, and the Chi Hack Night group that has tracked them in Chicago since 2022 defines it plainly and measures it by scraping the CTA vehicle feed every five minutes and comparing it against the published schedule: a ghost bus is when a bus tracker app claims a bus is coming and it never shows up. The short answer for why it happens is that the arrival you read is not a report from a bus. It is a prediction, stitched together from two separate data feeds, and a ghost appears whenever the app trusts the schedule after the real bus has been cancelled or has dropped off the live feed.
The prediction has no bus behind it
Two feeds sit underneath every arrival time. One is the static schedule, published as GTFS, which says what is supposed to happen. The other is the real-time feed, published as GTFS-Realtime, which says what is actually happening: where each vehicle is right now and when it should reach the next stops. A healthy prediction leans on the real-time feed and falls back to the schedule only to fill gaps. A ghost is what you get when the fallback fires and nothing corrects it. The timetable promises a 5:10 departure, no vehicle ever reports in against that trip, and the app keeps counting down a bus that does not exist.
Chicago is a clean case because the same agency’s own tools disagreed with each other, which exposed the mechanism. The CTA’s Bus Tracker and the signs bolted to bus shelters read only real-time vehicle positions, so an unstaffed run never appears on them. Third-party apps, the Ventra app, and the rail Train Tracker blend schedule and real-time data so they can show you a trip in advance, before a driver has even logged in. That design is useful, since it lets a mapping app plan a trip an hour ahead, and it is exactly where ghosts breed. CTA operators log into the onboard GPS at the start of a shift, which gives the real-time system up to 30 minutes of warning that a run is genuinely staffed. Until that login lands, the only evidence the trip exists is the schedule, and the schedule cannot tell the difference between a bus that is late and a bus that is never coming.
Four ways a ghost is born
The same rider experience has a few distinct failure modes underneath it. They are worth separating because they break in different parts of the data chain and get fixed in different ways.
| Failure mode | What goes wrong in the feed | What the rider sees |
|---|---|---|
| Scheduled but not operated | The trip stays in the schedule feed and no vehicle is ever assigned, so nothing in the real-time feed contradicts it. | An arrival counts down off the timetable, then the listing vanishes. |
| Stale or lost AVL | The vehicle’s last GPS fix, from the automatic vehicle location (AVL) feed, keeps generating a prediction after the bus goes out of service or loses signal in a tunnel or urban canyon. | A “live” bus inches toward the stop, stalls, then blinks out. |
| GTFS-Realtime staleness | The real-time feed stops refreshing and a downstream app keeps serving the last snapshot as if it were current. | A vehicle sits frozen, or an arrival that already happened lingers on the board. |
| Cancellation not propagated | Dispatch knows the run is cancelled, but that fact never reaches the feed consumers read, because the schedule can only change on a fixed cycle. | A trip the agency already knows will not run stays on the board until its scheduled time passes. |
The Chicago problem was mostly the first and last rows: runs that were never staffed, and cancellations that the feeds could not carry.
What the rate actually was
For years the scale of the problem was guessed at from rider complaints. The value of an open dataset, and of the agency’s own metrics, is that it turns the complaint into a rate. In 2022 the CTA delivered 80.4 percent of its scheduled bus service and 71.8 percent of its scheduled rail service. Nearly one in five scheduled buses and more than one in four scheduled trains never ran. Records the agency released under a public-records request counted almost 360,000 cancelled bus runs between January 2022 and September 2023, and 97 percent of them blamed a lack of staffing. The agency’s own account of the mechanism was blunt: an operator calls off, no one is available to fill the run, and it will remain on the board and then disappear off the board. The rail side had worse days than the bus side. On the Blue Line the project found as few as 61 percent of scheduled trains running, and as low as 35 percent on weekends.

The turnaround came from hiring. As operators returned, the delivered share climbed back toward the schedule and stayed there: by June 2025 the CTA was running 98.8 percent of its scheduled buses, though trains still trailed at 88 percent. Fewer cancelled runs means fewer chances for a ghost. It does not, on its own, remove them.
Why the ghosts outlasted the cancellations
Here is the part that matters for anyone who runs a feed. Even after the buses were mostly running again, the ghosts lingered, because fixing the operation did not fix the data. When a run was cancelled, the CTA had no clean way to tell the apps: its published trips could only be changed on the timetable cycle its union contracts allowed, about twice a year, and the agency did not begin sharing cancelled-bus data with the apps until May 2025. Until then a cancelled run kept living in the schedule feed, and the apps did what they were built to do and showed the scheduled trip.
The standards already have a slot for this. GTFS-Realtime lets a feed mark a trip CANCELED in a trip update, which tells every downstream consumer to stop predicting it. The standard was there all along. What was missing was the path from a dispatcher’s cancellation to the feed the apps read. Once the CTA built it, the Transit app began drawing a line through cancelled departures instead of letting them silently disappear, with other apps set to follow. The buses had been running for months by then. What changed was the plumbing that tells a phone which promises to stop believing.
What it means for feed health
A schedule is a promise and a real-time feed is the correction, and a ghost bus is what a rider sees when the correction never arrives. That framing travels well beyond Chicago. Any agency that publishes both a schedule and a live feed owns the seam between them, whether or not it is short on operators. The ghost is a data-quality defect first and a service defect second, and the two do not clear up on the same timeline: Chicago fixed most of the missing buses well before it fixed the feed that kept advertising them.
For a practitioner, that turns the ghost rate into a feed-health metric you can watch and act on. It is measurable the way the Chi Hack Night project measures it, by lining scheduled trips up against the vehicles that actually reported in, and it is fixable at the feed with cancellation data the standards already support. The CTA numbers here are a snapshot of mid-2026, and reliability figures move, so treat the specific percentages as a point in time. The mechanism does not move. Wherever an app blends a schedule with a live feed, a bus that stops reporting and a cancellation that never propagates will keep producing the same four-minutes-then-nothing that sends people back to their cars.
Common questions
- What is a ghost bus?
- A ghost bus is an arrival that a transit app shows counting down, four minutes then two then one, when no bus is actually coming. The listing then disappears and no vehicle was ever there.
- Why do ghost buses happen?
- They come from the data layer, not the sign. A prediction leans on the real-time feed and falls back to the schedule, so when the real-time feed is stale, missing, or wrong, or a bus is matched to a trip it is no longer running, the app can keep showing an arrival that never comes.
- What do ghost buses say about feed health?
- They are a visible symptom of real-time feed problems. A schedule is a promise and a real-time feed is the correction, and a ghost bus is what a rider sees when the correction fails.