Skip to content
ChromaBrew
Design systems

How to build a color palette for a SaaS dashboard

A practical walkthrough for building a SaaS dashboard color palette: surface stack, semantic roles, status colors, chart palettes and WCAG checks — from one brand color.

Why dashboards are the hardest test for a palette

A marketing page gets three colors and a gradient. A dashboard gets twenty surfaces, four chart series, five status states, disabled everything, and a sidebar — all visible at once, all day. A palette that looks great in a hero section collapses under that load: two 'neutral' grays fight each other in adjacent panels, the warning yellow vibrates against a tinted background, and the primary blue appears in four roles with no hierarchy.

The fix is not more colors. It is fewer colors with explicit jobs. A dashboard palette works when every value is a derived step or a named role — never a swatch someone liked in isolation. That discipline is what the rest of this guide builds.

Tip

Count the roles, not the colors. Most SaaS dashboards run on one brand hue, one status set (success/warning/danger/info), and a neutral surface stack — usually under 20 values total once tints are derived.

Start with the surface stack, not the brand color

Start where users spend their time: the background stack. A dashboard typically needs four to five neutral layers — app background, card surface, raised surface (popovers, dropdowns), sidebar, and input fills. Each step should be distinguishable at a glance but never louder than the content on top of it.

Build the stack as a cool or warm neutral scale rather than pure grey. Pure #808080 grey reads as dead next to a brand hue; a neutral nudged toward your brand's temperature makes the whole product feel intentional. In light mode the stack climbs from near-white to mid-grey; in dark mode it inverts in elevation logic — raised surfaces get lighter, not darker.

  • App background: the quietest layer — tinted white in light mode, tinted near-black in dark mode
  • Card surface: one step up from the background; the difference should be felt, not scrutinized
  • Raised surface: popovers, menus, tooltips — lighter than cards in dark mode
  • Borders: one step of separation; hairlines, never outlines
  • Input fills: distinguishable from their container so fields read as fields

Map the brand color to one clear role

The brand color's job on a dashboard is navigation and action: primary buttons, active nav items, links, focus rings, selected states. It is not the color of every icon and heading — that is how dashboards lose hierarchy.

Derive a full 50–950 scale from your brand hue so each of those jobs gets its own step. Active nav might take the 600 step on a tinted 100 background; a primary button takes 600 with a 50-step label; hover darkens to 700. Because the steps come from one perceptual scale, they always look like siblings.

:root {
  --brand-50:  #eef5ff;
  --brand-100: #dbe7ff;
  --brand-500: #3a86ff;
  --brand-600: #1f6cff;
  --brand-700: #0f53e0;
  --color-primary: var(--brand-600);
  --color-primary-hover: var(--brand-700);
}

Status colors are semantic, not decorative

Success, warning, danger and info appear in badges, toasts, chart series and inline validation — often simultaneously. Give each one a fixed semantic token and never reuse a status color for decoration, or the signal dilutes.

Two constraints decide whether a status set works. First, each color needs a light-mode and dark-mode variant: a green that reads 'success' on white turns into sludge on a dark surface unless it is lightened and re-tuned. Second, any status color that carries text must pass contrast on its badge background — a pale green pill with white text is the classic failure.

  • Success: green family — passes contrast as text on a tinted badge
  • Warning: amber family — the hardest to make accessible; darken for text, keep the bright step for icons only
  • Danger: red family — strong at a glance, so keep usage rare to stay meaningful
  • Info: blue family — must be visually distinct from your brand blue, or pick a different info hue entirely

Chart colors: distinct beats beautiful

Dashboard charts need four to six categorical colors that are distinguishable at 12-pixel line widths and similar chroma levels. A palette where one series is neon and the rest are muted biases every reading of the chart.

The reliable recipe: pick hues spread evenly around the wheel (analogous sets are too close for data), equalize lightness so no series dominates, and reserve the brand color for the one series that is 'yours' — typically the primary metric. Then check the set against color-blindness simulation; red/green pairs that pass casual inspection fail deuteranopia readers.

Dark mode is a second palette, not a filter

The most common dashboard dark-mode failure is applying an inversion filter and shipping. Dark mode needs its own tuned values: surfaces lighten with elevation, the brand hue desaturates slightly so it doesn't glow against dark backgrounds, and status colors shift lighter while keeping their hue identity.

The dark theme should be generated from the same seed as the light theme so the two stay siblings — then graded by the same contrast rules. Text-on-surface pairs in dark mode often need more care than light mode, because the eye's sensitivity curve is different at low luminance.

The whole palette on one page

Pull the pieces together. One brand hue drives the primary scale; neutrals form the surface stack; status colors get semantic tokens; charts take a distinctness-checked set; dark mode is generated, not filtered. Every text/background pair passes WCAG AA before anything ships:

:root {
  --background: #f7f8fa;
  --surface: #ffffff;
  --surface-raised: #ffffff;
  --border: #e2e5ea;
  --foreground: #16181d;
  --primary: #1f6cff;
  --success: #16a34a;
  --warning: #d97706;
  --danger: #dc2626;
  --info: #0891b2;
}

Tip

Save the system as a share link once it passes. The URL encodes the whole configuration — your future self (or a teammate) reopens the exact palette without an account or a Figma file.

Related free tools

Want to apply this right now? Open the color palette generator and try it with your own brand color — free, no sign-up.