Technical Debt: Examples and How to Explain It
Technical debt is the work you pay for in the future for compromises made in the past. See examples, how to track it and how to explain it to your manager.
Overview & context
Every temporary solution has a planned lifespan of exactly forever. Technical debt is the extra work a team will have to do later because it chose a faster or simpler solution. Like financial debt, it unfortunately charges interest: every change to the affected code takes longer and gets more complex or riskier. Below you'll find types of technical debt with examples, a template for tracking it and a way to communicate it to management.
1. What is technical debt?
Technical debt is the gap between how your code or infrastructure looks and how it should look. Ward Cunningham coined the term in 1992 while explaining to managers at a finance company why the team had to go back to code that already worked. Martin Fowler covers the metaphor in more detail.
But not every flaw is debt. A bug is a place where the app doesn't do what it should. With debt, the app works, but every further change costs more time and carries more risk. That extra time is the interest; refactoring, an upgrade or a rewrite is the repayment.
Not all debt is taken on deliberately. It can come from a lack of knowledge or from changes in requirements, technology or the environment.
2. Types of technical debt with examples
Technical debt isn't only in the code. Grouping it by where it lives helps with planning, because each type gets paid off differently.
Martin Fowler splits debt into deliberate or inadvertent and prudent or reckless (the technical debt quadrant). If you have a plan and a deadline for paying the debt back, it's prudent, deliberate debt. Code written without knowing a better approach is inadvertent debt you only discover later.
| Type | Example | What it costs (interest) |
|---|---|---|
| Code | The same validation copied to five places | Every fix has to be made five times and one place is easy to miss |
| Architecture | Orders and invoices share one database table | A change in invoicing breaks orders |
| Dependencies | A framework version that's past end of support | No security patches and running the app gets riskier over time |
| Tests | A payment module with no automated tests | Every release needs manual payment testing |
| Documentation | Only one developer knows how to deploy | Nobody else can deploy |
| Infrastructure and build | Manual deployment by copying files to the server | Every deployment is slow and easy to get wrong |
3. Signs technical debt is slowing you down
Technical debt shows up in numbers the team often already tracks. Changes to one module keep taking longer than estimated, bugs keep coming back to the same part of the code and nobody wants to take on an upgrade because that part is inconsistent with the rest of the app.
Knowledge that only lives in someone's head is another sign. When only the author knows about a workaround or it's written in a `TODO` comment in the code, support can't tell whether a reported bug is a known issue. A new developer then runs into it on their own.
4. Documenting technical debt: what to record for each item
Technical debt documentation, or a technical debt register, is a list of problems with an estimate of their complexity, cost or time. It works best as a `tech-debt` label in your issue tracker (GitHub Issues, GitLab, Jira), where the team sees it next to regular work. A separate document outside the backlog usually stops getting updated.
Title: Payment module uses an old version of the payment gateway SDK
Labels: tech-debt, payments
Interest: a new payment method takes 4 days instead of 1; the SDK gets no security fixes
Risk: the gateway drops support for the old API version on 2027-06-30
Estimate: 3 days (SDK swap and payment tests)
When: before adding Apple Pay, planned for Q1
Recorded by: backend developer, reviewed 2026-10-285. How to pay off and reduce technical debt
You remove technical debt by bringing the affected part of the app back to a state where the team can change it quickly and safely. The main tool is refactoring: changing the internal structure of code without changing what it does. Depending on the type of debt, it also takes dependency updates, modernizing the architecture or adding tests.
Before you refactor, add tests that pin down the current behavior, otherwise you won't know whether the change broke something. Pay off large debt in small steps you can deploy on their own. Rewriting a whole part is the last resort: it takes a long time and you maintain both the old and the new version in the meantime.
| Type of debt | How to pay it off |
|---|---|
| Code | Refactoring: merge copied code into one function, split classes that grew too long, rename unclear names |
| Architecture | Gradual modernization: build the new part next to the old one and move features over one at a time (the strangler fig pattern) |
| Dependencies | Update dependencies and the framework in smaller version steps; tools like Dependabot or Renovate flag new versions |
| Tests | Add automated tests first where the code changes most often |
| Documentation | Write down the process and attach it to the app; automate a repeated manual process instead |
| Infrastructure and build | Automate builds and deployments in CI/CD |
6. How to explain technical debt to your manager
Managers don't decide about code quality; they decide about time, cost and risk. So explain technical debt in those terms, with numbers from the register, not words like refactoring or coupling.
- 1
Start with the interest
Say what the debt costs today: "Adding a payment method takes us 4 days instead of 1" or "The old library caused 2 incidents last quarter".
- 2
Name the risk and its date
End of support for a framework or a payment gateway API version is a deadline a manager understands without a technical explanation.
- 3
Propose a small, specific repayment
Instead of "we need a month for a rewrite", offer: "Before Apple Pay, we'll swap the SDK in 3 days and every method after that takes a day." A repayment tied to a planned feature is easier to approve.
- 4
Agree on regular capacity
A fixed slice of every sprint or one day a month set aside for debt is more predictable than negotiating each item separately.
- 5
Show what the repayment brought
After paying off an item, compare the time or incident count before and after. Next time you ask for capacity, you'll have numbers from your own project.
7. Managing technical debt in agile and Scrum
In Scrum and Kanban, technical debt belongs in the same backlog as features, otherwise it never gets picked up. The product owner then sees what a repayment costs and what it brings and can plan it into a sprint like any other work.
A Definition of Done that requires tests and updated documentation slows down new debt. Small debt can be paid off as you go: whoever changes a file for a feature also cleans up what's related to that feature.
8. Where the technical debt list lives after handover
Technical debt belongs in the project handover document and in the software maintenance plan. A list copied into the handover document goes stale with the first repayment or new item, though, so the document should link to the live register.
In AboutTheApp, you attach a link to the register to the app, for example a filter on the `tech-debt` label in GitHub Issues or Jira, under the Issue Tracking category. If the client shouldn't see it, mark the link as private: it only shows to signed-in team members or with an unlock code. AboutTheApp doesn't track the debt itself; it keeps the link to wherever the team does, next to the app's repository, environments and versions.
Frequently asked questions
What is technical debt?
It's work a team postponed by choosing a faster solution. The app works, but every change to the affected part takes longer until the debt is paid off by refactoring, an upgrade or a rewrite.
What are examples of technical debt?
Code copied to several places, a framework version past end of support, a module with no automated tests, manual deployment or a deployment process only one developer knows.
How do you explain technical debt to non-technical stakeholders?
Talk about time, cost and risk. Say what the debt costs today (how much longer changes take, how many incidents it caused), which deadline it carries and which small repayment you propose.
How much time should a team spend on technical debt?
There's no fixed number. A steady slice of capacity, such as part of every sprint, works better than one-off negotiations. Prioritize by interest: debt in code that changes often and debt with a deadline go first.
Where should a technical debt list be kept?
In the issue tracker where the team plans its work, for example as a label in GitHub Issues or Jira. In AboutTheApp you attach a link to that list to the app, so a new developer or maintainer finds it after a handover.
In short
Technical debt is fine as long as you know about it and know what it costs. A register with interest and a link next to the app turns it into a decision you can discuss with your manager.
Want the debt register next to your app?
Add your app to AboutTheApp for free and attach links to your technical debt register, repository and environments.