← live map Data study · GTFS

St. Louis · Metro Transit

The buses are slow for a reason you can measure.

I pulled Metro St. Louis's own public schedule feed and measured every weekday bus route in the system. The data points at one unglamorous fix that speeds up the network without anyone buying a bus, and it just as clearly clears a few routes that look wasteful but are quietly doing real work.

One honest caveat first. A schedule feed tells you where buses go and when. It says nothing about how many people are aboard. So everything here is measured from the supply side, and every dollar figure is a model with its assumptions shown in the open. Ridership and trip-origin data live inside Metro. The day you add them, some of these ideas get sharper and one or two might flip. I have tagged every number as either measured from the feed or modeled from a stated assumption.
01

The network today

Metro runs 58 bus routes on a weekday. Laid end to end, the scheduled service is a lot of road and a lot of driver time, and that total is the denominator for everything that follows. measured

40,423

revenue miles / weekday

2,345

revenue hours / weekday

3,501

scheduled trips / weekday

For all that road and driver time, the buses carry about 40,365 riders on an average weekday. The mode costs roughly $161 million a year to run, which comes to about $186 for every hour a bus is in revenue service and $12.64 a boarding. Those numbers come from the National Transit Database, not the schedule, and they're what everything below gets measured against. measured

02

The problem isn't coverage. It's the wait.

Ask someone why they don't take the bus and they rarely say it's too slow. They say they just watched one pull away and the next is in fifty minutes. 21 of the 58 weekday routes run no better than once every 45 minutes in the middle of the day. A bus that comes once an hour is a bus you have to plan your whole afternoon around, which is the same as no bus for most people. measured

St. Louis, like a lot of US cities, spread its service thin to put a stop near almost everyone. That's a real value if you can't walk far. It also means the money is sliced into so many low-frequency routes that few of them are useful for a spontaneous trip. The map below colors every route by how often it actually comes at midday. Green lines are turn-up-and-go. Red lines you have to schedule your life around.

≤15 min 20 30 45 60+

Hover any line for its number, name, length and midday headway. Drawn from Metro's GTFS shapes; headway is the median gap between departures in the busier direction, 10am–2pm.

03

The fix that pays for itself: fewer stops

Here's the lever the data backs without needing a single rider count. Metro's stops sit roughly 200 meters apart on its busiest lines. Route 70 Grand makes 54 stops in one direction. Route 1 over in Illinois makes 141. Every stop a bus actually serves costs real time: brake, pull in, kneel, wait, merge back into traffic. The standard US spacing target is about a quarter mile, and the agencies that have widened their stops to hit it got measurably faster, more reliable buses with very few walk-distance complaints, because the stops they pulled were the ones a block or two from the next one.

I applied a conservative rule to every route: keep the first stop, the last stop, and every scheduled timing point, then drop any remaining stop sitting closer than 250 meters to the one before it. That still leaves stops denser than the national norm. Measured against each route's full-length trip pattern, a little under a third of all stops fit that description, somewhere around 830 to 876 of 3,060 depending on which trip pattern you measure. They exist mostly because the stop before them is a block away. measured

keep too close, drop

Stops on one direction of the route. Red dots sit within 250m of the previous kept stop and aren't timing points.

Turn those dropped stops into time, and time into the buses you need to run the same service. How much depends on how many seconds each removed stop really costs, so I ran it three ways instead of picking a flattering single number. The low row isn't a guess: 8 seconds a stop works out to about a 6 percent runtime cut, which is almost exactly what TriMet in Portland actually measured after it widened its stop spacing. modeled

Assumptionsec / stopruntime cuthours / yearvalue / year

Hours saved are the runtime cut applied to Metro's National Transit Database total of 863,096 revenue-hours, valued at $116 an hour, the marginal cost of running a bus once you leave out fuel. The biggest source of doubt is that the model assumes every trip serves every one of those stops, while in practice some shorter trips already skip the quiet ones. That pulls the honest figure toward the low row or a touch below it, and it's the gap Metro's own boarding counts would close.

There is a fuel saving here too, and it's worth sizing honestly instead of dressing up. The buses cover the same miles either way. What changes is the stop-and-go, because every removed stop is one less idle and one less hard pull back up to speed. Put a rough number on the idling and acceleration you cut and it lands around 60,000 to 150,000 gallons of biodiesel a year, call it $180k to $440k and 700 to 1,700 tons of carbon. Real money, but a rounding error next to the labor saving, which is why the headline stays on time and dollars. The far bigger carbon lever isn't on this page at all. It's putting more riders on each bus so cars come off the road, which is what the frequency reinvestment is for, alongside the 24 battery-electric buses Metro already runs. modeled

04

What the saved hours buy

One rule kept me honest through all of this. An hour you save is an hour you get to spend exactly once. You can bank it as cash or pour it back into frequency. You cannot count it twice, and most of the breathless "transit will save millions" math gets caught doing precisely that.

The stronger move, and the one Metro itself chose when it redrew the Missouri network in 2019 under the name Metro Reimagined, is to keep the budget flat and pour the recovered time into showing up more often. Same cost, a network you can use without memorizing a timetable. The recovered hours from stop balancing are in the same ballpark as the service it would take to pull those once-an-hour routes toward every thirty minutes.

Does it work? The cleanest evidence isn't actually St. Louis, because COVID arrived six months after Metro Reimagined launched and muddied the before-and-after. It's Houston, which redrew its whole bus map into a frequent grid in 2015 at no extra operating cost and saw ridership climb 7.5 percent in the first year, with Sunday service up thirty. The lever underneath that is well measured: riders respond to frequency with an elasticity around half, so doubling how often a useful route comes brings roughly a third more riders. The other option, if the goal is a smaller check rather than a better network, is to keep the saved hours as cash. This page shows both paths. It never adds them together, because an hour saved is an hour you spend once.

05

What I refused to count as waste

This is the part most "redesign the buses" takes get wrong, so I want to show my work. Two things in the data look like obvious fat: routes that wander instead of running straight, and routes that overlap each other. I measured both, went and read the actual stop lists, and then threw most of it out.

Route 98 looks badly circuitous on paper. Read its stops and the detour is the point: it threads Mercy Hospital and Missouri Baptist Hospital. Route 60 bends 4 times longer than a straight line would, because it's collecting the National Archives, Christian Hospital, two Hazelwood schools and a veterans' home along the way. Route 77 scores as wildly indirect only because it's a one-way loop that ends where it starts, which breaks the math, not the route.

The overlap the data flags between routes 2 and 5 is more real, and worth being precise about. They run the same eight stops along Skinker into Mallinckrodt Center, past the MetroLink station where riders transfer, with route 1 joining for the final stretch. That's a genuine shared corridor feeding one destination, not a coincidence. Whether it's worth trimming is the call you cannot make from a schedule, because it turns entirely on how many people ride each line into that corridor, and those counts live in Metro's records, not in the timetable.

Straightening any of those saves money on a spreadsheet and strands a hospital in real life. You cannot tell the difference between a wasteful detour and a lifeline without knowing who boards where, and that data isn't in a schedule. So overlap and circuity stay here as diagnostics worth a second look, not as savings I'm willing to claim.

06

Where the riders actually are

Everything to here avoids guessing at ridership. But the obvious question is which routes carry people, and Metro knows that down to the stop. It just doesn't publish it. So I estimated it from data that is public: census population, jobs, and low-wage workers, who ride transit at far higher rates, within 600 meters of every route. It measures demand potential, not a turnstile count, and the one place it misleads is worth saying out loud.

The honest limit. The proxy under-ranks the #70 Grand line, which is actually Metro's busiest, because Grand's ridership comes from its frequent service and transit-dependent neighborhoods more than from raw corridor headcount. Read the estimate as corridor intensity, not boardings.

Two patterns fall out, pointing opposite directions. Switch the map above to Demand and the bright lines are the dense corridors. A bright line that comes only once an hour is the clearest upgrade target on the map.

BUSY, STUCK AT HOURLY → ADD SERVICE

THIN DEMAND, HEAVY SERVICE → REVIEW

demand index is 0–100 corridor intensity; idx×hourly is the upgrade case. Service-to-demand above 2 means a lot of bus for thin demand. These flag candidates; the next section verifies each.

modeled St. Louis County publishes weekday traffic counts, which I folded in as a second opinion on corridor activity.

Get the real numbers. Metro's automatic passenger counters already log boardings by stop and route. A Missouri Sunshine Law request to Bi-State Development would obtain that table, replace this estimate with ground truth, and likely sharpen or overturn parts of what follows.
07

A proposed network

Putting it together: take the corridors with real demand stuck at hourly service and make them frequent, pay for it with the hours freed from routes running a lot of bus through thin demand, and leave the lifeline coverage alone. Every change below was put past an independent reviewer whose only job was to find riders it would strand. The ones that stranded a hospital, a school or a sole-coverage neighborhood were thrown out.

more frequent restructured removed unchanged

Flip Current and Proposed. Current colors by today's frequency; Proposed colors each route by its verified recommendation, everything else unchanged. This is a concept built from public data, not an engineered service plan.

RouteChangeWhyhrs/day

Each row survived adversarial review. Hours are approximate; a plus adds frequency, a minus frees service to pay for it.

08

Who gains, who loses, and the backfill

A redesign that pulls service onto the busy corridors buys frequency for a lot of people and takes a nearby stop away from some others. That's the central trade in any coverage-versus-frequency plan, and pretending it isn't there is how these proposals lose trust. So here's the count, walked out at a quarter mile from every stop, before and after the cuts, against every stop that stays on every route.

residents gain frequent service

lose their nearest stop

of those are low-wage workers

About 73,000 residents along the five upgraded corridors get a bus frequent enough to use without a schedule. Against that, the cuts strip the nearest stop from a smaller group, a little under 5 percent of everyone the system reaches today, and a couple thousand of them are low-wage workers who ride at the highest rates. That isn't a number to wave away. It's roughly 1,900 bus trips a weekday that need somewhere else to go. modeled

The honest move is to budget for those riders, not to cut and hope. A thousand-odd scattered trips a day is exactly the case where a fixed bus loses money and an on-demand option wins, so the freed service hours can pay to carry them a different way.

Backfill option$/trip~$/yearfit
loading mitigation costs…

Annual cost is the stranded trips a weekday times the per-trip cost over 255 weekdays. Sources in the method note.

There's a catch worth seeing clearly. Carrying every stranded trip by on-demand van runs about $7.5 million a year, which is nearly the whole sum the trims free up. You cannot both replace the lost coverage with premium service and pour the savings into frequency. The money stretches one way. That's why the realistic plan is a targeted backfill, around a million a year, paired with frequency for the corridors that earn it.

And none of this is optional in the legal sense. A service change this large requires Metro to run a Title VI equity analysis that measures the burden on low-income and minority riders separately and documents how it gets mitigated. Counting the stranded here, and pricing their backfill, is that arithmetic done in the open instead of discovered after the buses stop coming.

09

What it costs, what it saves

The redesign is built to be roughly cost-neutral, which is the whole point: better service, not a bigger check. Trimming the low-demand sprawl off the over-served routes frees up bus-hours; making the busy corridors frequent spends them. Here is the arithmetic, valued at the same $116 marginal cost per bus-hour used earlier, and annualized over weekdays only as a conservative floor.

net bus-hours freed / weekday

operating value / year

rider wait-hours saved / weekday

Line itembus-hrs / weekdayper year

Consolidation hours come from the redrawn geometry: removed route-miles × trips a day ÷ the 13.9 mph NTD average bus speed. Upgrade hours come from the frequency multiplier on each corridor. Fuel and carbon track the net change in vehicle-miles at Metro's 4.45 mpg and realized fuel cost. This is separate from the stop-consolidation lever earlier; the two overlap on the trimmed routes, so don't simply add them. modeled

10

Method, and every number's source

Built from Metro St. Louis's published GTFS feed (2026-06), a representative weekday. Route geometry, stop positions, trip counts, headways and revenue miles and hours are measured straight from that feed. The dollar, fuel and time-saved figures are modeled on the constants below, each one stated so you can swap it and rerun the logic in your head.