Patterns
Notification messaging
A decision framework for choosing the right notification pattern for errors and success outcomes.
Notifications tell users what happened after an action. Getting the pattern right — and making sure it’s actually perceivable — is what separates a confirmation a user notices from one that quietly fails them.
Choosing a pattern
Interactive decision tree for choosing a notification pattern. Each node links to its matching guidance section below — activate a node to jump straight to the details. A linear text version of the same logic follows the diagram.
ERRORSUCCESSFORMSYSTEMMINIMALRICHMINIMALRICHYESNO
I need a notification
What kind?
Where does the error belong?
How much context is needed?
How much context is needed?
Does the action produce a visual change?
View decision tree as text
- I need a notification — what kind?
- Error — where does it belong?
- Form → Inline validation
- System — how much context is needed?
- Minimal → Error banner
- Rich → Dedicated page
- Success — how much context is needed?
- Rich → Dialog or success page
- Minimal — does the action produce a visual change?
- Error — where does it belong?
The decision diagram needs more room than this screen has — here's the same logic as a list:
- I need a notification — what kind?
- Error — where does it belong?
- Form → Inline validation
- System — how much context is needed?
- Minimal → Error banner
- Rich → Dedicated page
- Success — how much context is needed?
- Rich → Dialog or success page
- Minimal — does the action produce a visual change?
- Error — where does it belong?
Error messages
Key considerations:
- Try to prevent errors as much as possible. Through information architecture, form design and copy, give users enough guidance to avoid error messages being triggered.
- Error messages should always be persistent. It is crucial to let users read through and understand the error as well as the next steps.
Inline validation
- Write a hint text that appears before interaction.
- Validate when the user leaves the field, not on every keystroke. Showing errors while the user is still typing is frustrating and premature. For form submission, validate all fields at once and move focus to the first error — or to a summary at the top if there are many.
- Put the error directly below the input it belongs to, never above it or far away. This matters for screen magnification users who may only see a small portion of the page. Visually, use an icon alongside the colour — never colour alone — so the state is clear to users with colour blindness.
- If the user submits the form and multiple fields are invalid, move focus programmatically to the first invalid field.
Error banner
- Never auto-dismiss this banner. A persistent error must stay until the user explicitly closes it or the underlying problem is resolved by their action.
- Write the message with a clear next step, not just a description of what went wrong. “An error occurred” is not actionable. “Your session has expired — sign in again to continue, your draft has been preserved” tells the user exactly what happened and what to do about it.
Dedicated page
- Focus on the user flow. Design messaging and calls to action to support the user in resolving the problem, or at minimum understanding their immediate next step.
- Write the message with a clear next step, not just a description of what went wrong. “An error occurred” is not actionable. “Your session has expired — sign in again to continue, your draft has been preserved” tells the user exactly what happened and what to do about it.
- Use space wisely. Having a lot of space lets you add more context and a few CTAs. But don’t overload it!
Success messages
Key considerations:
- Does the user need to do something with this outcome right now? If yes — put “copy a key”, “share a link”, “confirm a detail” on a banner, dialog, or a dedicated success page. If no, and the UI already reflects the change, a visual update is enough.
- Is there meaningful context that changes what the user does next? A scheduled email isn’t just “scheduled” — it’s “scheduled for Tuesday at 9am to 4,200 recipients.” That context shapes the user’s next action, or an extra message you may want to add, like “edit or cancel any time before 9am” or “you’ll see updated email status once all recipients receive the email.”
- Could the user reasonably want to undo or follow up on this? If so, surface those actions explicitly in the dialog or page rather than hoping they find them elsewhere. A good example of a follow-up is Jira letting you create multiple tickets one after another without leaving the creation modal. Note: if a critical action can’t be undone, let the user know beforehand.
- When you’re unsure about the pattern, follow the growth-in-complexity rule — start with the lightest pattern that communicates the outcome:
- If you find yourself wanting to add a second sentence to a banner, or a second action, that’s the signal to move up to a dialog.
- If the dialog starts needing tabs or a long list of details, consider a dedicated page instead.
- Complexity in the confirmation is usually a sign that the action itself was complex — honour that rather than compressing it into a format too small to hold it.
Dialog or success page
- Use a dialog when the action has immediate consequences the user needs to understand before moving on. A notification says “done.” A dialog says “here’s what done means, and here’s where you go from here.” Examples:
- Publishing content that immediately goes live to an audience (“Your post is live — view it, share it, or return to drafts”).
- Completing a multi-step process where the user might not know what happens next (“Your account has been created — check your email to verify before you can invite teammates”).
- Destructive actions that succeeded and have downstream effects (“Your workspace has been deleted. All members have been notified and will lose access at midnight”).
- Use a success page when the action is the end of a flow and there’s no sensible “back” state. The user has crossed a threshold and the previous context no longer makes sense:
- Submitting an application or a form that can’t be edited (“Your application has been submitted — you’ll hear back within 5 business days”).
- Finishing onboarding (“You’re all set — here’s what to do first”).
- Account deletion (“Your account has been closed — here’s a summary of what was deleted”).
Persistent dismissible banner
- Banner should only be used for short “success acknowledgement”, with a maximum of one action element like a link or a secondary button. More context requires more real estate and should be turned into a dialog or a page.
- Use a banner for actions with no visual echo — for example when changing settings or making edits that are hidden inside menus or may not be visible after a page refresh. The user needs an explicit signal that stays until they’ve acknowledged it.
- Use a banner for actions with important metadata. “Scheduled” isn’t enough — “Q3 Newsletter scheduled for Tuesday 29 April at 9:00am” is what the user actually needs to verify they set the right time. A banner holds that information as long as the user needs to read it.
- Use a banner for reversible actions where undo is the next likely step. If there’s a meaningful chance the user will want to undo immediately after — bulk-archiving items, moving content to a different space, applying a template that overwrites something — the banner is the right place to surface that action.
Visual animation only
- Can be used without an extra success confirmation only if all three of the following criteria are met:
- the result of the action is immediately visible;
- the result of the action is unambiguous;
- the result of the action is in the user’s current viewport.
- Cases where visual feedback alone is sufficient:
- Adding an item to a list, when the list is visible and the new item appears with a brief highlight or scroll-into-view animation. The item’s presence is the confirmation.
- Deleting an item, when the remaining items visibly shift up to fill the gap. The absence plus the reflow communicates success. You still need an
aria-liveregion for screen reader users — but no visible notification is required. - Reordering via drag-and-drop. The item lands where the user dropped it. The new order is the confirmation.
- Toggling a setting. A toggle that visibly flips state, or a checkbox that becomes checked, is self-confirming. No banner needed.
- Saving a draft, when a “Last saved” timestamp updates visibly in the UI near the editor. The timestamp change is the confirmation.
- Loading new content after a loader. The loader disappears and the content appears. The transition itself communicates completion.