Loading States and Perceived Speed — Why Feedback Matters More Than Milliseconds
Users judge speed by whether the interface responds, not by a stopwatch. Learn how spinners, skeleton screens, and optimistic updates change perceived speed, and how to find the moments where your product feels frozen.
Short answer: an action that takes two seconds with immediate feedback feels faster than one that takes one second with none. If a user clicks and sees nothing, they assume it failed and click again. Acknowledge every action instantly, show the shape of what is loading, and tell the user what is happening on longer waits. Find the gaps by looking for repeated clicks on the same control.
Table of Contents
- Actual Speed and Perceived Speed
- How Long Is Too Long
- Types of Loading State
- Finding Frozen Moments
- Common Mistakes
- Key Takeaways
Actual Speed and Perceived Speed
Actual speed is measured in milliseconds. Perceived speed is the user's experience of waiting, and it depends on whether they can tell something is happening.
Uncertainty makes a wait feel longer. A blank screen with no sign of progress prompts the question "is it broken?" within a second or two. The same wait with a clear indication of progress is tolerated.
You should still make things faster. But feedback is often cheaper to add than real speed, and both matter.
How Long Is Too Long
Widely used rules of thumb:
| Delay | How it feels | What to show |
|---|---|---|
| Up to about a tenth of a second | Instant | Nothing extra |
| Up to about a second | Noticeable, flow unbroken | A pressed or busy state on the control |
| One to several seconds | Attention wanders | A spinner or skeleton |
| Around ten seconds or more | The user gives up or switches away | Progress, an explanation, a way to cancel |
Responsiveness is what the INP metric measures: the time from an interaction to the next visual update (what INP is). A visible change within a fraction of a second is the target.
Types of Loading State
| Pattern | Best for | Caution |
|---|---|---|
| Button busy state | Any action that takes a moment | Disable to prevent double submission |
| Spinner | Short, unknown waits | Says nothing about how long |
| Skeleton screen | Loading content with a known layout | Must match the final layout or it causes a jump |
| Progress bar | Long operations with measurable progress | A bar that stalls is worse than none |
| Step messages | Multi-stage work | "Uploading… Processing… Almost done" |
| Optimistic update | Actions that nearly always succeed | Needs a clean way to undo on failure |
| Background processing | Very long jobs | Let the user leave and notify them when done |
Skeleton screens show grey placeholders in the shape of the content. They signal that the page is on its way and reduce layout shift, since the space is already reserved.
Optimistic updates show the result at once and confirm with the server afterwards. A "like" that fills in immediately feels instant. Use it where failure is rare and reversible.
Finding Frozen Moments
Slow, silent interactions leave a clear trace: the user repeats the action.
- Rage clicks. Bursts on one button usually mean no feedback was given (how they are detected).
- Repeated submits, sometimes producing duplicate records.
- Recordings. Watch for a click followed by stillness, then another click.
- The network timeline in a recording shows how long the request really took.
- Real-user INP by page, on mobile (performance).
- Abandonment during a wait. Sessions that end while a request is pending.
In DeepSync, session rows show rage-click counts, Highlights jump to those moments, and replays include the network timeline, so you can see the click, the slow request, and the second click together.
Common Mistakes
- No feedback on click. The single most common cause of duplicate submissions.
- A spinner over the entire page for a small update.
- Spinner with no end. A request failed and nothing handles it. Always have a timeout and an error state.
- Skeletons that do not match the content, causing a jump when it arrives.
- Flashing loaders. A spinner shown for a tenth of a second is distracting. Delay showing it slightly.
- Blocking the interface while something loads that the user does not need yet.
- Fake progress bars that race to 90% and wait.
- Losing the user's place when content finishes loading.
- Testing only on fast connections. Throttle the network and try again.
Throttle your connection and use your own product
Set your browser to a slow mobile profile for ten minutes. Every place you find yourself clicking twice needs a loading state.
Key Takeaways
- Feedback makes waiting tolerable; silence makes it feel broken.
- Acknowledge every action immediately.
- Match the loading pattern to the length and type of wait.
- Repeated clicks reveal where feedback is missing.
Conclusion
Users forgive a short wait they understand. They do not forgive a click that seems to do nothing. Make sure your product always answers.
Frequently Asked Questions
Related articles
Stay in the loop
Get the latest insights on product analytics and user behavior delivered to your inbox.



