The go-to resource for upgrading Ruby, Rails, and your dependencies.

How to Convince Your CTO to Budget for a Rails Version Upgrade


A pragmatic guide for engineering leaders on translating technical debt into business risk to secure budget for Rails upgrades.

The Abstract Nature of Technical Debt

In the early 20th century, factory owners often deferred routine maintenance on their steam engines to keep production lines running without interruption. The short-term benefit was apparent: uninterrupted output. The long-term cost, however, was catastrophic failure. The engine wouldn’t merely stop; it would take the factory floor down with it. Eventually, industrialists realized that scheduled, predictable downtime for preventative maintenance was far cheaper than replacing an exploded boiler. Software engineering, strictly speaking, does not rely on steam pressure — but the principles of deferred maintenance apply the same.

Before we get into the mechanics of securing a budget, though, let’s take a step back and look at the core conflict. As engineers, we feel the friction of an outdated codebase every day. We see the deprecation warnings, we fight with incompatible gems, and we watch our continuous integration pipelines slow to a crawl. To a Chief Technology Officer (CTO) or a finance department, however, a Ruby and Rails Upgrade often looks like a massive expense that delivers exactly zero new features to the end user.

The challenge is that technical debt is inherently abstract. Arguing that an upgrade is necessary because a framework version is old is rarely a compelling business case. To secure a predictable budget for framework modernization, we must translate abstract code rot into quantifiable business risks and economic realities.

Commoditizing Engineering Pain

CTOs and engineering leaders manage risk and allocate capital. Therefore, our first step is to frame engineering complaints into specific, searchable ailments that affect the bottom line.

There are three major approaches to making this translation; depending on the particular circumstances you find yourself in, one of them may be more effective than the other two.

The first is focusing on compliance and security. This is often the most persuasive method.

The second is quantifying the invisible bleed of developer productivity.

The third option is highlighting the direct impact on cloud infrastructure costs.

Generally speaking, the first option is the most immediate. An engineering manager may delay a performance upgrade for quarters, but a Chief Information Security Officer (CISO) will typically fund a security remediation immediately if a targeted audit reveals the stack is non-compliant.

The Compliance and Security Imperative

Running an End-of-Life (EOL) version of Ruby or Rails is not merely a technical inconvenience; it is a profound business liability. Once a framework version reaches EOL, it no longer receives security patches.

For organizations handling sensitive data, this translates directly into regulatory risk. Framework vulnerabilities — such as CVE-2023-28362 in Action Pack — are not minor engineering hurdles. They are audit findings that can cause your application to fail its next PCI DSS, HIPAA, or SOC2 compliance check. Losing a compliance certification can instantly derail enterprise contracts and damage your organization’s reputation.

By framing the upgrade as a necessary security audit and compliance remediation, you shift the conversation from a technical desire to critical business risk management. For instance, instead of vaguely stating the application is insecure, you might run a tool like bundler-audit to generate a concrete report of known vulnerabilities:

$ bundle exec bundler-audit
Name: actionpack
Version: 6.1.7.2
CVE: CVE-2023-28362
Criticality: High

Vulnerabilities found!

When you present a Chief Information Security Officer (CISO) with an automated report showing critical, unpatched CVEs in the production environment, the budget request immediately changes from a feature enhancement to an urgent compliance requirement.

The Invisible Bleed of Developer Productivity

The second approach involves quantifying how much time your team loses to framework friction. When a codebase stagnates on an old version of Rails (like Rails 5.2 or earlier), the surrounding ecosystem moves on.

As a result, developers spend increasing amounts of time dealing with incompatible gems, writing custom backports, and waiting on extremely slow CI pipelines. For example, if your engineers are spending four hours a week fixing gem dependency conflicts or waiting for outdated test suites to finish, that time is no longer available for feature development. By calculating the hourly cost of those engineers and multiplying it by the hours lost per month, you can present a concrete financial figure for what the outdated framework is actively costing the business in lost productivity.

The Economics of Cloud Infrastructure

Another highly effective way to build the business case is to look at your hosting bill. Older versions of Ruby (like 2.7) and Rails are less memory-efficient and slower than their modern counterparts.

For example, the YJIT compiler introduced in Ruby 3.1, combined with the memory allocation improvements in modern Rails 7.0, can dramatically reduce the resources required to run your application. We often see that upgrading legacy applications directly cuts cloud infrastructure costs by allowing teams to downsize their compute footprints — for instance, comfortably scaling down from an AWS EC2 m5.xlarge to an m5.large without a performance penalty. When you can demonstrate that the cost to upgrade the framework will eventually be offset by a significant reduction in monthly server costs, the budget request becomes a financially sound investment rather than a sunk cost.

Presenting a Predictable Path Forward

Of course, identifying the risks is only part of the battle. The next hurdle is overcoming the fear of the rewrite. CTOs have all heard horror stories of modernization projects that dragged on for years, halted all feature development, and ultimately failed.

You must present a structured, risk-averse methodology. We need to demonstrate that a Ruby and Rails upgrade can be predictable and measured.

Instead of asking for a large, undefined budget, propose a phased approach:

  1. The Discovery Phase: Request a small budget for a technical roadmap or Tune Report. This involves using code complexity metrics to define the exact scope of the upgrade, identify technical debt hotspots, and provide a concrete estimate.
  2. Fixed-Cost Maintenance: Propose transitioning to a fixed-cost maintenance model — a systematic approach to technical debt remediation. This allows the team to execute gradual version bumps alongside regular feature work, ensuring budget predictability.
  3. Targeted Milestones: Break the upgrade into verifiable steps, such as migrating from Paperclip to ActiveStorage first, or fixing specific deprecation warnings, before attempting the major framework bump.

Building the Consensus

You might wonder: if the business case is this clear, why do upgrades still get deferred?

The answer is straightforward. Engineering teams often fail to speak the language of the business.

We cannot expect the C-suite to care about Ruby method lookup performance or frozen string literals. We must communicate in terms of risk mitigation, compliance, and capital efficiency. By connecting the technical reality of an outdated framework to the economic reality of the business, you transform the upgrade from a developer’s wish list into a strategic business imperative.

Sponsored by Durable Programming

Need help maintaining or upgrading your Ruby on Rails application? Durable Programming specializes in keeping Rails apps secure, performant, and up-to-date.

Hire Durable Programming