[ Custom Software ]

Software Maintenance Costs: What to Budget

Dependency updates, hosting, monitoring, bugfixes, improvements, and support tiers explain what software maintenance really costs and how to budget for it.

DATE April 28, 2025READING 4 min readCATEGORY Custom Software
two developers reviewing code on monitors

Software does not stay finished. Libraries age, browsers change, APIs deprecate, and user expectations drift upward every year. Maintenance is the cost of keeping a working product working, and budgeting for it is the difference between a stable business asset and a slow-motion emergency that consumes attention whenever it surfaces.

Dependency updates are the most predictable obligation. Every framework and library eventually requires upgrades, including security patches that should not wait. Small, regular updates are far cheaper than one annual leap across several major versions, because each jump multiplies compatibility problems. Allocate time to test every batch, since upgrades change behaviour as well as code, and behaviour is what users notice.

Hosting and infrastructure bill whether or not anyone is working on the product. Servers or platform subscriptions, databases, storage, backups, content delivery, and third-party services all recur monthly. Usage-based pricing means a traffic spike turns into an invoice, so track spending, set budget alerts, and understand which components scale automatically. Finance should see this line before it becomes a surprise.

Monitoring and observability cost money and save considerably more. Error tracking, uptime checks, log aggregation, and alerting tell you when something is wrong before customers do. Budget for the tooling and for a human being to read the alerts and act on them. Alerts nobody owns are worse than no alerts, because they breed a culture of ignoring the channel that matters.

Bug fixes need a standing allowance. Defects are not evidence of failure; every system that changes has them. What matters is whether the backlog is managed. Track severity and age so small annoyances do not quietly compound into outages or support burdens. Teams that fix issues while they are small spend far less than teams that wait for a crisis to prioritise them.

Small improvements keep a product relevant between major projects. Copy changes, workflow tweaks, performance work, and usability fixes rarely justify a roadmap of their own, yet they are often the highest-value work available. A modest monthly improvement budget keeps the application evolving instead of freezing it until the next big initiative finally gets funded.

Support tiers translate business dependence into service expectations. Define response and resolution targets, business hours versus round-the-clock coverage, and who is available when. Match the tier to how much revenue depends on the system and how visible an outage would be. Paying for premium coverage on an internal tool is waste; relying on best-effort support for a checkout is a risk the business is accepting, whether or not it admits it.

Documentation is the cheapest maintenance tool available. When the architecture, deployment steps, and operational routines live in one maintained place, any capable engineer can help, not only the person who wrote the code. Record why decisions were made as well as what they were, because the reasoning is what future teams need when requirements shift. Documentation that is reviewed with each release stays useful; documentation written once at handover rarely does. Assign an owner so it does not decay into a stale wiki page.

Security and compliance tasks recur on a calendar rather than on demand. Patching, access reviews, certificate renewals, dependency audits, and evidence collection all come back. If regulations apply, maintenance includes producing proof, not just making fixes. Put these items on the annual plan early, because they compete poorly against feature work when they are invisible until an audit appears. Treat the calendar as seriously as the code; an expired certificate can take a service down as thoroughly as a bug.

Periodically, the right answer is to replace rather than repair. When the stack no longer matches the team's skills, when hosting costs keep climbing, or when every small change takes weeks, maintenance starts buying less and less. Plan the migration deliberately, run both systems in parallel where the risk justifies it, and define what must be true before the old system retires. Re-platforming is a project, not a monthly line item, and it deserves the same brief and budget discipline as any other. Putting it off indefinitely is a decision too, and usually the more expensive one.

Turning this into a number requires a decision rather than a formula. A common starting point is a percentage of the original build per year, adjusted for how critical the system is and how fast its domain moves. The exact percentage matters less than having a line item, a named owner, and a monthly rhythm for choosing what gets done. Without those, maintenance happens only when something breaks.

Treat maintenance as product work with its own budget and its own priorities. The teams that do keep small problems small, upgrade on a schedule, and improve in steady increments. Choose the work in advance, so the choice is not made by whoever is loudest during an outage. A calm schedule beats a heroic recovery. The alternative is a product that works well until it suddenly does not, at which point the cost is measured in lost revenue and rushed overtime rather than in planned hours.

[ Sources ]

Official documentation, checked and cited.

Terminology and platform behavior in this note trace back to published docs, not secondhand summaries.