Technical Debt: What It Is, What It Costs, and How to Pay It Down
Every shortcut ships twice: once as speed, again as interest. Here is how to name it, price it in dollars per day, rank it without vibes, and pay it down on a schedule your CFO understands.
What technical debt actually is
Technical debt is the future cost of a shortcut you took in the past. Ward Cunningham coined the metaphor: ship fast now, pay interest later in slower changes and more bugs. Not all debt is bad — sometimes you borrow on purpose to hit a deadline. The problem is untracked debt, which compounds silently.
The three types
- Deliberate debt. "We hard-code this to ship Friday, refactor next sprint." Fine — if you write it down with an owner and a date.
- Accidental debt. The design that made sense for 3 developers and breaks at 15. Duplicated logic, god classes, missing tests.
- Bit-rot debt. Code that was fine but the world moved: outdated dependencies, deprecated APIs, a TODO from 2021 nobody owns.
A classic specimen: auth.ts:142 TODO since 2021. Three lines everyone is afraid to touch. That is the unit of analysis for the rest of this post: one item, with an estimated fix cost and a daily cost of waiting.
What it costs: principal + interest per day
Stop arguing about "a lot of debt" vs "a little." Price it like a loan:
principal = estimated hours × team hourly rate
daily carrying cost = principal × APR ÷ 365
The APR (default 12%, tunable) models drag: slower changes, bugs, onboarding tax. It is an estimate — always shown with a ~ and a range, never a false promise.
Worked example
Say you have 25 open items averaging 8 hours each at a blended $75/h:
- Total effort: 25 × 8 = 200 h
- Principal: 200 × $75 = ~$15,000
- Daily burn: $15,000 × 0.12 ÷ 365 = ~$4.93/day
- Yearly carry if untouched: ~$1,800/yr
- Fixing the top 30% saves roughly ~$540/yr — every year.
Suddenly "someday" becomes "this sprint saves $540/yr." That is the sentence that unlocks refactoring budget.
Run your own numbers with the same formula — 30 seconds, nothing leaves your browser.
Price your debt in 30sHow to fix it: the 4-step payoff loop
1. Inventory everything in one place
Pull TODOs, GitHub issues, and hallway complaints into a single list with severity, owner, and area. Dedupe by URL. A CSV import or GitHub sync beats a spreadsheet because every change gets an audit trail instead of a broken formula. (See the product tour for what that inventory looks like.)
2. Score every item 0–100, transparently
Gut feel doesn't survive a budget meeting. Score each item as a weighted average so anyone can follow the rationale:
| Factor | Weight | How it maps to 0–1 |
|---|---|---|
| Severity | 25 | critical 1.0 · high 0.75 · medium 0.45 · low 0.2 |
| Risk | 20 | (level − 1) ÷ 4 |
| Dev impact | 20 | (level − 1) ÷ 4 |
| Business impact | 15 | (level − 1) ÷ 4 |
| Customer impact | 8 | (level − 1) ÷ 4 |
| Frequency | 7 | (level − 1) ÷ 4 |
| Age | 5 | 0.1 → 1.0 from <30 to 365+ days |
score = round( Σ weight × value ÷ Σ weights × 100 ). A 57 "because severity is medium and risk and business impact drive it" beats "because I said so" every time. Allow a manual override per item — then log it.
Drag the sliders and watch the score break down by factor — same weights as the app.
Try the 0–100 score3. Plan against real capacity
Sort by score, then slice by weekly paydown capacity: payoff_weeks = ceil(total_hours ÷ hours_per_week). At 10 h/week, that 200-hour backlog is 20 weeks. Publish 30/60/90-day slices with planned effort and projected annual savings. Flag oversized items so they surface instead of stalling the plan.
4. Report ROI like a CFO reads it
One page: starting principal, daily burn eliminated, hours resolved, annualized savings, what's left. "We fixed the top 3 burners and cut $540/yr of carry" funds next quarter's paydown. Keep a Value Delivered ledger so the win compounds.
What doesn't work
- Spreadsheets alone. Manual formulas, no history, easy to share the wrong version.
- Ticket trackers alone. Jira and Linear track tickets, not debt value — no carrying cost, no payoff plan.
- Smell-counts alone. Linters flag code smells with rule-based minute estimates teams distrust — and still can't answer "what does waiting cost?"
- Doing nothing. The interest accrues whether you model it or not.
Where RefactorIQ fits
I built RefactorIQ to automate the loop above without giving up privacy: a local-first desktop app for Windows and Linux that prices each item in hours and dollars, ranks it 0–100 with a plain-language rationale, builds the 30/60/90-day plan against your capacity, and exports the executive report. Your data lives in a SQLite database on your machine — no account, no telemetry, works fully offline. Start with the Free Demo (10 items, no expiry), then a 15-day Pro trial when you're ready.
The honest bit: every money figure is an estimate. Use the ranges to prioritize and negotiate — not as an invoice.
Your Monday-morning checklist
- List your top 10 debt items with optimistic/likely/pessimistic hours.
- Price each: hours × rate, then daily burn at your APR.
- Score each 0–100 with the table above.
- Fix the highest scorer first; log the savings.
- Bring the one-page ROI to planning. Repeat weekly.
Skip the spreadsheet — track it for real. Free Demo, 15-day Pro trial, no account.
Download RefactorIQOnce you can name the type, price it per day with the team formula and roll it to an annual burn rate before you sequence the 30/60/90-day payoff.
FAQ
How do you calculate the cost of technical debt?
Estimate fix hours, multiply by your team's hourly rate to get the principal, then apply daily carrying cost = principal × APR ÷ 365 (default 12%). Example: 25 items × 8h × $75 ≈ ~$15,000 principal ≈ ~$4.93/day. Try it on the debt calculator.
How do you prioritize technical debt?
Score every item 0–100 as a weighted average of severity, risk, dev/business/customer impact, frequency, and age — then fix the highest scorers first. Experiment with the live score demo.
How do you convince management to approve refactoring?
Translate debt into dollars per day plus annualized savings, and attach a 30/60/90-day plan with real capacity. “This sprint saves $540/yr” wins budgets that “the code is messy” never will — export it as a one-page executive report.
Is SonarQube enough to manage technical debt?
SonarQube finds code smells, but teams often distrust its minute estimates and still can't answer what waiting costs. Pair detection with hour estimates, business-impact scoring, and a payoff plan — see how RefactorIQ compares.