High Five Studio

October 2026

Progress Bars That Stall at 90% Cut Task Completion 24%

Progress bars that stall at 90% can cut task completion by 24%, showing why honest progress indicators matter for Croatian agencies, SaaS teams, and shops

Progress Bars That Stall at 90% Cut Task Completion 24%

Progress bars are the most mundane interface element in web design, and almost nobody treats them as a design decision worth arguing about. Yet the difference between a bar that completes and a bar that stalls at 90% is measurable in whether people finish what they started. The question for anyone building sites in Croatia — for a Zagreb agency shipping client portals, a Split SaaS team onboarding users, a Rijeka e-commerce shop pushing customers through checkout — is whether the progress indicator is telling the truth, and what happens to completion rates when it isn't.

The 90% problem is a psychology problem wearing a UI costume

A progress bar is a promise. It says: there is an end, it is close, and the remaining distance is knowable. When that promise breaks at the last moment, you don't get mild annoyance. You get a specific, well-documented cognitive reaction that behavioral economists have been mapping for decades.

Goal gradient and the pull of the near-finished

Clark Hull's work on the goal gradient effect, developed in the 1930s and later refined in behavioral psychology, showed that organisms accelerate their effort as they approach a goal. Rats run faster down the final stretch of a maze. Humans behave the same way with loyalty cards, queue positions, and yes, progress bars. The effect is strong enough that researchers have demonstrated people will spend more to complete a nearly-finished task than they would have spent at the outset.

This is good news for interface design, because it means the last 10% of a progress bar is where user motivation peaks. It's also bad news, because it means the last 10% is where disappointment does the most damage. You've spent the user's accumulated momentum and cashed it in for nothing.

Loss aversion applies to progress, not just money

Kahneman and Tversky's loss aversion — the finding that losses loom larger than equivalent gains — is usually taught with money. But it applies to any accumulated state, including a progress bar at 90%. The user has, in their mind, already earned that 90%. Abandoning the task at that point isn't a neutral act; it registers as a loss of work already done. That's why people push through to the end of a bad movie, finish a book they stopped enjoying, and stay in a stalled checkout flow for several seconds longer than they should.

The catch is that loss aversion has a breaking point. Once the perceived loss is already incurred — once the user has decided the task is probably broken — the sunk cost stops pulling and starts pushing. They don't just abandon the task. They leave with a story about your product being unreliable.

Variable-ratio reinforcement, misapplied

B.F. Skinner's variable-ratio reinforcement schedules — where a reward arrives after an unpredictable number of actions — produce the most persistent behavior of any schedule. It's the mechanism behind slot machines, but it's also the mechanism behind email refresh, social feeds, and notification badges. Designers who understand it sometimes try to apply it to progress indicators, thinking that unpredictable updates will keep users engaged.

This is a mistake. Variable-ratio reinforcement works when the reward is the point of the activity. In a progress bar, the reward is task completion, and the user already knows what it is. Making the bar unpredictable doesn't create engagement; it creates distrust. The user isn't playing to see what happens. They're trying to finish a form.

What actually happens at 90%: the completion cliff

The 24% figure in the headline is not a universal constant. It's an order of magnitude, and different studies land in different places depending on the task, the population, and how the stall is defined. But the direction is consistent, and the mechanism is well understood.

A concrete case: the stalled upload

Consider a file upload interface on a Croatian SaaS platform — say, a tool used by accounting firms in Zagreb to submit quarterly documentation. The bar fills smoothly to 90% in four seconds, then stops. The remaining 10% takes twenty-two seconds because the server is doing post-processing: virus scan, format validation, indexing.

From the user's perspective, nothing is happening. From the system's perspective, the most important work is happening. This gap — between perceived and actual progress — is where completion rates collapse.

A commonly cited internal study from a large file-transfer service found that when the progress indicator stalled visibly near the end without explanation, users aborted the upload roughly a fifth to a quarter of the time, even when the upload would have completed within thirty seconds. When the same interface displayed a distinct "processing" state with its own indicator, abandonment dropped by more than half. Same backend. Same wait time. Different interface contract.

The lesson isn't that 24% is a magic number. It's that the last 10% of a linear progress bar is where user patience is thinnest and system latency is often highest, and that combination is expensive.

Why the last 10% is usually the slowest

There's a technical reason progress bars stall at 90%, and it's not laziness on the developer's part. Most real-world tasks have a fast linear phase and a slow non-linear tail:

  • Network transfer finishes quickly; server-side validation does not.
  • Form field entry is fast; payment authorization is not.
  • File parsing is fast; database commit and replication is not.
  • Client-side rendering is fast; third-party API confirmation is not.

A linear progress bar implies linear work. When the work isn't linear, the bar lies. And because the bar is the only feedback channel, the user interprets the lie as a malfunction.

There's also the estimation problem. Predicting the duration of the tail is genuinely hard. Developers often know the first 90% will take a predictable amount of time and the last 10% will take "some amount." Rather than guess, they let the bar sit at 90% and hope. That hope is expensive.

Designing for the tail: honesty over smoothness

The instinct when you learn about the 90% problem is to make the bar smoother — to fake progress so the user never sees a stall. This is almost always the wrong fix.

Fake progress is a debt you pay later

Simulated progress bars, where the bar advances on a timer regardless of actual work, work fine until they don't. The user sees a bar at 95% for forty seconds, then the page fails. Now the bar has not only stalled; it has lied. Trust, once broken this way, is hard to rebuild, and the user's mental model of your product shifts from "sometimes slow" to "unreliable."

There's a place for smoothing — a bar that jumps from 0% to 30% instantly feels broken, so easing the early phase is reasonable. But smoothing the tail is different. The tail is where the user needs information, not reassurance.

Show the work, not the percentage

The most effective pattern is to replace the ambiguous final percentage with a named state. Instead of "90%," show "Validating payment details." Instead of "95%," show "Saving your document." This does three things:

  1. It converts an unknown wait into a known wait. Behavioral research on wait perception consistently shows that explained waits feel shorter than unexplained ones, even when the duration is identical.
  2. It signals that the system is doing something specific, not hanging.
  3. It gives the user a mental model they can reason about. "Validating payment" has a plausible duration. "90%" does not.

This is why the best onboarding flows in Croatian fintech and SaaS products — the ones that hold users through KYC verification, document upload, and account provisioning — tend to abandon the percentage entirely after the first phase. They switch to a checklist or a named stage indicator.

Give the user something to do during the tail

Another pattern that works: during the slow tail, give the user a small, useful task. Confirm an email address. Review the summary of what they just submitted. Set a preference. This does two things at once — it fills the wait with productive work, and it deepens the user's investment in completing the flow, which raises the cost of abandoning.

This is where the goal gradient effect works in your favor rather than against you. The user is already near the end. Give them one more small step that feels like progress, and the pull toward completion gets stronger, not weaker.

Where this connects to competitive play and risk

The 90% problem isn't unique to forms. It shows up anywhere a user is tracking progress toward a goal with uncertain remaining effort — including competitive contexts, which is where the behavioral psychology gets more interesting.

Ranked ladders and the same cliff

Competitive games and gamified platforms use progress indicators constantly: rank progress, season pass tiers, skill rating bars. The same dynamic applies. A player at 90% of a rank who then loses a match and drops to 85% experiences that as a loss, and loss aversion makes it sting disproportionately. Games that handle this well — by softening rank decay, by showing clear remaining milestones, by avoiding visible stalls near thresholds — retain players better than games that don't.

The design principle is the same as in a checkout flow: don't let the user's accumulated progress become a source of anxiety at the moment they're most invested. Make the remaining path legible.

Risk-taking under near-completion

There's a second effect worth noting. Research on decision-making under uncertainty shows that people near a goal become more risk-tolerant — they'll take a chance to close the gap rather than accept a slow, certain path. In a progress bar context, this shows up as users clicking "skip" or "do this later" when a stall appears, even when skipping means losing the work already done.

This is why "Skip for now" buttons near the end of a flow are dangerous. They offer an escape hatch at exactly the moment the user's risk tolerance is highest and their patience is lowest. If the flow can be completed, don't offer a skip at the 90% mark. If it can't, don't pretend it can.

Practical moves for the next build

If you're shipping anything with a progress indicator — a signup flow, a file upload, a multi-step form, a data export — the following are worth doing before the next release.

Instrument the tail separately. Most analytics treat the whole flow as one funnel step. Break out the final 10% as its own event. You'll often find that the drop-off is concentrated there, and it's invisible in aggregate metrics.

Replace percentages with states after the midpoint. Percentages are useful when work is linear and the estimate is reliable. After the midpoint, they're usually neither. Switch to named stages.

Never let the bar appear frozen for more than about two seconds without a state change. If you can't change the bar, change the label. Motion and text changes both signal liveness.

Set a timeout with a real fallback. If the tail takes longer than expected, tell the user what's happening and offer a concrete next step — "We'll email you when this finishes" is better than an indefinite stall.

Test on the slowest realistic connection, not the fastest. Croatian mobile networks vary significantly between Zagreb, the coast, and the islands. A flow that completes in three seconds on office wifi may stall visibly on a ferry. Design for the ferry.

Measure abandonment, not just completion. A flow that completes 70% of the time but abandons 20% at the 90% mark is worse than a flow that completes 65% of the time with steady progress throughout. The second one builds trust; the first one burns it.

The forward-looking version of this is that progress indicators are becoming less about bars and more about contracts. Users increasingly expect to know not just how much is left, but what's happening and whether they can leave. The teams that treat the last 10% as a design problem rather than a technical inevitability will be the ones whose completion rates hold up — and whose users come back for the next task, not just this one.