Guide · Tech for owners

Technical debt: why small changes suddenly take weeks

Technical debt is the extra time and risk you pay on every change because the code was once built faster or cheaper than it should have been. It shows up as slow development, more bugs and suppliers who hesitate to touch the system. This guide gives you the warning signs, a worked example of what the debt costs, and a plan to pay it down without rebuilding everything.

11 min read · Updated 1 October 2026

You ask for something that sounds simple: an extra field on the invoice, a new discount type in the webshop, an export to accounting. The developer comes back with three weeks and a warning that something else might break along the way. Last year that kind of change took an afternoon. It is the most common sign of technical debt, and almost every company with software older than a couple of years knows it. The good news is that the debt can be measured, prioritised and paid down, just like the financial kind.

What is technical debt? A plain-language explanation

The term was coined by software developer Ward Cunningham in the early 1990s, and the metaphor still holds. When a system is built with shortcuts to hit a deadline, you borrow time. The loan is the principal: the work that should have been done properly. The interest is the extra time you pay on every change afterwards, because the developer has to work around the shortcut. As long as nobody touches the system, you feel nothing. As soon as you want to develop it further, the interest starts running, and it grows with every new shortcut stacked on top of the old one.

Technical debt arises in two ways. Deliberate debt is a choice: you launch a simple first version to test the market and know parts will be rebuilt later. It is healthy when it is written down and has a plan. Accidental debt arises on its own: inexperienced developers, changing suppliers, requirements that shifted along the way, or technology that went out of date while the system stood still. The most dangerous debt is the kind nobody knows they have, because it is discovered when something is urgent.

What types of technical debt are there?

The six types of debt we meet most often when we take over an existing system. Most systems have several at once.

TypeWhat it looks likeTypical causeRisk
Code debtDuplicated code, huge files, unclear namesTime pressure and no code reviewMedium: slower changes
Architecture debtEverything depends on everything, one change hits five placesThe system outgrew its original purposeHigh: expensive to fix
Dependency debtOutdated frameworks, plugins and librariesNo regular update routineHigh: security holes
Test debtNo automated tests, everything tested by handTests were cut to save moneyMedium to high: bugs after releases
Knowledge debtOnly one person understands the systemNo documentation, changing developersHigh: vulnerable when suppliers change
Data debtDuplicates, fields used for other things than intendedMissing validation and quick fixesMedium: wrong reports and integrations

Dependency debt deserves extra attention, because it grows even when nobody touches the code. A framework that was new four years ago may lack security updates today, and the longer you wait, the bigger the jump to the latest version becomes. We have a separate software security checklist that shows what to watch for.

How can you tell your software has technical debt?

You do not need to read code to see the signs. They show up in daily work, in the supplier’s estimates and in the mood of the people who work with the system. Go through the list and tick every point you recognise. Three or more ticks means it is time for a review.

  • Small changes are estimated in weeks, and the estimates rarely hold.
  • New bugs appear after almost every release, often in places nobody touched.
  • Developers say "we don’t dare touch that" about parts of the system.
  • Only one person, in-house or at the supplier, can explain how it fits together.
  • You have postponed updates to the framework, server or plugins for more than a year.
  • The system gets slower as you add more data and users.
  • New developers need weeks to understand the code before they can contribute.
  • There are no automated tests, so everything has to be clicked through by hand.
  • Staff have invented manual workarounds, such as spreadsheets next to the system.
  • The supplier proposes a new solution every time you ask for a change.

What we see in practice is that points four and five usually go together. When one developer has built and looked after a system alone for years, updates get postponed because something more urgent always comes up. Then the developer leaves, and the next one inherits both the code and five years of postponed maintenance. It is common for the first month with a new supplier to be spent bringing the system up to a version that can be updated safely at all.

What does technical debt cost? A worked example

Imagine an internal web app for orders and stock, built five years ago. You spend about 300 developer hours a year on small and medium changes, at DKK 1,100 an hour. Because the code is tangled and has no tests, every task takes on average one and a half times as long as it would in a healthy system. That is the interest. The table shows what it costs, and you can run the same sum with your own numbers.

Illustrative example. The factor of 1.5 is an example; in heavily indebted systems we often see more.

ItemHealthy systemSystem with debt
Planned work per year300 hours300 hours
Actual time spent300 hours450 hours
Cost at DKK 1,100/hourDKK 330,000DKK 495,000
Interest per yearDKK 0DKK 165,000
Interest over three yearsDKK 0DKK 495,000 plus what never got built

The DKK 165,000 is only the visible part. On top come the features you dropped because they were too expensive, bugs that hit customers, staff spending time on workarounds, and the risk of a security breach in an outdated component. If a targeted clean-up costs DKK 150,000–250,000 and halves the interest, it pays for itself within a few years. That full bill is what you should weigh against the price of acting. See also how we calculate the running cost of a website or app, because maintenance is what keeps the interest low.

Is all technical debt bad? When debt is a sensible choice

No. Debt is a tool, and as in finance, a loan can be smart. A startup that wants to test whether customers will pay is right to build a simple MVP with shortcuts and wait with the perfect architecture until the market has said yes. The same goes for a campaign page that only needs to live for three months. Debt becomes a problem when it is forgotten, when it grows without a plan, or when a temporary system ends up running the business for five years.

A newer example is prototypes made with AI tools such as Lovable, Bolt or Cursor. They are brilliant for showing an idea within days, but the code is rarely built for thousands of users, personal data and payments. That is deliberate debt on a large scale, and it has to be dealt with before the product goes live. We have written a guide on going from AI prototype to production.

How do you pay down technical debt? A five-step plan

1

1. Map it

An experienced developer reviews code, dependencies, tests and hosting and lists the debt with a rough estimate per item.

2

2. Prioritise by interest

Fix first what you touch most often and what is a security risk. Debt in a part of the system nobody changes can wait.

3

3. Set a fixed budget

Reserve a fixed share of development time for clean-up, for example a fifth of each month, so the debt falls steadily.

4

4. Clean up where you work anyway

When a developer changes a feature, it is left a little tidier: one more test, a clearer name, an outdated package updated.

5

5. Measure the effect

Track time per change and the number of bugs after releases. If the numbers fall, the plan is working.

How to pay down debt without stopping work on new features.

Refactor, modernise or replace?

Decision table: choose the smallest intervention that solves the problem.

If …Then chooseTypical scope
The technology is sound but the code is messyOngoing refactoringA fixed share of each month
The framework is outdated but the logic holdsUpgrade or modernisationWeeks to a few months
One part of the system causes most problemsReplace that part aloneA scoped project at a fixed price
The technology is unmaintained and security cannot be fixedA new system, built in stagesMonths, with the old one running meanwhile

The last row is the most expensive and the most tempting. A new system promises a clean start but carries a hidden risk: everything the old system does that nobody wrote down. That is why we build new systems in stages, moving one part at a time and testing it against the old one. Read more about how we do it under legacy system modernisation.

How do you avoid new technical debt from the start?

The cheapest debt is the debt you never take on. Most of it comes down to the agreements you make with your supplier before the project starts. Copy the questions below into an email to your current or future supplier and see how concrete the answers are.

  1. Do you write automated tests, and for which parts of the system?
  2. Is all code reviewed by another developer before it goes live?
  3. How often do you update the framework, packages and server, and is it in the fixed price?
  4. How do you document the system so another developer can take it over?
  5. Do you write it down when we choose a shortcut to hit a deadline?
  6. Do we own the code, and is it in a repository we can access?
  7. Which technology do you build in, and how widely used will it be in five years?

Question six matters more than it looks. If you do not own the code, you cannot get someone else to assess the debt, and you depend entirely on the supplier’s own judgement. We have collected everything on rights, repositories and accounts in the guide who owns the code.

Which myths about technical debt should you watch out for?

The myth

  • "A new system solves every problem"
  • "Debt is the developers’ problem"
  • "It works, so there is no debt"
  • "We will clean up when we have time"

The reality

  • A new system built with the same habits gets the same debt
  • The debt hits budget, customers and time to market
  • Debt can hide for years until you want to change something
  • Clean-up only happens with a fixed budget and a plan
What you often hear, and what we see in reality.

How does Ceptiv keep technical debt low?

We build in React, Next.js and TypeScript, which are widely used and well-maintained technologies, and we build from scratch, so there is no stack of plugins to keep track of. Our fixed monthly plan covers hosting, maintenance, updates, support, security and backups, so dependency debt is not allowed to pile up in a quiet year. You own the code and data, and you can follow the project in our client panel. When we take over an existing system, we start with a review and a prioritised list, so you can see the debt in kroner before you decide anything.

If you have a system that has become heavy to work with, describe it briefly and get a fixed price for a review or a scoped clean-up. You get a written proposal within 24 hours.

Questions about technical debt

What is the difference between technical debt and ordinary bugs?
A bug is something that behaves wrongly today: a button that does nothing or an invoice with the wrong VAT. Technical debt is a weakness in how the system is built that makes future changes more expensive and bugs more likely. Debt can sit for years without a single visible bug. You feel it when you want to change something and the job takes three times longer than expected. Many bugs are symptoms of debt, though, especially when the same kind of bug keeps coming back.
Can technical debt be measured?
Partly. Developers can use tools that find outdated packages, duplicated code, missing tests and known security holes. For an owner, the most useful measures are closer to the business: how long does a typical small change take, how many bugs appear after each release, and how much development time goes to clean-up. Track those numbers for six months and you can see whether the debt is growing or shrinking without reading a line of code.
Should we rebuild the system from scratch?
Rarely as the first move. A full rebuild is expensive, takes time, and you have to recreate all the business logic hidden in the old system. It makes most sense when the technology is no longer maintained, when security cannot be fixed, or when almost every new feature requires restructuring. In most other cases it is cheaper to replace the system piece by piece, so you always have something that works. We always recommend a short code review before the decision is made.
Who is responsible for technical debt: us or the supplier?
Both. The supplier is responsible for building soundly and for saying clearly when a shortcut creates debt. You are responsible for the decisions you make about deadlines and budget, and for setting time aside for maintenance. The best protection is an agreement where updates and security are part of the fixed running plan, and where known debt is written down. Then nobody is surprised, and the debt becomes an ordinary question of priorities.
How do I explain technical debt to management?
Use money and time. Explain that every change to the system currently costs an extra share of development time, and convert it into kroner per year. Show two or three concrete examples where a small task turned into a big one, and put them next to the cost of cleaning up. Management understands interest. When you can say the debt costs DKK 150,000 a year and paying it off costs DKK 200,000 once, it becomes an ordinary investment decision.
Is a WordPress site with lots of plugins technical debt?
Often, yes. Every plugin is code someone else maintains, and it has to work with all the others on every update. When plugins are no longer updated, or when you hesitate to update for fear of breaking the site, that is classic dependency debt. The fix can be to prune plugins, merge features into fewer and better solutions, or move to a platform where the features are built in. Read our comparison of Next.js and WordPress if you are considering a switch.

Want us to build it for you?

You get a fixed-price proposal within 24 hours.

Dennis Nielsen

Dennis Nielsen

Head of Operations, Ceptiv

Free consultation

One free hour of advice before you start.

Describe your project and I will contact you as soon as possible, so we can schedule a no-obligation meeting. You leave with practical advice on how to get your project off to a good start.

  • Free
  • 1 hour
  • No obligation