Sales is losing deals over features you don’t have. Your competitors are shipping weekly and your release cadence is somewhere between monthly and quarterly. Engineering says they’re working hard and the data backs them up — everyone’s sprints are full, everyone’s busy. But the backlog never shrinks.

Before you post six more job descriptions, let’s figure out what’s actually happening.

The Question You Have to Answer First

Is this a capacity problem or a throughput problem?

Capacity means you simply don’t have enough engineers to do the work. Throughput means you have enough engineers but the system they’re working in prevents them from producing at full capacity.

These look identical from the outside — both result in features not shipping — but they have opposite solutions. If you have a throughput problem and you hire more engineers, you will make it worse. More engineers means more coordination overhead, more review bottlenecks, more interdependencies, and more context-switching. I’ve watched companies hire 30% more engineers and slow down.

Here’s a fast diagnostic: ask your best engineers to estimate how much of their week is actually writing or reviewing code versus everything else — meetings, waiting for decisions, navigating blockers, unblocking other people, context-switching between tickets. If the answer is less than 50%, you have a throughput problem, not a headcount problem.

The Four Actual Causes

Tech debt that taxes every feature. This is the most common cause I find, and the hardest to get leadership to believe because it’s invisible. Your codebase has areas where a simple change that should take a day takes a week — because of fragile dependencies, untested code, unclear ownership, or architectural decisions made in year one that made sense then and are expensive now.

The symptom is estimates that are consistently wrong in one direction. Engineering says a feature will take two weeks, it takes six. Every time. That’s not a planning problem. That’s the codebase charging an overhead tax on every change. Until you pay down that debt, every feature costs more than it should.

Process that doesn’t match team size. At 6 engineers, weekly planning and daily standup is reasonable. At 18 engineers, that same process generates two hours of meetings per engineer per day. I’ve seen teams spend more time in Jira ceremonies than writing code. The process was designed for a team half the current size and nobody updated it as the team grew.

Unclear ownership that forces constant coordination. If your engineers can’t ship a feature without coordinating with two other teams in real time, you’ve built coordination into the work. Features that require cross-team synchronization take 3-5x as long as features that a single team owns end to end. Map your most common features and count the team boundaries they cross.

Backlog and prioritization dysfunction. Sometimes the backlog grows faster than the team can address it not because the team is slow but because the business is adding items faster than it’s removing them. Engineering works on 10 things at once, nothing is ever finished, and the backlog grows. This isn’t an engineering problem — it’s a product management problem. But it shows up as slow shipping.

What to Actually Do

Start with a two-week measurement exercise before making any structural changes. Look at your version control history and your project tracking, and answer these questions: What percentage of features shipped on original estimate? What’s the average ratio of estimate to actual? Where are pull requests spending the most time? What categories of work take longest?

The data will tell you which of the four causes you’re dealing with. It will also give you a baseline to measure improvement against, which matters a lot when you’re making the case to the board that you know what you’re doing.

If tech debt is the primary driver, you need a deliberate paydown strategy — not “we’ll fix it when we have time” (you never will) but dedicated sprint capacity allocated to high-leverage debt reduction. I typically recommend identifying the three or four areas of the codebase that tax the most common features and addressing those specifically, rather than a general “clean up the code” effort that never produces measurable output.

If process is the problem, the fix is subtraction, not addition. Cut meetings, not add them. Replace synchronous coordination with asynchronous documentation and clear ownership boundaries. This is uncomfortable to do because removing process feels risky, but the process you have was never designed — it accumulated.

The Hiring Question

Hiring is sometimes the right answer. If the team is well-structured, the codebase is reasonably healthy, and the backlog is genuinely larger than current capacity can address, more engineers will help.

But “add senior engineers” is almost always better than “add any engineers.” A senior engineer in a dysfunctional system will diagnose the dysfunction. A junior engineer in a dysfunctional system will inherit the dysfunction and make it harder to change.

The other thing worth saying: if your engineering leadership can’t articulate why shipping is slow beyond “we’re working on a lot of things,” that’s important information. You may have a leadership problem upstream of the execution problem.

This is exactly the kind of situation a fractional CTO is brought in to diagnose — someone who can look at your team, your codebase, your process, and your backlog and tell you within two weeks what’s actually wrong and what to do about it. If you’re losing deals over shipping speed, let’s start with 15 minutes.


Related: Engineering Metrics That Actually Matter | How Much Technical Debt Is Too Much? | Engineering Sprint vs. Kanban