Jan 14, 2025·8 min read

Build vendor bottleneck: how to check before blaming code

Learn how to spot a build vendor bottleneck by checking release rights, weak requirements, support loops, and hidden dependencies before you blame code.

Build vendor bottleneck: how to check before blaming code

What this problem looks like in real life

A product slips by four days, then another week, and soon every delay starts to look like a coding problem. The founder hears, "the build is not ready," sees a few open bugs, and decides the vendor is slow. That is a common first guess. It is also often wrong.

The signs usually arrive in fragments. A developer says the feature is done but cannot go live. A project manager says the team is waiting on approval. Support says users reported a bug, but the report has no clear steps. Someone on the client side says the vendor keeps missing dates. Each person sounds partly right, which is why founders and managers get stuck.

A simple example makes the problem clear. The app works in staging, but the release goes nowhere because the client owns the app store account and nobody shared the right access. Or the team built exactly what the spec described, then a late requirement changed the flow. Or a small support issue turns into a week of back and forth because nobody can reproduce it. From the outside, all three cases look like "dev is late."

This is where people start talking about a build vendor bottleneck. Sometimes that label fits. Sometimes the vendor is just the first person to say what is blocked. If release rights in software projects sit with someone else, software requirements quality is poor, or hidden project dependencies were never named early, code is only one part of the story.

Blame feels fast, but it usually slows the team down. Once trust drops, every status update sounds like an excuse. A better move is to test the process before judging people. Check who can release, who can approve, where support issues enter the queue, and which outside services can stop the work. That small shift often changes the whole diagnosis.

Who actually controls the release

A team can finish the work on Friday and still miss the release by a week because the vendor does not control the final switch. That matters more than opinions about code quality.

Start with one plain question: who can push to production today without asking anyone else? If the vendor can deploy, update settings, and roll back changes, they own a large part of the release path. If they cannot, the delay may sit with your internal team, a founder, or an outside admin who approves the last step.

The fastest way to see this is to map the accounts and permissions that matter. Look at production servers or cloud accounts, app store access for mobile releases, domain and DNS settings, CI/CD and hosting, secrets management, and any manual approval required before release. One missing login can stop a release for days.

A common example is a vendor who finishes a fix, but the client owns the Apple App Store account and nobody with access is available to submit the build. The vendor looks slow, but they are waiting.

Approval chains create the same confusion. Some teams need sign-off from legal, security, product, or a founder before anything goes live. Write down every approval step and the usual wait time for each one. If a release spends two hours in development and four days in approval, the vendor is not the main problem.

This applies to smaller products too. A SaaS team may think the agency is late, but the real hold-up is a domain change, a cloud billing issue, or a missing production secret that only the client can provide.

Ask for a one-page release map. It should show who owns each system, who approves each step, and who can act in an emergency. Once you have that, split the timeline into two numbers: time spent waiting on the vendor and time spent waiting on everyone else. That usually tells a much clearer story than a tense status call.

Check the requirements before judging the work

Bad requirements can make a good team look slow. A build vendor bottleneck is easy to claim when releases slip, but weak inputs often start the delay long before anyone writes code.

Start with the original brief, then read the tickets and later change requests in date order. You want to see whether the team got one clear goal or a moving target.

Vague language is usually the first warning sign. Words like "simple," "fast," or "like the old system" sound harmless, but they leave room for several interpretations. One person may think "fast" means a page loads in two seconds. Another may think it means the job finishes by the end of the day. If nobody wrote down the exact meaning, the team had to guess.

Then check scope changes. A few changes are normal. Constant changes are not. If the team started with a small checkout flow and later had to add discount rules, tax logic, guest checkout, and mobile edge cases, the timeline changed even if the vendor did solid work.

Open product decisions create another kind of delay. Teams often keep building around gaps, then stop when they hit a choice nobody made. You see this when nobody defined who can approve refunds, what counts as a failed payment, which old behavior must stay the same, or which user roles need access. If those decisions sat open for days or weeks, that lost time should not land on the vendor alone.

A quick test helps. Pick one feature that felt late. Check how many times the request changed, how many comments asked for clarification, and how long product owners took to answer. If the ticket history is full of rewrites and unanswered questions, the issue is not only code.

This shows up all the time in small teams. A founder says, "make it work like the old system," but nobody documents the old edge cases. The vendor builds the obvious version. Review starts, hidden rules appear, and everyone calls it a miss. In reality, the team judged execution before they checked the brief.

Follow the support loop from issue to fix

Pick one recent bug and trace it from the first complaint to the final release. Do not start with the code commit. Start with the first message in support, chat, email, or the ticket system.

Write down each step and the time between steps. A lot of teams look only at coding time, then call the vendor slow. That misses the real delay. In many cases, the engineer fixed the issue in an hour, but the ticket sat for three days waiting for logs, test access, or approval.

For each handoff, note who received the issue first, when someone asked for more details, when the customer or internal team replied, when engineering started work, and when someone confirmed the fix and closed the loop.

This simple timeline shows where time actually disappears. If the same person keeps waiting on other people, the problem is not a vendor bottleneck. It is a support process problem.

Repeated requests tell you even more. If support asks for logs on Monday, then another person asks for the same logs on Wednesday, the team has a handoff problem. The same goes for screenshots, test accounts, browser details, or server access. Good teams ask once, store the answer, and move the issue forward.

Watch for loops with no clear owner. A common pattern looks like this: support collects a vague report, sends it to engineering, engineering asks for details, support goes back to the customer, then the ticket returns with half the answer, and the cycle starts again. No one owns the full path, so nobody pushes the issue to a real decision.

A small example makes this obvious. A user reports a failed checkout at 9:00. Support replies at 11:00 and asks for a screenshot. The user answers the next morning. At 2:00, engineering asks for the order ID and browser version. Support gets that the next day. Engineering finds and fixes the bug in 25 minutes. The slow part was not the fix.

If you want a fair read on vendor performance, measure total elapsed time, repeated questions, and ownership gaps. Those three numbers usually tell you more than the commit history.

Find the dependencies nobody mentioned early

Clean Up Shaky Requirements
Use an outside CTO review before vague tickets turn into rework.

When people suspect a build vendor bottleneck, they often inspect tickets and commits but skip the systems around the product. That misses a common cause of delay: the vendor can ship only as fast as the product's outside dependencies allow.

Start with a plain list of every service the product needs to work. Keep it boring and specific. Include payment tools, login providers, email delivery, SMS vendors, data feeds, app store review, cloud accounts, old internal systems, and any approval step that happens outside the codebase.

A short dependency map usually shows more than the backlog does. It tells you which service can block a release if it changes or goes down, which account or contract the vendor can access directly, which system only your team or another partner controls, and which old system still feeds the product even though nobody clearly owns it.

That second point matters a lot. If the vendor cannot change payment settings, rotate login credentials, approve a store release, or get test data from an old ERP, they are waiting on someone else. Code may be ready, but the release is still stuck.

This comes up often with login and payments. A team finishes a checkout fix, then waits three days for new API credentials. Or they patch a sign-in flow, but nobody has admin rights to the identity provider. From the outside, it looks like slow development. It is really an access problem.

Legacy systems create even more confusion. An old database, a file export from accounting, or a partner's daily feed can break the product without any change in your main app. If the vendor does not own that system, they cannot fix it on their own.

Write each dependency next to one simple label: vendor controls it, client controls it, shared control, or unknown. Unknown is a warning sign. If too many blockers sit in that column, you do not have a coding problem yet. You have an ownership problem, and blaming the vendor will not move the release date.

Run a simple bottleneck test

Pick one delayed release from the last month or two. Make it recent enough that people still remember the handoffs, approvals, and late changes. One release is enough to start. It is not enough to judge.

Create a plain timeline from the first request to production. Keep it factual. Write the date, the person or team involved, and how long that step took.

Use four labels for the time spent:

  • coding
  • waiting
  • approval
  • rework

That split changes the conversation fast. If the vendor coded for six hours but the release sat for five days waiting for internal sign-off, the delay did not come from code. If the team spent three days redoing work after unclear feedback, the problem sits closer to software requirements quality than delivery speed.

Start with the original request. Then note when someone clarified scope, when the vendor started work, when review happened, who had release rights in software projects, and when production actually happened. Add support steps too. A bug can look like a coding delay when the real pause came from waiting for a user to confirm the fix.

Do the same test on two more releases. Pick one feature and one bug if you can. Patterns matter more than stories. One messy release may be bad luck. Three similar timelines usually show the real constraint.

You will usually see one of a few outcomes. Coding takes most of the time. Waiting dominates because someone else controls access, data, or approvals. Rework keeps showing up because the request changed or started vague. Support loop delays stretch everything because issues bounce between the customer, support, product, and vendor.

A startup advisor or Fractional CTO will often do this with a spreadsheet and half an hour of interviews. It is not fancy. It works because it turns blame into a visible path. Once the path is visible, the next fix gets obvious.

A simple example from a small product team

Fix Release Access Gaps
Get help sorting production rights, app stores, secrets, and handoffs.

A team of five is getting ready for a Thursday release. They have one new feature to ship, one bug to fix, and one narrow release window before a weekend campaign starts.

The feature is simple: add a coupon field at checkout. The bug looks urgent: some users do not get password reset emails. The vendor has two developers on the work, while the client keeps production access and release approval.

By Tuesday afternoon, the checkout feature is coded and tested on staging. The password reset bug takes longer, but not because the fix is hard. The vendor sees that the mail service fails only for a few accounts and asks support for one affected email address and the exact time of the failed reset.

Support sends back a screenshot with no timestamp. The vendor asks again. A day later, support replies with a different user, but still no failed request log. The same question comes back a third time in the next call because nobody collected the right details from the user.

While that loop keeps spinning, the vendor finishes both code changes. Actual coding time is about six hours. Waiting time is more than a day.

Then the bigger delay appears. The vendor cannot release to production. Only the client's internal admin can merge to the live branch, update the mail service setting, and approve the release. That person is busy in another meeting cycle and does not touch the release until Friday morning. The Thursday window is gone.

At that point, blaming code would be lazy. The evidence points somewhere else. Coding took hours. Missing release rights blocked deployment. Support sent the same incomplete answer three times.

The verdict is clear: this is not mainly a build vendor bottleneck. It is an access bottleneck with a broken support loop. Fix those two things first, and the same vendor may suddenly look much faster.

Mistakes that lead to the wrong conclusion

A common mistake is blaming the last person who replied. If the vendor answered the ticket most recently, they become the face of the delay, even when the work stalled somewhere else for days. People remember the last message, not the full chain of decisions.

Calendar time fools teams too. A task that took two weeks on the calendar may include three days waiting for founder approval, two days waiting for copy, and another day lost because nobody had release access. That is not the same as two weeks of coding.

This is why a build vendor bottleneck is easy to assume and easy to misread. If you only track the date a request opened and the date it closed, you hide the real split between build time, review time, and waiting time.

Another bad habit is ignoring decisions that sat with founders or managers. Many delays start there. A vendor cannot ship a change if someone on the client side still has to approve pricing, wording, access, or risk.

Estimate misses also get judged too harshly. An estimate is not proof of bad engineering when the scope moved halfway through, the requirements stayed vague, or support issues kept cutting into planned work. If the team started with unclear acceptance rules, the number was shaky from day one.

Urgent fixes make this worse when teams skip scope cleanup. They rush a patch into production, then argue later about what the fix was supposed to include. The vendor looks slow because the same issue comes back twice, but the first request never had a clean boundary.

A small product team can hit all of these mistakes at once. The founder asks for an urgent change on Monday, support adds two extra asks on Tuesday, design sends final text on Wednesday, and release approval happens on Friday. The vendor may have done the actual work in half a day.

A better read is simple: separate waiting, decisions, and coding. Once you do that, blame gets replaced by facts.

A quick check before your next call

Map Hidden Dependencies
See which systems your vendor controls and which blockers sit elsewhere.

A short pre-call review can stop a bad argument before it starts. If you want to know whether you have a real build vendor bottleneck, look at the last two or three delayed tasks and ask the same questions each time.

Start with release control. If the vendor finished the work but could not push it live without your approval, your credentials, or someone from your team, the delay did not start in code. The same applies when one person owns production access and checks in once a week.

Then read the latest task exactly as the vendor received it. Was the goal clear? Did it define what "done" means? If the request changed across chat, email, and calls, slow progress is not surprising. Teams lose days when they build one thing, then learn the real need was different.

Support history matters too. If the same issue bounced between support, product, and the vendor more than once, the loop is the problem. That usually means nobody owns triage, or the first report lacked enough detail to act on.

Use this quick list:

  • Could the vendor release the change without waiting on your team?
  • Did the last task include clear scope, edge cases, and acceptance rules?
  • Did support requests circle through the same people before anyone fixed them?
  • Does the product depend on systems, APIs, or vendors your build team cannot change?
  • Do most delayed tasks hit the same blocker, such as approval, access, or missing data?

Patterns matter more than excuses. If four delayed items all waited on the same admin account, legal sign-off, or third-party system, you found the choke point. If the blockers change every time, the process is messy in a wider way.

Bring examples to the call, not feelings. One sentence per task is enough: what was requested, what blocked it, who had to act, and how long that step took. That makes the conversation sharper and usually much shorter.

What to do next

Most teams waste days arguing about code when the delay sits in release access, approval chains, or missing decisions. Once you see where the slowdown starts, act on that part first.

If the vendor blocks progress, make the rules concrete. Agree on response times for bug reports, review rounds, and release windows. Name one person on the vendor side who owns delivery, and one person on your side who can accept or reject a release.

If your own process causes the delay, fix that before asking for faster output. Give the right people access to staging, logs, test data, and release tools. Cut scope that keeps changing mid-sprint, and shorten approval paths that leave work waiting in someone's inbox.

A simple recovery plan is enough. Write down who can approve a release, who can deploy it, and who can stop it. Keep one shared record for requirements, open issues, owners, and outside dependencies. Set a response time for support questions so bug reports do not sit unanswered. Review blocked items every week and remove one cause at a time.

That shared record matters more than teams expect. If requirements live in one chat, approvals in email, and dependencies in someone's head, people will keep blaming the wrong thing. A plain tracker with dates, owners, and status is enough.

When blame clouds the facts, an outside review can clear things up fast. Oleg Sotnikov at oleg.is works as a Fractional CTO and startup advisor, and this kind of release-flow review fits that role well. A neutral technical read often shows whether the real problem is vendor performance, weak requirements, poor access control, or broken handoffs.

Do not try to fix everything at once. Pick the first blocked release, map every step, and assign ownership before the next one ships.

Frequently Asked Questions

How do I know if the vendor really caused the delay?

Map one delayed release from the first request to production. Split the time into coding, waiting, approval, and rework.

If most of the delay sits in waiting or approval, the vendor probably is not the main problem. If coding and review keep taking most of the time across several similar tasks, then the vendor may be the bottleneck.

What should I check first before blaming the vendor?

Start with release control. Ask who can push to production today, who can roll back a change, and who owns the accounts that matter.

Missing access to an app store, cloud account, DNS, CI/CD, or secrets can stop a release even when the code is ready.

Can bad requirements make a good vendor look slow?

Yes. Vague requests, late scope changes, and open product decisions can slow any team down.

Read the ticket history in order. If you see rewrites, unanswered questions, or changing acceptance rules, the delay started before coding.

How do I check whether our support process is the real issue?

Trace one bug from the first support message to the final fix. Note when support asked for details, when the user replied, when engineering started, and when someone confirmed the fix.

That timeline usually shows whether the slow part was the fix itself or the handoffs around it.

What hidden dependencies usually slow releases down?

Look at the systems around the product, not just the backlog. Payments, login providers, email tools, app store review, cloud accounts, old databases, and partner feeds often block releases.

Write down who controls each one. If ownership is unclear or sits outside the vendor, delays will look like coding problems when they are really access problems.

How many delayed tasks should I review before I judge the vendor?

Review three recent delays if you can. One feature, one bug, and one other release usually give you a fair read.

A single bad week can mislead you. Repeated patterns tell you where the real choke point sits.

When is the vendor actually the bottleneck?

The vendor is more likely the bottleneck when they control the release path, the scope stayed clear, outside approvals did not stall the work, and coding still took most of the time.

You should see that pattern more than once. One miss is not enough to prove much.

What should I bring to the next status call?

Bring facts from two or three real tasks. For each one, note what was requested, what blocked it, who had to act, and how long that step took.

That keeps the call grounded. People stop arguing about feelings when the timeline shows where time disappeared.

What simple fixes help a small team move faster?

Pick one release owner on your side and one delivery owner on the vendor side. Give the team the access they need for staging, logs, test data, and deployment.

Keep one shared tracker for requirements, blockers, approvals, and dependencies. That alone cuts a lot of repeat questions and missed handoffs.

When should I ask a Fractional CTO to review our release process?

Bring in a Fractional CTO or startup advisor when the same arguments keep repeating and nobody agrees where the delay starts. An outside review helps when ownership is fuzzy, requirements keep shifting, or releases depend on too many people.

A neutral technical read can separate vendor issues from approval, access, and process problems fast.