Skip to main content

Budget Outlook

Page Title

Page Title

Budget Outlook

Error message

  • Deprecated function: explode(): Passing null to parameter #2 ($string) of type string is deprecated in Drupal\gtranslate\Plugin\Block\GTranslateBlock->build() (line 367 of modules/contrib/gtranslate/src/Plugin/Block/GTranslateBlock.php).
    Drupal\gtranslate\Plugin\Block\GTranslateBlock->build() (Line: 171)
    Drupal\block\BlockViewBuilder::preRender()
    call_user_func_array() (Line: 113)
    Drupal\Core\Render\Renderer->doTrustedCallback() (Line: 886)
    Drupal\Core\Render\Renderer->doCallback() (Line: 431)
    Drupal\Core\Render\Renderer->doRender() (Line: 503)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 513)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 113)
    __TwigTemplate_747765aa29738ca8d9971f9a1a79fe2e->doDisplay() (Line: 461)
    Twig\Template->yield() (Line: 416)
    Twig\Template->display() (Line: 431)
    Twig\Template->render() (Line: 53)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 490)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 513)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 119)
    __TwigTemplate_fdb176904433d2770118aead93af4714->doDisplay() (Line: 461)
    Twig\Template->yield() (Line: 416)
    Twig\Template->display() (Line: 431)
    Twig\Template->render() (Line: 53)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 490)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 158)
    Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 637)
    Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 153)
    Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse() (Line: 90)
    Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray()
    call_user_func() (Line: 111)
    Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch() (Line: 186)
    Symfony\Component\HttpKernel\HttpKernel->handleRaw() (Line: 76)
    Symfony\Component\HttpKernel\HttpKernel->handle() (Line: 53)
    Drupal\Core\StackMiddleware\Session->handle() (Line: 48)
    Drupal\Core\StackMiddleware\KernelPreHandle->handle() (Line: 28)
    Drupal\Core\StackMiddleware\ContentLength->handle() (Line: 32)
    Drupal\big_pipe\StackMiddleware\ContentLength->handle() (Line: 201)
    Drupal\page_cache\StackMiddleware\PageCache->fetch() (Line: 138)
    Drupal\page_cache\StackMiddleware\PageCache->lookup() (Line: 87)
    Drupal\page_cache\StackMiddleware\PageCache->handle() (Line: 50)
    Drupal\ban\BanMiddleware->handle() (Line: 48)
    Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle() (Line: 51)
    Drupal\Core\StackMiddleware\NegotiationMiddleware->handle() (Line: 36)
    Drupal\Core\StackMiddleware\AjaxPageState->handle() (Line: 51)
    Drupal\Core\StackMiddleware\StackedHttpKernel->handle() (Line: 741)
    Drupal\Core\DrupalKernel->handle() (Line: 19)
    
  • Warning: Undefined array key 1 in Drupal\gtranslate\Plugin\Block\GTranslateBlock->build() (line 367 of modules/contrib/gtranslate/src/Plugin/Block/GTranslateBlock.php).
    Drupal\gtranslate\Plugin\Block\GTranslateBlock->build() (Line: 171)
    Drupal\block\BlockViewBuilder::preRender()
    call_user_func_array() (Line: 113)
    Drupal\Core\Render\Renderer->doTrustedCallback() (Line: 886)
    Drupal\Core\Render\Renderer->doCallback() (Line: 431)
    Drupal\Core\Render\Renderer->doRender() (Line: 503)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 513)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 113)
    __TwigTemplate_747765aa29738ca8d9971f9a1a79fe2e->doDisplay() (Line: 461)
    Twig\Template->yield() (Line: 416)
    Twig\Template->display() (Line: 431)
    Twig\Template->render() (Line: 53)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 490)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 513)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 119)
    __TwigTemplate_fdb176904433d2770118aead93af4714->doDisplay() (Line: 461)
    Twig\Template->yield() (Line: 416)
    Twig\Template->display() (Line: 431)
    Twig\Template->render() (Line: 53)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 490)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 158)
    Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 637)
    Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 153)
    Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse() (Line: 90)
    Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray()
    call_user_func() (Line: 111)
    Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch() (Line: 186)
    Symfony\Component\HttpKernel\HttpKernel->handleRaw() (Line: 76)
    Symfony\Component\HttpKernel\HttpKernel->handle() (Line: 53)
    Drupal\Core\StackMiddleware\Session->handle() (Line: 48)
    Drupal\Core\StackMiddleware\KernelPreHandle->handle() (Line: 28)
    Drupal\Core\StackMiddleware\ContentLength->handle() (Line: 32)
    Drupal\big_pipe\StackMiddleware\ContentLength->handle() (Line: 201)
    Drupal\page_cache\StackMiddleware\PageCache->fetch() (Line: 138)
    Drupal\page_cache\StackMiddleware\PageCache->lookup() (Line: 87)
    Drupal\page_cache\StackMiddleware\PageCache->handle() (Line: 50)
    Drupal\ban\BanMiddleware->handle() (Line: 48)
    Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle() (Line: 51)
    Drupal\Core\StackMiddleware\NegotiationMiddleware->handle() (Line: 36)
    Drupal\Core\StackMiddleware\AjaxPageState->handle() (Line: 51)
    Drupal\Core\StackMiddleware\StackedHttpKernel->handle() (Line: 741)
    Drupal\Core\DrupalKernel->handle() (Line: 19)
    
  • Deprecated function: explode(): Passing null to parameter #2 ($string) of type string is deprecated in Drupal\gtranslate\Plugin\Block\GTranslateBlock->build() (line 373 of modules/contrib/gtranslate/src/Plugin/Block/GTranslateBlock.php).
    Drupal\gtranslate\Plugin\Block\GTranslateBlock->build() (Line: 171)
    Drupal\block\BlockViewBuilder::preRender()
    call_user_func_array() (Line: 113)
    Drupal\Core\Render\Renderer->doTrustedCallback() (Line: 886)
    Drupal\Core\Render\Renderer->doCallback() (Line: 431)
    Drupal\Core\Render\Renderer->doRender() (Line: 503)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 513)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 113)
    __TwigTemplate_747765aa29738ca8d9971f9a1a79fe2e->doDisplay() (Line: 461)
    Twig\Template->yield() (Line: 416)
    Twig\Template->display() (Line: 431)
    Twig\Template->render() (Line: 53)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 490)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 513)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 119)
    __TwigTemplate_fdb176904433d2770118aead93af4714->doDisplay() (Line: 461)
    Twig\Template->yield() (Line: 416)
    Twig\Template->display() (Line: 431)
    Twig\Template->render() (Line: 53)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 490)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 158)
    Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 637)
    Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 153)
    Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse() (Line: 90)
    Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray()
    call_user_func() (Line: 111)
    Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch() (Line: 186)
    Symfony\Component\HttpKernel\HttpKernel->handleRaw() (Line: 76)
    Symfony\Component\HttpKernel\HttpKernel->handle() (Line: 53)
    Drupal\Core\StackMiddleware\Session->handle() (Line: 48)
    Drupal\Core\StackMiddleware\KernelPreHandle->handle() (Line: 28)
    Drupal\Core\StackMiddleware\ContentLength->handle() (Line: 32)
    Drupal\big_pipe\StackMiddleware\ContentLength->handle() (Line: 201)
    Drupal\page_cache\StackMiddleware\PageCache->fetch() (Line: 138)
    Drupal\page_cache\StackMiddleware\PageCache->lookup() (Line: 87)
    Drupal\page_cache\StackMiddleware\PageCache->handle() (Line: 50)
    Drupal\ban\BanMiddleware->handle() (Line: 48)
    Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle() (Line: 51)
    Drupal\Core\StackMiddleware\NegotiationMiddleware->handle() (Line: 36)
    Drupal\Core\StackMiddleware\AjaxPageState->handle() (Line: 51)
    Drupal\Core\StackMiddleware\StackedHttpKernel->handle() (Line: 741)
    Drupal\Core\DrupalKernel->handle() (Line: 19)
    
  • Warning: Undefined array key 1 in Drupal\gtranslate\Plugin\Block\GTranslateBlock->build() (line 373 of modules/contrib/gtranslate/src/Plugin/Block/GTranslateBlock.php).
    Drupal\gtranslate\Plugin\Block\GTranslateBlock->build() (Line: 171)
    Drupal\block\BlockViewBuilder::preRender()
    call_user_func_array() (Line: 113)
    Drupal\Core\Render\Renderer->doTrustedCallback() (Line: 886)
    Drupal\Core\Render\Renderer->doCallback() (Line: 431)
    Drupal\Core\Render\Renderer->doRender() (Line: 503)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 513)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 113)
    __TwigTemplate_747765aa29738ca8d9971f9a1a79fe2e->doDisplay() (Line: 461)
    Twig\Template->yield() (Line: 416)
    Twig\Template->display() (Line: 431)
    Twig\Template->render() (Line: 53)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 490)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 513)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 119)
    __TwigTemplate_fdb176904433d2770118aead93af4714->doDisplay() (Line: 461)
    Twig\Template->yield() (Line: 416)
    Twig\Template->display() (Line: 431)
    Twig\Template->render() (Line: 53)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 490)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 158)
    Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 637)
    Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 153)
    Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse() (Line: 90)
    Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray()
    call_user_func() (Line: 111)
    Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch() (Line: 186)
    Symfony\Component\HttpKernel\HttpKernel->handleRaw() (Line: 76)
    Symfony\Component\HttpKernel\HttpKernel->handle() (Line: 53)
    Drupal\Core\StackMiddleware\Session->handle() (Line: 48)
    Drupal\Core\StackMiddleware\KernelPreHandle->handle() (Line: 28)
    Drupal\Core\StackMiddleware\ContentLength->handle() (Line: 32)
    Drupal\big_pipe\StackMiddleware\ContentLength->handle() (Line: 201)
    Drupal\page_cache\StackMiddleware\PageCache->fetch() (Line: 138)
    Drupal\page_cache\StackMiddleware\PageCache->lookup() (Line: 87)
    Drupal\page_cache\StackMiddleware\PageCache->handle() (Line: 50)
    Drupal\ban\BanMiddleware->handle() (Line: 48)
    Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle() (Line: 51)
    Drupal\Core\StackMiddleware\NegotiationMiddleware->handle() (Line: 36)
    Drupal\Core\StackMiddleware\AjaxPageState->handle() (Line: 51)
    Drupal\Core\StackMiddleware\StackedHttpKernel->handle() (Line: 741)
    Drupal\Core\DrupalKernel->handle() (Line: 19)
    
  • Warning: foreach() argument must be of type array|object, null given in Drupal\gtranslate\Plugin\Block\GTranslateBlock->build() (line 397 of modules/contrib/gtranslate/src/Plugin/Block/GTranslateBlock.php).
    Drupal\gtranslate\Plugin\Block\GTranslateBlock->build() (Line: 171)
    Drupal\block\BlockViewBuilder::preRender()
    call_user_func_array() (Line: 113)
    Drupal\Core\Render\Renderer->doTrustedCallback() (Line: 886)
    Drupal\Core\Render\Renderer->doCallback() (Line: 431)
    Drupal\Core\Render\Renderer->doRender() (Line: 503)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 513)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 113)
    __TwigTemplate_747765aa29738ca8d9971f9a1a79fe2e->doDisplay() (Line: 461)
    Twig\Template->yield() (Line: 416)
    Twig\Template->display() (Line: 431)
    Twig\Template->render() (Line: 53)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 490)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 513)
    Drupal\Core\Template\TwigExtension->escapeFilter() (Line: 119)
    __TwigTemplate_fdb176904433d2770118aead93af4714->doDisplay() (Line: 461)
    Twig\Template->yield() (Line: 416)
    Twig\Template->display() (Line: 431)
    Twig\Template->render() (Line: 53)
    Twig\TemplateWrapper->render() (Line: 33)
    twig_render_template() (Line: 348)
    Drupal\Core\Theme\ThemeManager->render() (Line: 490)
    Drupal\Core\Render\Renderer->doRender() (Line: 248)
    Drupal\Core\Render\Renderer->render() (Line: 158)
    Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 637)
    Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 153)
    Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse() (Line: 90)
    Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray()
    call_user_func() (Line: 111)
    Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch() (Line: 186)
    Symfony\Component\HttpKernel\HttpKernel->handleRaw() (Line: 76)
    Symfony\Component\HttpKernel\HttpKernel->handle() (Line: 53)
    Drupal\Core\StackMiddleware\Session->handle() (Line: 48)
    Drupal\Core\StackMiddleware\KernelPreHandle->handle() (Line: 28)
    Drupal\Core\StackMiddleware\ContentLength->handle() (Line: 32)
    Drupal\big_pipe\StackMiddleware\ContentLength->handle() (Line: 201)
    Drupal\page_cache\StackMiddleware\PageCache->fetch() (Line: 138)
    Drupal\page_cache\StackMiddleware\PageCache->lookup() (Line: 87)
    Drupal\page_cache\StackMiddleware\PageCache->handle() (Line: 50)
    Drupal\ban\BanMiddleware->handle() (Line: 48)
    Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle() (Line: 51)
    Drupal\Core\StackMiddleware\NegotiationMiddleware->handle() (Line: 36)
    Drupal\Core\StackMiddleware\AjaxPageState->handle() (Line: 51)
    Drupal\Core\StackMiddleware\StackedHttpKernel->handle() (Line: 741)
    Drupal\Core\DrupalKernel->handle() (Line: 19)
    

Got Questions About Our Future? Start here.


You are the faces and voices of the District, and we know riders, family, and community members are asking you about our financial outlook: from the size of the deficit to what’s driving it and what comes next. You also deserve transparent and accurate information about what might happen to your jobs if using a Contingency Service Plan becomes necessary.

To help you, District leadership has prepared this clear Frequently Asked Questions (FAQ) website covering our financial challenges, what we’re doing to keep the service running strong, and what we're doing to secure the funding that will protect jobs.

When you have the facts, you can help keep our riders and communities informed, as well.

We also want to hear your ideas. If you have questions or feedback, please reach out to us at ideas@actransit.org. That mailbox is actively monitored by AC Transit leadership. We know it can be stressful to do an excellent job while wondering about your future. So, we want to provide you with trusted information and prevent rumors before they start.

Why is the District facing a financial crisis now?

It’s a simple question with complex answers. The COVID relief funding from the federal government that sustained our service through the pandemic is now gone. At the same time, costs of operating our service are going up. Fuel, parts, and bus production are getting more expensive, faster than our revenue is growing. Also, paying fair wages and providing the benefits you value has become more expensive, but it’s very important to us. We also all know about the struggle to enforce fares. It is important to note that although ridership patterns have shifted, neither AC Transit nor any transit agency is sustained through fares alone. So, with costs going up without more money coming in, we face unavoidable service cuts. That could mean cutting service up to 16% and potential layoffs impacting as many as 300 employees.

How significant is the deficit?


Just like you’ve seen with groceries, gas, and going out to eat, the District’s costs are growing faster than our revenue every year. When expenses rise faster than funding improvements, the gap grows between the cost of serving our riders and the money we have to do it. Without new, reliable funding, AC Transit will continue to face large budget shortfalls over at least the next five years. This is what that looks like:


• July 1, 2026 – June 30, 2027 (FY 27): $60 million gap
• July 1, 2027 – June 30, 2028 (FY 28): $43 million gap
• July 1, 2028 – June 30, 2029 (FY 29): $53 million gap
• July 1, 2029 – June 30, 2030 (FY 30): $48 million gap
• July 1, 2030 – June 30, 2031 (FY 31): $53 million gap

Didn't the District receive a state loan to cover the deficit?

Yes. We are grateful to the State of California and Governor Gavin Newsom, the Metropolitan Transportation Commission (MTC), and the people of California for advancing a $590 million “bridge loan” to Bay Area transit agencies, including AC Transit, BART, Caltrain, and SFMTA/MUNI. Under the bridge loan, AC Transit has access to up to $55 million for operations. This will help close our $60 million budget gap for FY 2027 and avoid immediate cuts. But it is not a long-term solution. Importantly, this funding is not a handout. It is a loan. We have to pay it back. For two years, we only have to pay the interest, but after that, we have ten years to pay the whole thing back.

Why aren't we being more efficient, like reports say we should?

We have made cuts to non-service spending. In fact, we cut 9 percent of our budget just last year. Staff at the GO have gone through every part of our budget, along with the Board, to find every penny we can save. We’re going to keep doing that. We have done it all while preserving service. We know that relying on service cuts to close a growing deficit is a short-sighted and unbalanced approach. The District received approval to temporarily change the way we make pension payments in FY 2026–27 and repay the difference later with interest, easing short-term budget pressure. We’re only hiring for critical roles that directly support service. We are reducing reliance on outside professional services. The use of temporary employees has been scaled back, saving up to $2 million each year. We are also leveraging cooperative contracts with the state and other public agencies to buy things cheaper, stretching every dollar further.

If we don’t get more funding, though, there isn’t anything else we can cut that won’t impact service. Efficiency is great for doing more with what you’ve got. But, if no more funding comes in, we’re going to have to do as much as we can with a lot less.

Are service and job cuts already underway?

No.

Until at least January 2027, jobs are safe, service is safe, and our system is safe. You may have heard about the worst-case plan presented to the Board in June. Officially, it is called the Contingency Service Plan. It is important to understand it does not cut service now. Instead, it’s a planning tool for the worst-case scenario. It gets us ready to react if no long-term funding solution is secured by the end of 2026. The plan does make that possibility clearer. We created it because if we get to the end of this year, and the worst happens, we can’t start planning then. Because our system is so complex, because we serve so many people, and because costs are rising faster than revenues, that possible deficit is forcing tough decisions now, not later.

Learn more about the Contingency Service Plan here.

What's the plan for service if the District does not secure funding?

Service cuts will hurt all of us. It will hurt our riders. It will devastate the economy of the Bay Area. However, service cuts are part of the Contingency Service Plan, approved by the Board of Directors, and we must be prepared to carry them out if a sustainable funding source does not materialize.

Right now, we are focused on letting our workers and the public know what the impacts would look like. The plan is based on a projected $200 million deficit over the next four years. That translates to an annual funding gap of at least $50 million, beginning in 2027. To help close the gap, the agency would need to reduce service by 16% and could lay off up to 300 employees.

Those layoffs would be horrible, and they would be the result of AC Transit completely reshaping our service. Fewer buses every hour, running fewer days, serving fewer riders.

When could service cuts take effect?

The Board will consider service reduction options at its meeting on August 12, 2026, at 5 pm. If we were forced to use the Contingency Service Plan, changes would take effect in June 2027, following a required public hearing process.

How does the Realign network fit into talks of service cuts?

We are not starting over. We are working to protect what works, even as financial pressure continues to grow. That means preserving the Realign network, which prioritizes communities most reliant on transit. We want to preserve as much as we can because ridership has grown. Our weekend ridership particularly has skyrocketed. Every employee helped launch Realign in summer 2025 and it was no simple task: 123 of 130 bus lines were updated or redesigned to reflect how people travel today.

Realign-designed service carries more than 3 million people every month and was shaped by years of input from frontline employees, community members, and riders. We have to protect it as much as we can.

Did the District prepare for this crisis?

Yes, we did prepare. In fact, we put money in the bank, building funding reserves (i.e. savings), but they’re temporary and will not last beyond this year. Here’s what’s driving our crisis: The federal government began warning as early as 2021 that all transit agencies could face a “fiscal cliff.” AC Transit took that warning seriously from the start, slashing non-service spending by more than $9 million and saving cash. We then tracked how changing ridership patterns were reshaping transit revenue here and nationwide. We also monitored the state and local governments, and their declining revenues. Yet at the same time, our mandatory costs, like new buses, parts, and fuel skyrocketed, beyond normal inflation. Bottom line: shifting commute habits, higher costs, and less funding now mean the District is in long-term crisis. Unfortunately, AC Transit does not stand alone. Across the country, for agencies big and small, state and local funds that power American transit have not consistently adjusted to these changes in costs. We’re doing everything possible to operate at the lowest cost through internal cuts. At this point, there are no additional spending cuts without impacting service.

What happens when our costs rise but revenue doesn't?

You get the situation where we find ourselves now. Fuel is more expensive than ever. Buses cost more to make for a number of reasons. While the parts needed to service our buses can be more expensive, AC Transit is already working hard to save money long-term by steadily modernizing our fleet. Newer buses are more reliable and require less frequent maintenance, which means we actually need fewer parts each year than the year before.

It's important to remember, many of our cost increases are unavoidable.

What are riders not seeing in the cost of service?

Labor costs are the largest part of our budget. Those costs have been rising because living in America has gotten more expensive. However, other costs of running transit are climbing fast. Maintenance isn’t just expensive, it’s surging. Utilities are up. Insurance and claims are rising. Fuel costs have jumped 20%, and bus parts are up 14%. These are not optional expenses. They are the cost of keeping buses safe and in service.

At the same time, we have an aging fleet. A transit bus has a lifespan of about 12 years, and the cost to manufacture one has gone up by 35% in just the past two years. The zero emission buses (ZEBs), like our battery electric and hydrogen fleet, are getting even more expensive, even faster. Replacing buses is not a choice. It is essential. A significant portion of our fleet is now nearing the end of that lifecycle. This is not just about whether we can afford to run service today. It is about whether we can sustain reliable service tomorrow. We also face mandates by the state of California that we increase ZEB service. Unfortunately, California has not provided the funding needed for transit agencies to meet its zero-emission fleet mandate. AC Transit, however, has led the nation in converting our fleet to battery-electric and hydrogen powered buses, which dramatically decreases greenhouse gas pollution. However, even necessary investments introduce cost pressures: ZEBs are more expensive to buy, fuel, and operate.

What's being done about sustainable and long-term funding?

California has already taken a major step. In 2025, the State passed Senate Bill 63, also known as the Connect Bay Area Act, and it was signed into law by Governor Newsom.

• The law authorizes a regional transit funding measure to be placed on the November 2026 ballot in five Bay Area counties: Alameda, Contra Costa, San Francisco, Santa Clara, and San Mateo.
• If 50 percent of voters (plus one!) approve it, the measure would create a 14-year sales tax – a half-cent in most counties and one cent in San Francisco. That extra half-cent or penny is estimated to generate about $980 million annually to support public transportation.
• Most of that funding would go toward keeping transit service running, including buses, trains, and ferries, along with investments in local improvements and the rider experience. If voters approve it, AC Transit is estimated to receive approximately $52 million annually to help sustain service.

View the Metropolitan Transportation Commission (MTC) SB63 Fact Sheet.

What is the District doing to maximize efficiencies and increase revnues?

The District continues to be a good steward of public funds. In fact, our prudent financial management has resulted in consistent S&P AA+ credit ratings. Credit agencies think we are doing a good job because they see us being as efficient as we can and reducing non-essential expenditures.

We’re exploring every responsible way to strengthen revenues, including the farebox. Our transit district has taken a careful, measured approach to fares over many years. In fact, AC Transit’s first fare increases in six years took effect last summer. A second increase went into effect on July 1, 2026, alongside a new public campaign reminding everyone of the critical importance of paying the fare on every bus, every ride. Our focus is on reducing fare evasion and reinforcing a culture of shared responsibility. Our public messaging will emphasize the importance of paying the fare, alongside expanding fair and equitable enforcement. We are also looking at more aggressive steps we can take to make sure that everyone who gets on our buses pays their “fare” share!

We are increasing ridership through our institutional pass programs such as EasyPass, which offers group transit benefits for businesses, schools, and residential communities. Such programs expand ridership to new populations, increase the District’s visibility in business and stakeholder communities, and significantly reduces carbon emissions in the service area.

The District is also focused on our North Star: safety. A safe ride is a better ride, but it’s also a ride that saves us money. In recent years, we’ve documented that unsafe conditions are increasing financial liabilities.

So, we are refocusing on Safety and Security, to ensure that our riders and frontline staff return home safely, each day. This is not only an imperative but a cost savings.

Both the leadership and Board of AC Transit are constantly on the lookout for new, consistent revenue enhancements that can stabilize our budget. We look forward to creating opportunities for innovations and improving efficiency to make AC Transit an even better value for the East Bay.

What can I do to help improve the future of the District?

The most important thing AC Transit can do is to continue delivering the amazing service that has made us the most important transit agency in the Bay Area for our riders. You are already a great team, so that just means coming to work every day you are scheduled, ready to do your part in delivering that service. Showing our community how much we value them, and how much value we add to their everyday lives, is absolutely critical. When our buses are maintained well, kept clean and get there on time, every time, it makes the whole East Bay better. On the other hand, when service isn’t run, the people who depend on us miss the chance to visit with their families, to get to work, or to get to an important doctor’s appointment. The less that happens, the better our shared future will be!

Resources