← All posts
Software Methodologies & Delivery

Technical Debt as a Budget Line: How to Prioritize Refactors Alongside Features

Technical debt isn't something you 'get to eventually.' It's a line in your engineering budget. I use a debt register, an interest rate calculation, and a framework to decide when refactoring is more valuable than shipping new features.

Craig Hoffmeyer8 min read

Technical Debt as a Budget Line: How to Prioritize Refactors Alongside Features

I've seen this conversation happen at every startup I've worked with:

Manager: "Why are we spending a sprint on refactoring? We should be shipping features."

Engineer: "Because this code is a mess and it's slowing us down."

Manager: "Fine. Get it done in a week. And ship a feature alongside it."

This is where technical debt bites you. Because the manager is right—you should ship features. And the engineer is also right—the debt is slowing you down. But the conversation treats it like a binary choice.

It's not. It's a portfolio decision.

Here's how I think about it: technical debt has an interest rate. Some debt is free money (doesn't slow you down). Some debt is incredibly expensive (every feature takes 2x longer). Your job is to measure the interest rate, track it, and budget accordingly.

If you spend 30% of your engineering capacity paying interest on debt, that's a budget decision. Make it explicit.

The Stakes: Why This Destroys Startups

The classic startup trajectory:

  • Year 1: Ship fast, move fast, break things. No time for refactoring.
  • Year 2: Feature velocity starts dropping. A feature that should take a week takes two weeks.
  • Year 3: Your best engineers are frustrated. "Everything is so hard." Some leave.
  • Year 4: You're stuck. You can't ship fast. You can't refactor (too risky). You're just maintaining.

The problem isn't that you took on debt. Every startup does. The problem is that you never stopped to measure the interest rate.

At Year 2, you probably have 200–300K in "lost productivity" sitting in your codebase. Engineers rebuilding the same logic. Cascading changes across multiple systems. Tests that take 20 minutes to run. Deployment procedures that are error-prone.

That's interest. And if you don't pay it down, it compounds.

But here's the thing: not all debt is worth paying down. Some of it will be replaced (that third-party integration you're considering ripping out anyway). Some is truly invisible (nobody cares, nobody touches it). Paying down that debt is waste.

The metric I use: actual slowdown on shipping new features. If the debt adds 10 hours to a 40-hour feature, that's a 25% interest rate. That's worth addressing. If it adds 2 hours, it's 5%. Maybe you live with that.

The Framework: The Debt Register

Here's how I make this real and measurable.

First, list your debt. Not philosophically—specifically. What pieces of code, infrastructure, or process are slowing you down?

Debt Register (as of April 2026)

1. Payment Processing Pipeline (Legacy)
   - Impact: Feature work requires coordination with 2 other services
   - Slowdown: ~8 hours per payment-related feature
   - Frequency: ~1 feature per 2 weeks that touches this
   - Annual Interest: ~200 hours (25% of one engineer)
   - Payoff Effort: 4 weeks of work
   - Payoff ROI: 200 hours saved ÷ 160 hours spent = 1.25x
   - Priority: High

2. Monolithic Admin Dashboard
   - Impact: Hard to find UI components, tests are brittle
   - Slowdown: ~3 hours per admin feature
   - Frequency: ~2 features per month
   - Annual Interest: ~72 hours (9% of one engineer)
   - Payoff Effort: 3 weeks of work
   - Payoff ROI: 72 hours saved ÷ 120 hours spent = 0.6x
   - Priority: Medium

3. Missing Logs for Debugging
   - Impact: Troubleshooting production issues takes 3x longer
   - Slowdown: ~5 hours per incident (happens 2x per month)
   - Annual Interest: ~120 hours (15% of one engineer)
   - Payoff Effort: 2 weeks of work
   - Payoff ROI: 120 hours saved ÷ 80 hours spent = 1.5x
   - Priority: High

4. Database Schema Without Indexes
   - Impact: Queries slow down as data grows
   - Slowdown: Currently ~1 hour per feature (getting worse)
   - Frequency: ~3 features per month
   - Annual Interest: ~36 hours (starting, will grow to 200+)
   - Payoff Effort: 1 week of work
   - Payoff ROI: 36 hours saved ÷ 40 hours spent = 0.9x (but interest rate rising)
   - Priority: Medium (monitor, will become High)

The key columns:

  • Impact: What's actually slowed down?
  • Slowdown: How many extra hours does this add to the affected work?
  • Frequency: How often do you hit this debt?
  • Annual Interest: Slowdown × Frequency × 52 weeks
  • Payoff Effort: How long to fix it?
  • ROI: Does paying it off save more time than it costs?
  • Priority: High (ROI > 1), Medium (ROI near 1), Low (not worth it)

This turns "we have technical debt" into "we're paying $200K a year in lost productivity on the payment pipeline."

The Allocation Model: 20% Refactoring Budget

Here's the move: budget a percentage of your engineering capacity for debt payoff. I use 20%.

If you have 5 engineers, that's one engineer's worth of capacity per sprint (or one engineer-week per month) dedicated to debt payoff.

This serves two purposes:

  1. It's honest. You're already paying 20%+ as interest on debt (in hidden slowdowns). Making it explicit means you're choosing to pay it off, not spending time you didn't have.

  2. It's sustainable. Developers need to feel like they're making progress on long-term fixes, not just firefighting. 20% refactoring gives them that.

The process:

  • Start each quarter with your debt register
  • Rank items by ROI and risk
  • Pick the top 2–3 items that fit in your 20% budget
  • Commit: "This quarter, we're paying down the payment pipeline and adding logging."
  • Ship those items as actual features (with PR reviews, tests, documentation)
  • Update the register with the impact
  • Repeat next quarter

Concrete Example: How We Reclaimed 35% of Velocity

I worked with a Series B SaaS company where feature velocity had dropped from 15 features/quarter to 8 features/quarter in one year. Their revenue was growing, but they couldn't ship new products fast enough to capture it.

We did a debt register audit. Found:

  1. Search infrastructure (Elasticsearch integration done in 2019, never refactored): Features involving search took 3x longer because the library was outdated and the code was tangled. Annual interest: ~400 hours.

  2. Hardcoded configuration (no environment management): Every deployment required manual config changes, increasing risk and slowdown. Annual interest: ~150 hours.

  3. No API versioning (clients breaking on every update): Every backend change required coordination with frontend, iOS, Android. Annual interest: ~200 hours.

Total annual interest: ~750 hours (about 40% of their engineering team).

Payoff effort: 8 weeks across all three.

ROI: 750 hours ÷ 320 hours spent = 2.3x. Huge.

They did it:

  • Weeks 1–2: Refactor search (new library, cleaner code)
  • Weeks 3–4: Environment management (Terraform + ENV variables)
  • Weeks 5–6: API versioning (simple URL structure, v1/v2 endpoints)
  • Weeks 7–8: Testing and cleanup

Six months later:

  • Feature velocity: back to 15 features/quarter
  • Bug reports related to these systems: down 70%
  • Deployment time: 30 minutes → 5 minutes
  • New developer onboarding: 6 weeks → 2 weeks (less context to learn)

They reclaimed almost a full engineer's worth of capacity. That's revenue.

The Counterpoint: Refactoring Can Be a Trap

Okay, I have to be honest: refactoring is also how you waste time.

I've seen engineers disappear into "architecture debt" for three months and ship nothing. I've seen teams rewrite core systems because they were "not built right," only to find out the original system worked fine—just had a few missing features.

The difference between "necessary refactoring" and "refactoring theater":

  • Necessary: You measured the slowdown, it's real, the payoff is clear
  • Theater: "The code is ugly," or "we should use a better framework," or "let's redesign this because we learned better practices"

Necessary refactoring has a deadline and a ROI. Theater is never-ending.

So here's the guard rail: You don't refactor unless it's in your debt register and the ROI is positive. If the interest rate is low (< 5%), you live with it. If the payoff effort is huge compared to the savings, you live with it.

Discipline.

Action Checklist

If you're going to turn technical debt into a real budget decision:

  • List your known debt (ask engineers: what slows you down regularly?)
  • For each item, estimate: impact (hours per feature), frequency (how often does this affect work), annual interest (impact × frequency)
  • Estimate payoff effort (how many weeks to fix it?)
  • Calculate ROI (annual interest ÷ payoff effort hours)
  • Rank by ROI (high > 1, medium ~1, low < 1)
  • Pick the top 2–3 high-ROI items for the next quarter
  • Assign ownership and a deadline
  • Treat it like a feature (requirements, tests, PR review)
  • Re-audit your debt register quarterly
  • Document the impact after you pay it down (prove the ROI)

Where I Come In

Debt management is where engineering leadership gets real. It's not about technical prowess; it's about saying, "This is worth our time," and "This is not."

I help teams build debt registers, calculate interest rates, and make portfolio decisions that maximize velocity without sacrificing quality. I've also seen teams rationalize endless refactoring; I help you stop that too.

If your feature velocity has dropped, or if your engineers feel like everything takes forever, or if you're afraid to commit to shipping timelines, let's talk. This is often the first place I look.

Related Reading

Let's audit your technical debt

Get in touch →