Product
The maintenance tax nobody prices in when killing features
How to find the features costing you more than they return, what the real carrying cost of a feature is, and a deprecation sequence that does not burn trust.
Product
How to find the features costing you more than they return, what the real carrying cost of a feature is, and a deprecation sequence that does not burn trust.
A team I sat with in Žižkov had an integration used by 34 of their 380 paying accounts. Nine per cent. It generated, by their own tagged ticket counts, a bit under forty per cent of support volume, because the third-party API changed shape roughly quarterly and the failures were silent. Two engineers had touched it in the past year. Neither wanted to.
They had discussed removing it four times across eighteen months and never done it. The reason was always the same and always sounded responsible: some customers rely on it. True. It was also, on the numbers, the single most expensive thing in the company, and nobody had ever written that sentence down.
That is the pattern. Features are added with a business case and removed with an argument. The removal loses, because the cost of keeping is diffuse and the cost of removing is a specific person being annoyed on a specific Tuesday.
The build cost is the part you paid and forgot. The carrying cost is the part you pay forever, and it has at least six components that never appear on a roadmap:
Here is a crude estimate I use to make the conversation concrete. Take engineering hours logged against the feature in the last twelve months. Add support hours from tagged tickets. Multiply by loaded cost. Then add one engineer-week per feature per year as a floor for the ambient tax of it simply existing. Put that number next to the revenue that would genuinely leave if it vanished — not the revenue of accounts that touch it, the revenue of accounts that would cancel over it, which is a much smaller and much harder number.
The estimate will be wrong. It will still be a hundred times better than the current method, which is vibes and loss aversion.
Instrument usage at the feature level, not the page level, and pull ninety days. For each feature you want three numbers: distinct accounts that used it at all, distinct accounts that used it more than three times, and the share of your top-decile-revenue accounts among them.
Then sort by a simple ratio: accounts using it more than three times, divided by your best guess at annual carrying cost. The bottom of that list is your kill list.
Two things will surprise you. The first is how many features have single-digit account counts — in most products I have audited, somewhere between a fifth and a third of shipped surface area is used by under 5% of accounts. The second is that some low-usage features are load-bearing for revenue: three accounts, but they are your three largest, and one of them bought because of it. Those you keep, and you should know their names.
A feature nobody uses that costs nothing to keep is not urgent. Sort by cost, not by loneliness.
Once you have decided, the way you do it determines whether you lose the feature or the customer. Here is the sequence I use.
Sometimes the honest answer is that ten accounts genuinely depend on this and they pay you enough to matter. You have three options and all are legitimate: build the migration for them by hand, price the feature separately at what it actually costs to carry, or let those accounts go with a refund and a warm referral to a competitor that does it well.
That last one reads as failure and usually is not. A customer who leaves well and speaks well of you is worth more than a customer you keep by carrying an integration that slows every release. I have watched a founder refund four accounts a combined €11,000 to remove a feature and get the engineering week back permanently. It was the highest-return €11,000 in that year's accounts.
Every feature you ship gets a sunset review date written in the ticket. Twelve months out. On that date, someone pulls the usage numbers and either renews it explicitly or starts the sequence above.
This sounds bureaucratic and takes about fifteen minutes per feature per year. What it actually does is change the default. Right now your default is that everything shipped lives forever unless someone summons the courage to argue for its death. With a review date, the default is that it needs a reason to continue. That inversion is the entire mechanism, and it is the only reliable one I have found.
Open your analytics tonight and list every feature used by fewer than 10% of your active accounts in the last ninety days. Do not decide anything yet. Just put a rough annual carrying cost next to each one, using the crude estimate above, and take the worst offender to your next team meeting with both numbers on the same line.
The conversation changes the moment the cost is written down. In my experience the team already knows which feature it is. They have been waiting for someone to make it acceptable to say.
If this was useful
What I am seeing across the weekends: what is working in growth engineering, what stopped working, and the numbers behind both. No sequence, no upsell ladder, and one click to leave.