FinTech

When Technical Debt Becomes Financial Debt

The debt metaphor is better than the people using it realise. Debt has a principal, an interest rate, and a maturity — and the only one of those most teams ever discuss is the principal, which is the least important of the three.

Published May 26, 20269 min readUpdated May 26, 2026

Written by · Full-Stack Agentic AI Software Engineer — AI Agents, Automation & Revenue Systems for GTM/RevOps teams

In brief

When does technical debt stop being an engineering concern and become a financial one, and how do you make that case?

It already is one, and the metaphor is more precise than most people using it realise. Real debt has three properties: a principal, which is the work needed to fix it; an interest rate, which is the ongoing tax it levies on every change nearby; and a maturity, which is the point at which it must be dealt with regardless. Teams argue almost exclusively about the principal — how long the refactor would take — which is the least decision-relevant of the three, because the principal is a one-off and the interest recurs forever. Stripe's survey found 13.5 hours of an average 41.1-hour developer week going to technical debt and another 3.8 to fixing bad code, roughly 42%, which is what a large accumulated interest payment looks like. The accounting convention makes this invisible: engineering salaries are booked to R&D as operating expense rather than to cost of goods sold, so a crushing maintenance burden never appears in gross margin. The way to make the case is to stop describing the code and start quantifying the interest.

  • Debt has a principal, an interest rate and a maturity; teams argue about the principal, which is the only one that does not recur
  • The interest is measurable without any new tooling — estimate inflation on work touching the affected area, review rounds, incident frequency
  • Stripe's ~42% of the developer week is what a large accumulated interest payment looks like at industry scale
  • Accounting hides it: engineering salaries sit below the gross margin line, so maintenance burden never shows up as a cost of serving customers
  • Not all debt should be repaid — debt on code that is stable, isolated and about to be deleted is genuinely free, and saying so is what makes the rest of your argument credible

Evidence notes

Stripe / Harris Poll, 'The Developer Coefficient' (2018)

In an average 41.1-hour developer week, 13.5 hours went to addressing technical debt and 3.8 hours to fixing bad code — about 42% of the week — which the report costed at roughly $85 billion in annual global opportunity cost. A survey rather than instrumented measurement, so treat the precise share as directional.

GitClear code quality analysis

Copy-pasted lines rose from 8.3% of changed lines in 2020 to 12.3% in 2024, while refactored 'moved' lines fell from 24.1% to 9.5% — the first year on record in which within-commit copy/paste exceeded moved code. Block duplication per million changed lines climbed from 40.3 in 2023 to 73.0 year-to-date in 2026. Duplication is principal being added while repayment falls.

DORA 2025, State of AI-assisted Software Development

AI adoption correlates with higher delivery throughput and higher delivery instability simultaneously. Rising change-failure rate against rising throughput is one of the cleaner observable signals that interest is being paid rather than principal repaid.

Benchmarkit 2026 SaaS Benchmarks (342 companies)

Software businesses are generally expected to hold gross margin above roughly 75%, with cost of goods sold covering hosting, third-party services and support. Engineering salaries conventionally sit in R&D below that line, which is the accounting reason maintenance burden is invisible in the headline margin.

Richard I. Cook, 'How Complex Systems Fail'

Observation 3: catastrophe requires multiple failures, single-point failures are not enough. Accumulated debt raises the number of latent contributing faults present in a system at any moment, which is the mechanism by which debt converts into incident frequency rather than merely into slower delivery.

Continue with purpose

Ward Cunningham's debt metaphor has been repeated so often that it's stopped carrying information. Most people using it mean roughly "code I don't like, that I would like time to change."

Taken literally, though, it's precise and useful. Debt has three properties, not one, and knowing which you're talking about changes the entire conversation.

Property

In finance

In a codebase

Principal

The amount borrowed

The work required to fix it properly. A one-off

Interest rate

What you pay to keep carrying it

The tax on every change that touches the affected area. Recurs forever

Maturity

When it must be settled

The event that forces the issue: an audit, a scaling limit, a dependency going unsupported

Now notice which one every technical debt discussion is actually about. "How long would the refactor take?" is a question about principal — and principal is the least decision-relevant of the three, because you pay it once and then stop, whereas interest is paid every sprint until you do.

Nobody decides whether to pay off a loan by asking only how large it is. They ask what it's costing to carry. Engineering discussions almost never ask that, and then wonder why they lose.

How do you actually measure the interest?

You don't need new tooling, and this is the part most teams skip because it feels like it should be hard.

  • Estimate inflation. Take work touching the affected area and compare estimate to actual against work elsewhere. A consistent multiple is your interest rate, expressed in the unit your organisation already plans in

  • Review rounds per pull request. Changes in a difficult area need more passes, and this is already recorded in your tooling

  • Incidents attributable to the area, and mean time to resolve them. Cook's point about multiple contributing faults is the mechanism — debt raises the number of latent faults available to combine

  • Onboarding time to first meaningful change in that area, against elsewhere. This one is expensive to measure and very persuasive, because it prices the knowledge concentration nobody wants to admit to

  • Work declined. The features not attempted because touching that module is too risky. Hardest to quantify, and frequently the largest term

The first is the one to start with. "Work in this module takes about twice as long to deliver as work elsewhere, and here are the last twelve tickets" is a sentence a non-technical manager can act on, and it required no new instrumentation — only that somebody bothered to look. There is a whole operational layer above technical debt that XenGrowth's growth operations team documents.

Stripe's survey gives the industry-scale version: 13.5 hours of a 41.1-hour week on technical debt plus 3.8 on bad code, roughly 42%. It's self-reported and I'd hold the exact figure loosely, but as an order of magnitude it tells you what a large accumulated interest payment looks like across a profession. For the the operations side of this angle, see The XenGrowth resource library.

The accounting reason nobody sees it

There's a structural explanation for why this cost stays invisible to the people allocating budgets, and it isn't indifference.

On a profit and loss statement, hosting and support sit in cost of goods sold, above the gross profit line. Engineering salaries sit in R&D, below it, as operating expense. So the entire cost of maintaining a system — the 42% — is recorded as investment in building the product rather than as a cost of running it.

The consequence is that a product with a crushing maintenance burden reports an excellent gross margin, indefinitely, with no line anywhere on the statement that gets worse as the debt accumulates. The convention isn't wrong — building a product genuinely is an investment — but it means the statement is structurally blind to the thing your team lives with every day, and no amount of financial reporting will surface it. For the AI agents and marketing automation angle, see XenGrowth on AI agents and marketing automation.

Which means somebody has to say it out loud, in numbers, or it will not be represented at all.

The kinds of debt, and why they behave differently

Cunningham's original metaphor described something narrower than the way it is used now. He meant deliberately shipping a design you knew was not quite right in order to learn from real usage, then paying it back once you understood the domain properly. That is a genuine engineering strategy and it works — the debt is taken knowingly, for a return, with an intention to repay.

Most of what gets called technical debt is not that. It is the residue of decisions made with less information than the people making them realised they lacked, or of deadlines met by deferring work nobody wrote down. Distinguishing the two matters because they respond to different treatment: deliberate debt has a known shape and a plan attached, and accumulated residue has neither, which is why an inventory is usually the first useful thing anyone does.

A third category is worth naming separately because it is the one that actually causes crises. Some debt is not a quality problem at all — it is a bet on an assumption that has since stopped being true. A schema that encoded a business rule which changed, an integration built around a partner's API that has been deprecated, a scaling design premised on traffic patterns that no longer hold. This is not messy code and no amount of tidying addresses it. It is a structural mismatch between what the system assumes and what the world now does, and it tends to surface suddenly rather than gradually.

The practical value of separating these is that they argue differently. Deliberate debt argues on its original terms: we said we would come back to this, here is the return we got, here is the bill. Residue argues on interest, which is the measurement work above. Structural mismatch argues on risk and on maturity, because its cost is not a steady tax but a discontinuity waiting for a trigger.

Not all debt should be repaid

This is the part that makes the rest of your argument credible, and it's the part engineers most often skip.

Debt on code that is stable, isolated and rarely touched has an interest rate near zero. Ugly code that nobody modifies costs nothing to carry, regardless of how much it offends you. Debt in a module scheduled for deletion in six months should never be repaid — you would be paying principal on a loan about to be forgiven.

Situation

Interest rate

What to do

Ugly, stable, nobody touches it

≈ Zero

Nothing. Leave it alone and stop mentioning it

Messy, changed every sprint

High and compounding

Repay. This is where the whole argument lives

Fine now, approaching a scaling limit

Zero, but a maturity date

Schedule it against the date, not against how it feels

Unsupported dependency, working

Zero until a CVE, then infinite

Treat as a maturity, not as debt. It is a deadline

Duplicated in five places

Rising — GitClear's measured trend

Repay before the fifth copy diverges from the other four

Bad, but in a module being deleted

Irrelevant

Nothing. Paying it is pure waste

Being the engineer who says "that one isn't worth fixing" is what buys you credibility when you say the next one is. A team that describes all of its code as debt is not making an argument, it is expressing a preference, and finance can tell the difference. XenGrowth on AI search, GEO and discovery approaches this from the AI search, GEO and discovery side.

How to say it so it lands

The translation is mechanical once you have the interest figure. Stop describing the code, which asks for trust; describe the effect, which asks for a decision.

  1. Lead with the interest, in local units. "Work in billing takes about twice as long as equivalent work elsewhere" — with the tickets to back it — beats any description of the code

  2. Name the principal as an investment with a payback period. "Six weeks of work, and we recover that in about eight months of avoided drag" is a proposal in a form they already evaluate

  3. State the maturity if one exists, and be honest when it doesn't. A real deadline — a dependency going end-of-life, a scaling limit with a date — is the strongest argument available and is squandered by being mixed in with preferences

  4. Show what it is blocking. Work declined because a module is too dangerous to touch is usually the largest cost and the one nobody has written down

  5. Bring the list of debt you are recommending against fixing. This is the step that makes the whole thing credible, and it is free

One thing to watch for in the current environment: GitClear's numbers show duplication rising while refactoring collapses, which means principal is being added faster while repayment falls. If that pattern holds inside your own repository — and it is straightforward to check — then the interest rate on your codebase is rising, and an argument you lost last year is worth making again with this year's numbers.

Further reading from XenGrowth

Where this work meets go-to-market

Working on technical debt inside a commercial team? the XenGrowth practice publishes operator guides on the revenue side of this work.

And if you take one habit from this, make it the inventory rather than the argument. A list of your team's debt with an estimated interest rate against each item, reviewed quarterly, converts an ongoing complaint into a managed position — and it means that when a maturity date does arrive, you are the person who saw it coming rather than the one explaining afterwards why nobody did.

Apply this article

How to turn insights into execution

A practical sequence for teams turning concepts into production outcomes.

Technical DebtBusinessFinanceEngineering ManagementCareersCommunicationfinance

Audit your current state

Map the bottlenecks and constraints connected to the article’s core problem.

Choose one bounded change

Test the most useful recommendation on one workflow before widening the scope.

Measure what changed

Keep the parts that improve the work, document what failed, and make the next decision from evidence.

Next step

Need help applying this in your stack?

I can translate these patterns into a concrete implementation plan for your team.

Discuss implementationBack to blog

Replies usually within 24 hours.

Next Steps

Continue reading

How to Calculate the Business Value of Engineering Work

There are only four places business value can come from, and knowing which one you're claiming does most of the work. The commonest mistake isn't bad arithmetic — it's claiming a benefit in a category the work doesn't actually touch.

Navigate

ARR, MRR, CAC, LTV and Churn, Explained for Engineers

Not a glossary. Each of these is a rate, a ratio or a stock, they compose in specific ways, and most of the arguments you'll hear in a planning meeting are people disagreeing about a denominator. Including the famous 3:1 rule, which its own author says he explained badly.

Navigate

Technical Excellence Without Business Impact Falls Flat

This is not an argument that craft doesn't matter. It's an argument that craft is an input, and that engineers routinely present inputs as though they were outcomes — then conclude the business doesn't value quality when it declines to fund one.

Navigate

The Cloud Bill Nobody Owns

Infrastructure cost sits in a gap: finance can see it but can't change it, engineering can change it but doesn't see it, and nobody's performance review mentions it. That's an ownership problem wearing a technical costume.

Navigate

A Dollar Saved Is Worth More Than a Dollar Earned

At a 20% net margin, saving a dollar of cost does the same for profit as earning five dollars of revenue. Engineers are usually the only people in the building who can save dollars unilaterally — and almost nobody frames the work that way.

Navigate

Engineering Decisions That Quietly Hurt Growth

None of these look like mistakes. Each is a defensible call that a competent engineer would make — and each puts a ceiling on something commercial that nobody will trace back to a design review eighteen months later.

Navigate
  • How Much Revenue Can One Engineer Actually Influence?

    More than most engineers think and less than the 10x stories claim. The useful version isn't a multiplier — it's four specific channels, each with a formula, and knowing which ones your job actually gives you access to.

  • What Unit Economics Means for Engineering Decisions

    Unit economics asks one question: does one more customer make you better or worse off? If the answer is worse, growth accelerates the problem — and the fastest way to be wrong about it is to average a cost that isn't evenly distributed.

  • How to Read a P&L, for Software Engineers

    A profit and loss statement is a system with about eight components and a strict order of operations. You already read stack traces. This is easier — and it tells you which of your arguments will land and which are structurally unanswerable.

  • Why Engineers Should Learn FinOps

    FinOps is usually sold as cost-cutting, which undersells it and explains why engineers ignore it. It's actually a feedback-loop problem: cloud spend is the only significant engineering decision with no signal attached, and everything else follows from that.