Design Background Jobs and Long Tasks
Feedback & States · loading, status, notifications
Updated 2026-07-28
- Let the user leave. Once a task takes longer than a few seconds, holding them on a screen with a spinner is a design failure rather than a technical necessity.
- Confirm acceptance separately from completion. "Import started" and "Import finished" are two different messages and users need both.
- Give every long task a place to live. A jobs panel, an activity list, or a status row means progress is never lost just because a tab was closed.
- Show progress that reflects reality:
- A count of items processed when you know the total.
- A current step name when you do not.
- An honest "this can take a few minutes" when you know neither.
- Report partial results rather than a single pass or fail. Twelve of five hundred rows failing should produce twelve fixable errors, not a rejected import.
- Tell the user when it is done in a way that survives them looking away. An in-page toast is not enough for a job that outlasts the session, so use a notification, a badge, or an email as appropriate.
- Make jobs cancellable, and say what cancelling does to work already completed. Users need to know whether they are stopping or undoing.
- Never start a heavy task without warning on a metered connection or a low battery device, and never start one twice because the button did not respond.
A long task is a small workflow with its own states, not a loading spinner that lasts longer.
Related guides