Back to Blog

Why Your Developer Has Been "80% Done" for 3 Weeks

Mohammad Orabi·Founder & CEO·6 min read

Your developer says they are 80% done. They have been 80% done for three weeks. You are starting to wonder if the remaining 20% will ever ship.

This is not unusual. It is not necessarily a red flag. And it is not always the developer's fault. Software has a dirty secret: the last 20% takes 80% of the time. Here is why, and what to do about it.

The Happy Path Is Easy

The first 80% of any feature is the happy path. The user signs up. Fills in their profile. Creates a project. Submits a form. Everything works. It flows. It feels like progress because it is. Things are getting built, screens are coming together, and demos look great.

The happy path is straightforward to build because there is one path through the system. The user does the right thing, in the right order, with the right data, on a good connection. Building for that scenario is relatively fast.

This is why early progress feels rapid. The developer is building the one path that makes everything work. And it does work. In the demo. On their machine. With perfect inputs.

The Failure Path Is Where All the Time Goes

The last 20% is the failure path. And it is not one path. It is hundreds of paths, and every single one needs to be handled so the user never sees a broken experience.

What if the user enters invalid data? You need validation on every field, with clear error messages, that does not erase what they already typed. That alone can take days for a complex form.

What if the network drops halfway through a payment? You need retry logic, idempotency keys, and a way to recover without charging them twice. You need to handle the state where the payment went through on the provider's side but your server never got the confirmation.

What if two users edit the same record at the same time? You need conflict resolution. Optimistic locking. Merge strategies. A way to tell the second user that something changed without losing their work.

What if the database is slow under load? What if a third-party API times out? What if the file upload is 200MB instead of 2MB? What if the user's session expires mid-action? What if they hit the back button at exactly the wrong moment?

Each edge case is a mini-project. Some take an hour. Some take a week. And you do not know how many of them exist until you are deep into building.

Why This Catches Founders Off Guard

The demo at week two looks nearly done. The screens are there. The main flow works. It is natural to think the remaining work is small.

But what you are seeing is the happy path. The one path. Behind it lies every way the system can fail, every edge case that needs handling, every state that the UI needs to account for. Loading states. Error states. Empty states. Partial data. Concurrent access. Permissions. Rate limits. Timeouts.

The gap between "works in a demo" and "works in production" is where most of the engineering effort lives.

A Real Example

Consider a checkout flow. The happy path takes three days: select a plan, enter payment details, confirm, done. Looks great in the demo.

The failure paths take two more weeks:

  • Card declined? Show the right error, keep the form filled, let them retry without re-entering everything.
  • User closes the tab mid-payment? Detect the incomplete state, send a recovery email, handle the webhook from the payment provider that arrives later.
  • Promo code expired between page load and submission? Recalculate the total, show the updated price, do not charge the old amount.
  • User switches plans after entering payment but before confirming? Update everything downstream without creating orphaned records.
  • Currency conversion edge cases. Tax calculation for different regions. Subscription upgrade vs downgrade logic.

Every single one of these has to work flawlessly. Users do not forgive payment bugs. The happy path is 20% of the work. The failure paths are the other 80%.

How to Handle the 80% Problem

You cannot make the failure path go away. But you can manage it better.

Ask for a breakdown, not a percentage. Instead of "how close are you?" ask "what specific tasks are left?" A list of tasks is honest. A percentage is a guess. When a developer says "80% done" they are usually telling you how much of the happy path is built, not how much total work remains.

Accept that estimates get more accurate over time. Week one estimates are based on what the developer knows at the start. By week four, they have discovered the edge cases, hit the unexpected complexity, and can tell you with much more accuracy what is left. Early estimates are directional. Later estimates are plans.

If your developer is communicating what they are discovering along the way, even when it means timelines shift, that is a good sign. The dangerous developer is the one who stays quiet and keeps promising it will be done "next week."

Progress Is Not Linear

Software development does not move in a straight line. The first half goes fast. The second half is where the real engineering happens. That is not a failure of planning. It is the nature of building something that needs to work for real people in real conditions.

The best developers are not the ones who estimate perfectly. They are the ones who communicate honestly when things take longer than expected, and explain why.

If your developer is stuck at 80%, ask them what the remaining 20% actually looks like. The answer will tell you everything about whether the project is in trouble or just in the hard part.

More from the blog

Have a project in mind?

We keep a couple of slots open for the right fit. Tell us about your idea and we will figure out the rest.

Upwork