Skip to main content

Truth, Lies and Progress Bars

By Tyler Sticka

Published on March 4th, 2025

Topics

Very early in my career, I found myself on a design team tasked with improving some legacy security software. At one point, we were evaluating a setup screen that included a progress bar. I asked a member of the engineering team, “How is progress calculated?”

“Oh, it’s complete nonsense,” they replied with a chuckle. Then they explained…

The progress bar filled every few seconds, regardless of actual progress. The first cycle filled by a set amount, then a fraction of that, then a fraction of that (etc.), so the bar would never completely fill on its own. Once the operation actually finished, progress jumped from wherever it happened to be to 100%.

Today, I can spot this sort of trickery a mile away. But at the time, I was young, naive, and a little appalled by this explanation. “You’re lying to the user?” I thought.

Thankfully, I chose to ask a more productive question aloud…

I was told this particular operation was complex, with a lot of different factors that could vary wildly from user to user. This made it challenging to predict ahead of time, and resource-intensive to estimate dynamically.

If they included no progress indicator, or even a repeating animation like a spinner or indeterminate “barber’s pole” bar, users might worry some aspect of the process had stalled or crashed. They might cancel the operation unnecessarily.

It was decided that a fictional progress bar was a necessary evil. By demonstrating some amount of forward momentum, users felt more confident that the operation was continuing as intended, with fewer abandoning the setup process.

I had mixed feelings about that explanation.

On one hand, the artificial progress indicator solved some of the challenges the team described. It exposed me to the concept of perceived performance and reminded me to always question assumptions.

On the other hand, making stuff up felt like the lowest possible bar to reach.

Thankfully, I’ve since had plenty of opportunities to design more forthcoming progress indicators within similar constraints. The process is always the same:

  • Collaborate with engineering to detail exactly how the operation works.
  • Research and understand the context for this step, its role in the user’s journey.
  • Visualize progress based on knowns rather than unknowns.

Sometimes, you’ll discover more accurate estimation is possible, and worth a small amount of performance loss to provide overall clarity to the end user:

Two progress bars. The first is labeled "Preparing," with an indeterminate, striped appearance. The second is labeled "33% complete" with "18 minutes remaining," the bar filled by the corresponding amount.

Other times, an ETA just isn’t feasible or appropriate. If you know what step of the operation you’re on and how many remain, you can visualize total progress without relying on time:

Three loading steps, the first completed (with a checkmark), the second in progress (with a spinner), the third yet to begin.

If the total number of steps isn’t knowable, counting the number of completed steps so far reassures users that progress is happening:

An indeterminate spinner accompanied by the text 'Hang tight…' and '672 steps completed so far'

Even when all else fails, be honest. And if you can, make it fun:

Another indeterminate spinner with the text 'Grab a coffee, this might take a while. Play a game to pass the time?' Below this text is a version of the card game 'Memory' in progress.

Comments

Tracy-Gregory Gilmore said:

Hi Tyler, I fully understand where you are coming from here. I operate more on the other side, as a UI developer, and frequently have discussions like this. Having a fake progress bar has never sat right for me. In addition to the fact it is lying to the user, there is also the issue they completely fail to report when the process has stalled/failed for a reason, leaving the user with a false expectation.

From a technical perspective, the backend process needs to periodically issue progress reports, which is seldom possible. This would at least enable the UI to report step/stage progress. Only when the duration of each step (or the entire process) can be reliably and efficiently estimated can a progress bar be trusted. However, it is so often the case that timings are either unpredictable or it is just not efficient to calculate.

Leave a Comment

Please be kind, courteous and constructive. You may use simple HTML or Markdown in your comments. All fields are required.