← All presentations

Independent analysis · August 19, 2026

A Bus That Runs Is Not Always a Bus You Can Rely On.

I wanted to see whether the buses that appeared in the data also reached their stops at times riders could actually use. Through summer 2026, most scheduled trips showed up somewhere. The stop-level story is less reassuring.

123consecutive archived service days audited
18.27Mdeduplicated scheduled stop rows in the study windows
433,746scheduled trips evaluated against observed service
2partial schedule-shift dates excluded from comparisons

Schedule-shift dates are data gaps

A schedule-shift date is the first service date covered by a new GTFS version. On June 14 and August 9, the prior feed had expired the day before, while this tracker did not archive the newly effective feed until 10:00 p.m. PT. Each date therefore contains only the final hours of tracked service and produces an artificial trip-delivery result—7.1% on June 14 and 6.2% on August 9. Both dates are excluded. Post-shift in this report means the nine complete days after the fall change, August 10–18.

S1000251 archivedFeed coverage: Apr 5–Jun 13

Baseline schedule. Two later April captures were byte-for-byte identical.

S1000252 archivedFeed coverage: Jun 14–Aug 8

Summer schedule and route files arrived after nearly all of the first covered day had passed.

S1000252 refreshedService coverage unchanged

Only fare tables changed; schedule, route, trip, and stop files were unchanged.

S1000256 archivedFeed coverage: Aug 9–Apr 3, 2027

Fall schedule and school service returned after nearly all of the first covered day had passed.

Archive timestamps show when this tracker picked up each feed; they do not establish when AC Transit first published it.

The rider experience

A bus can run and still fail the rider

At least one actual stop arrival was logged for 90.2% of 433,746 scheduled trips. That sounds solid. But only 73.4% of the scheduled stops on those trips had an arrival from one minute early through seven minutes late. The first number tells us a bus showed up somewhere; the second gets closer to whether a rider could use it.

For a rider, a trip is useful only if it reaches their stop close enough to schedule that they can plan around it. After years of frequency cuts, a missed or no-show bus carries a larger penalty: it can mean being late to work, missing an appointment, or losing a connection with no good backup.

What jumped out

I expected the summer schedule to show a clear systemwide drop. It did not. Local and Transbay performance was broadly stable through the summer. The first complete days after the August schedule shift are where the numbers begin to separate.

Through summer

Summer was mostly steady

Local stop delivery was 73.9% both before and during summer. Transbay improved from 65.0% to 66.3%, while strict on-time performance rose slightly in both groups.

After August 9

Post-shift service softened at stops

Across the system, stop delivery fell from 73.6% in the baseline to 71.5% after the fall schedule shift. Transbay fell 4.4 points and All Nighter fell 4.7 points, even though a larger share of their scheduled trips ran.

School service

School trips returned, but late

School-route trip delivery returned near baseline: 93.0% versus 94.3%. Stop delivery improved, but strict on-time arrivals slipped to 34.0% and arrivals over seven minutes late rose to 14.4%.

Pre-summer baselineMay 17–June 13 · 28 days
Summer scheduleJune 15–August 8 · 55 complete days
Fall post-shiftAugust 10–18 · 9 complete days

First question: Did the bus show up at all?

I call this trip delivery: the share of scheduled trips that produced at least one actual stop arrival. It is a deliberately low bar. Across the full study, 90.2% of 433,746 scheduled trips cleared it.

Grouped bar chart comparing scheduled trip delivery in baseline, summer, and post-shift periods across five route groups.
School routes 600–699 were officially suspended for summer. Early Bird percentages use only 76 baseline, 152 summer, and 28 post-shift scheduled trips.
Route familyBaselineSummerPost-shiftPost-shift vs. baseline
Local / other90.8%90.1%89.8%−1.0 pt
Transbay87.0%88.3%88.3%+1.3 pts
All Nighter86.3%92.9%92.2%+5.9 pts
School 600–69994.3%Suspended93.0%−1.3 pts
Early Bird 7xx75.0%93.4%96.4%+21.4 pts

This does not mean 90.2% of trips finished their full routes. A trip counts as observed after one arrival. That makes trip delivery useful as a basic deployment check, but a poor standalone measure of rider reliability. A bus can clear this bar and still miss downstream stops, arrive far outside the useful window, or end early.

The harder question: Could a rider use it?

For stop delivery, I count an arrival only when it lands from one minute early through seven minutes late. The denominator includes every scheduled stop on an observed trip, including downstream stops the bus never reached.

Grouped bar chart showing stop-level delivery by route family and period.
Stop-level delivery is deliberately stricter than trip delivery. It combines missed downstream stops with arrivals outside the rider-useful window.

This gap between trips and stops is the main result. After the fall shift, All Nighter trip delivery improved by 5.9 points while stop delivery fell by 4.7 points. Transbay moved in the same direction: more scheduled trips appeared in the data, but fewer scheduled stops were reached inside the useful window.

Summer performance

Summer was broadly stable

The eight-week summer window was less dramatic than I expected. Local stop delivery stayed at 73.9%. Transbay moved from 65.0% to 66.3%. Strict on-time performance also edged up in both groups. In other words, the data does not show a broad summer decline.

Weekly line chart of stop delivery for Local, Transbay, and All Nighter service, with the summer and fall schedule shifts marked.
Weekly trend from May 17. The partial schedule-shift Sundays are excluded; the weeks containing them therefore have six complete days.
73.9% → 73.9%Local stop delivery, baseline to summer
65.0% → 66.3%Transbay stop delivery, baseline to summer
60.6%Transbay stop delivery in the preliminary post-shift period

That needs an important qualifier: stable does not mean good. A 73.9% useful-stop result still leaves roughly one scheduled stop in four outside the window. Summer simply did not make that existing problem much worse at the system level.

After the fall schedule shift

After August 9, trips and stops moved in opposite directions

The first nine complete days after the fall schedule shift look different. Systemwide stop delivery fell to 71.5%. Transbay fell 4.4 points from baseline and All Nighter fell 4.7 points, even as trip delivery improved for both groups. That divergence is worth watching.

Read the post-shift period as preliminary. It contains nine complete service days, August 10–18. The changes are signals to monitor, not evidence that the schedule change caused them.

Then: How close was it to schedule?

My stricter on-time measure counts an arrival only from its scheduled time through three minutes late. An early bus is not “on time” here: for someone timing a walk to the stop, leaving early can be just as disruptive as arriving late.

Three-panel horizontal bar chart of strict on-time arrival percentages by route family in baseline, summer, and post-shift periods.
Summer school service is omitted because routes 600–699 were suspended. Early Bird has a small sample and should be read diagnostically.
Route familyBaseline on timeSummer on timePost-shift on timePost-shift >7 min late
Local / other41.1%41.4%40.3%12.3%
Transbay35.5%36.4%32.3%15.7%
All Nighter45.0%44.2%42.0%11.6%
School 600–69936.0%34.0%14.4%
Early Bird 7xx23.3%20.2%26.8%14.6%

Trips cut short are rare. Long waits are the everyday problem.

Severely truncated trips are uncommon in these windows. The more persistent cost is time: post-shift waits averaged 18.8 minutes on Local service, 19.2 minutes on Transbay service, and 26.7 minutes on All Nighter service. I use an 80% threshold for severe truncation because a bus can appear to miss its last stop when the final GPS point falls just short of the terminal.

Grouped bar chart of the share of trips severely truncated before 80 percent of the scheduled route.
Severe truncation is below 1.5% for Local, All Nighter, and Early Bird service in the post-shift window, but 1.9% on Transbay and 3.3% on school routes.
Grouped bar chart estimating mean wait for a random-arrival rider by service family and period.
Mean rider wait uses actual headways from 1 to 120 minutes and the random-arrival formula E(H²) ÷ 2E(H). Early Bird is omitted because it produced only 6–33 valid headways per period.
18.8 minpost-shift mean random-arrival wait, Local
19.2 minpost-shift mean random-arrival wait, Transbay
26.7 minpost-shift mean random-arrival wait, All Nighter

Those waits changed little across the three windows. So the post-shift signal is mainly about stop delivery and punctuality, not a sudden systemwide collapse in headways. The waiting burden was already there.

School service

School service returned near baseline—with more lateness

School routes make a useful check because AC Transit suspended lines 600–699 for summer and brought them back on August 9. Across seven complete post-shift school-service days, trip delivery and severe truncation returned close to their pre-summer levels. Punctuality did not.

Dumbbell plot comparing baseline and post-shift percentages for school trip delivery, stop delivery, strict punctuality, and trips not severely truncated.
Baseline includes 1,708 scheduled school trips across 19 active days; the post-shift period includes 781 across seven active days.

School 600–699

Trip delivery was 93.0%, versus 94.3% before summer. Stop delivery improved from 63.6% to 65.4%. The tradeoff shows up in timing: on-time arrivals fell two points, while the share more than seven minutes late rose 3.7 points. Severe truncation was nearly unchanged at 3.3%, versus 3.5% before summer.

Calendar caveat

School routes do not all operate on every weekday. The comparison uses only service that appears in each date’s GTFS schedule; it does not assume every 600-series route should run daily.

All Nighter and Early Bird

Post-shift familyScheduled tripsTrips observedTrip deliveryStop deliveryStrictly on time
All Nighter73067392.2%73.8%42.0%
Early Bird282796.4%34.3%26.8%

Early Bird’s trip-delivery result improved sharply, but I would not draw much from its stop numbers yet. The post-shift sample contains only 70 scheduled stop rows and 41 actual arrivals. These short routes cross the service-day boundary and often finalize through the tracker’s stale-trip path, so I treat their stop and headway results mainly as a data-quality check.

Route-by-route results

The system average hides big route-level swings

Riders do not experience a system average; they experience a particular route. To keep very small samples from dominating, I limited this comparison to routes with at least 100 observed baseline trips and 50 post-shift trips. Within that group, Lines 802, O, and 840 had the largest stop-delivery declines. Lines 851, P, and V had some of the largest gains.

Horizontal diverging bar chart of routes with the largest gains and declines in stop delivery from baseline to the post-shift period.
Percentage-point change in stop delivery, baseline to August 10–18. This threshold controls tiny samples but does not make nine days a long-term trend.
RouteFamilyBaseline stop deliveryPost-shift stop deliveryChange
802 · San Pablo All NighterAll Nighter87.5%64.3%−23.2 pts
O · Santa Clara–EncinalTransbay65.2%51.6%−13.6 pts
840 · Foothill–EastmontAll Nighter91.2%78.7%−12.5 pts
851 · Santa Clara–BroadwayAll Nighter69.1%81.2%+12.1 pts
P · Piedmont–Oakland Ave.Transbay45.6%56.7%+11.2 pts
V · Montclair–Park Blvd.Transbay37.3%45.6%+8.3 pts

Data hygiene

Two feed changes created two bad comparison dates

The archive has an entry for every day from April 18 through August 18, but the GTFS coverage has two holes. On June 14, the old feed had expired and the new one did not reach this tracker until 10:00 p.m. The same thing happened on August 9. In a chart, those dates look like catastrophic service failures. They are actually partial days in the data, so I exclude both from every comparison.

Line chart of daily deduplicated arrivals from April 18 through August 18, with sharp partial-day drops on June 14 and August 9.
Daily deduplicated arrivals. Weekends normally have lower volume; the two red schedule-shift dates are materially below even the surrounding Sundays.
31.43Mraw BigQuery rows in the 123-day audit
24.35Munique date × trip × stop records after deduplication
22.5%duplicate rows removed before any reliability calculation
Why deduplication matters

The live tracker can finalize the same trip more than once. Before calculating anything, I keep one row per service date, trip, and stop, preferring a row with an actual arrival and then the latest ingestion. Otherwise, repeatedly finalized trips would count more than once and skew the results.

Conclusion and call to action

A reliability standard built for riders

AC Transit describes its on-time performance KPI as: “The percentage of buses that depart time points no more than one minute early and no more than five minutes later than scheduled.” Its public chart sets the target at 75%.

Screenshot of AC Transit’s On Time Performance KPI chart showing monthly results near a 75 percent target and the agency’s definition of on-time performance.
AC Transit’s published On Time Performance chart and 75% target. Select the image to open the source KPI.

That KPI and mine are not identical: AC Transit measures departures at designated time points, while I measure arrivals at every scheduled stop. This report also shows a strict 0/+3-minute measure, but its main stop-delivery window is −1/+7—two minutes more forgiving on the late side than AC Transit’s own window.

Seventy-five percent is a floor, not a complete standard

At the target, one in four measured timepoint departures can fall outside AC Transit’s own window. A single percentage does not tell us whether those misses were six minutes late, thirty minutes late, or trips that never ran. That is exactly the failure range this analysis is trying to make visible.

A two-tier standard

Keep a simple on-time percentage as the headline if it is useful, but pair it with a service-delivery target and limits on the worst outcomes. I would start with the following public commitments:

100%Scheduled trips operated. Every planned trip should run.
75%Headline floor. At least this share of timepoint departures inside AC Transit’s −1/+5 minute window.
≤7 min95th-percentile lateness. At least 95% of scheduled timepoints should be no more than seven minutes late.
≤10 min99th-percentile lateness. At least 99% of scheduled timepoints should be no more than ten minutes late.
No-shows must count as failures

A dropped trip or timepoint cannot disappear from the on-time calculation just because there is no departure to measure. Every scheduled trip should remain in the denominator, fail the headline on-time KPI, fail the 100% service-delivery target, and count as a catastrophic tail failure. If no-shows are excluded from the p95 and p99 calculations, those percentiles should be published alongside a separate no-show rate that automatically fails the standard.

This matters because AC Transit is not starting from a high-frequency network with abundant backup options. Much of the planned service is already skeletal. When the next bus may be twenty, thirty, or sixty minutes away, a trip that does not run is not a small scheduling miss—it can break the rider’s entire journey. In that context, 100% service delivery is the right target, and a p99 worse than ten minutes late should be treated as a serious failure.

What the public scorecard should show

Trip delivery is a useful starting point, but it should never stand on its own. The scorecard should also show whether trips reached their scheduled stops, how early or late they were, whether they completed most of the route, and how uneven spacing changed the wait.

Scheduled-trip deliveryDid the service in the timetable appear?
Stop-level deliveryDid the trip reach each stop inside a rider-useful window?
Early and late sharesHow often did an arrival miss the promise in either direction?
Severe truncationHow often did a trip fail to reach the final fifth of its stop sequence?
Headway-based waitsWhat wait did irregular spacing impose on a random-arrival rider?

I would publish each measure by service family and route, not only as a systemwide average. This summer is a good example of why: the overall numbers barely moved while stop-level performance remained weak, and the post-shift average hid routes moving sharply in opposite directions.

Topline takeaways from this analysis

  • Summer was broadly stable.
  • The preliminary post-shift period deserves monitoring.
  • Trip delivery alone overstates the rider experience.
  • School service returned near baseline but with more very-late arrivals.

Caution against these conclusions

  • That the August schedule change caused the declines.
  • That Early Bird is definitively the least reliable family.
  • That every trip missing its final observed stop was cut short.
  • That these route-weighted results equal rider-weighted experience.

Methodology & sources

How to reproduce and interpret the analysis

Definitions

  • Trip delivery: observed trips ÷ GTFS-scheduled trips.
  • Stop delivery: actual arrival from −1 to +7 minutes ÷ all scheduled stops on observed trips.
  • Strictly on time: actual arrival from scheduled time through +3 minutes.
  • Very late: more than 7 minutes after schedule.
  • Severely truncated: no arrival observed beyond 80% of the scheduled stop sequence.
  • Mean rider wait: random-arrival wait estimated from actual 1–120 minute headways.

Route groups

  • Early Bird: 701, 702, 703.
  • All Nighter: 800, 801, 802, 805, 840, 851.
  • School: numeric routes 600–699.
  • Transbay: E, F, FS, G, J, L, NL, NX, NX3, O, P, U, V, W, excluding the special groups above.
  • Local / other: all remaining routes.

Limitations

  • The post-shift period is only nine complete days, so it is preliminary and not causal evidence.
  • June 14 and August 9 are excluded pipeline-coverage gaps, not evidence that transit service collapsed on those dates.
  • Metrics weight stop observations, trips, or route-stop headways—not passenger boardings. High-ridership routes do not receive extra weight.
  • Final-terminal GPS behavior makes “any incomplete trip” too noisy for a headline; the 80% threshold is used instead.
  • Early Bird results have very small stop and headway samples and unusual service-day behavior.
  • The archived two-consecutive-missed-bus metric begins July 12 and is not used for baseline comparisons.

Sources