Color in SaaS Design: Choosing a Palette That Works
Choose a SaaS palette by role and by contrast, not by what a color is supposed to make people feel. Popular color psychology ("blue means trust, orange drives clicks") rests on weak evidence, and the same blue sits on a bank, a social network and a project tool. What you can measure is contrast, and the rules are specific. WCAG 2.2, read on w3.org on 6 October 2026, requires 4.5:1 for normal text, 3:1 for large text and 3:1 for interface components such as button borders, focus rings and chart lines, and says color must never be the only way information is shown. So start with one neutral ramp, one brand accent and a set of status colors, then test every pair you actually use. Our own lime, #93E200, scores 12.37:1 on our near-black and 1.6:1 on white: a great button fill, unusable as text on a light page. That is the kind of answer that decides a palette.
What color psychology can and cannot tell you
Key Takeaways
- Assign colors to roles and test actual foreground/background pairs.
- Apply each WCAG criterion with its definitions and exceptions.
- Keep status understandable without color alone.
- A passing pair does not establish accessibility of the whole interface.
The first version of this post opened with the claim that the right palette improves engagement, retention and conversions "by up to 26%," and a table assigning emotions to colors. We have removed both. We could not trace the number to a study, and the emotion table does not survive contact with real products: blue is the color of banks, of social networks and of half the SaaS tools on the market, which is exactly why it no longer signals anything in particular.
What holds up is weaker and more useful:
- Associations are learned, and they are local to a category. In a category where everyone uses calm blues, calm blue reads as "one of these." Color signals by contrast with competitors, not by some universal meaning.
- Culture changes meaning. Red is a warning in one market and a celebration in another. If you sell internationally, test with people from those markets rather than looking it up in a chart.
- Consistency builds recognition. The color you use for your primary action, every time, becomes the color people look for. That is learning, not psychology.
ILTY, an AI mental-health companion we designed, is the clearest example we have of choosing by category contrast. Most apps in that space use light backgrounds and soft pastels. ILTY went the other way: pure black (#000000), a warm beige accent (#E8DCC4) used sparingly for primary actions, and one strong color per AI companion, used only where that companion appears. The goal was to feel intimate rather than clinical, and to stop looking like every other app on the shelf. The full system, eighteen brand colors in all, is in the ILTY branding case study.
The numbers that are not opinion
These are relevant WCAG 2.2 criteria. Contrast Minimum explains text requirements; the understanding index links the non-text contrast and use-of-color criteria with their definitions and exceptions:
| Criterion | Level | Requirement |
|---|---|---|
| 1.4.3 Contrast (Minimum) | AA | Text at least 4.5:1; large-scale text at least 3:1 |
| 1.4.11 Non-text Contrast | AA | Interface components, their states, and graphics needed to understand content at least 3:1 against adjacent colors |
| 1.4.6 Contrast (Enhanced) | AAA | Text at least 7:1; large-scale text at least 4.5:1 |
| 1.4.1 Use of Color | A | Color is not the only visual means of conveying information, indicating an action, prompting a response or distinguishing an element |
"Large-scale" text is at least 18 point, or 14 point bold. Logos and purely decorative text are exempt. Most teams aim for AA. Treat these numbers as requirements rather than suggestions.
The ratio itself comes from a formula the W3C publishes: convert each color to relative luminance, then divide the lighter by the darker, each plus 0.05. You do not need to do it by hand, but you do need to run it on every pair in your palette, not only the ones that look risky.
Worked example 1: the SUUR palette
Our site uses one accent, lime #93E200, on a near-black (#0A0A0A) and light neutrals (#F5F5F5, #FAFAF8), with a muted gray (#6B6B6B) for secondary text. We ran every pair through the WCAG formula:
| Pair | Ratio | Result |
|---|---|---|
| Lime #93E200 on near-black #0A0A0A | 12.37:1 | Passes AA and AAA for text |
| Near-black text on a lime button | 12.37:1 | Passes AA and AAA |
| Lime #93E200 on white #FFFFFF | 1.60:1 | Fails for text and for components |
| Light #F5F5F5 text on near-black | 18.16:1 | Passes AAA |
| Muted #6B6B6B on light #F5F5F5 | 4.89:1 | Passes AA for body text, narrowly |
The lesson is the third row. A bright accent can be excellent and useless at the same time, depending on what is behind it. On dark sections lime can carry text and metrics. On light sections it works as a fill under dark text, or as the underline beneath dark link text, and anywhere it appears as text on a light surface it fails. A brand color is not one decision; it is one decision per background.
Worked example 2: the ILTY palette
ILTY's palette is darker and warmer, and its risks sit in different places:
| Pair | Ratio | Result |
|---|---|---|
| Beige #E8DCC4 on black #000000 | 15.47:1 | Passes AAA |
| Teal #5EC6B0 on black | 10.18:1 | Passes AAA |
| Orange #E8945A on black | 8.81:1 | Passes AAA |
| Blue #7B93DB on black | 7.04:1 | Passes AAA |
| Purple #8B5CF6 on black | 4.96:1 | Passes AA for text |
| Purple #8B5CF6 on dark surface #1A1A1A | 4.11:1 | Fails for body text; passes for large text and components |
The last two rows are the trap. The same purple passes on the page background and fails on a card one step lighter. Dark interfaces use layered surfaces for depth, and every layer changes every ratio. Test the accent against each surface it can appear on, not only the base background.
Build the palette as roles, not swatches
A SaaS palette that survives a year of feature work is organised by job:
- Neutrals. A ramp of eight to ten grays for backgrounds, surfaces, borders and text. This is most of the interface, and most contrast failures live here, in light gray text and faint borders.
- One brand accent. For the primary action and the few things you want people to find. More accents dilute the signal.
- Status colors. Success, warning, error and information, each checked for 3:1 as a component and 4.5:1 if it ever carries text. Pair each with an icon or a label, because 1.4.1 forbids color alone.
- Data colors. Charts need a separate set that stays distinguishable from each other and from status colors, with lines and segments at 3:1 against the background.
- A dark mode as a second palette. Not an inversion. Accents usually need adjusting, and every surface layer needs its own check.
Put all of it in design tokens with names that describe the job (text-muted, surface-raised, status-error), not the hue. When you change a color later, the role stays and the ratios get rechecked in one place. If you are setting this up from scratch, what a design system is covers the token layer.
How to test a palette in an afternoon
- List every foreground and background pair your product actually uses. Include hover, focus, disabled and selected states.
- Run each pair through a WCAG contrast checker or the W3C formula, and record the ratio next to the token.
- Mark anything under 4.5:1 that carries normal text, and anything under 3:1 that a user has to see to operate the interface.
- Search the interface for places where color alone carries meaning: status dots without labels, chart series told apart only by hue, links with no underline.
- Look at the product in grayscale. If you can still use it, color is supporting the design rather than holding it up.
Use the brand contrast checker to examine pairs, then inspect them in the actual interface. Grayscale is only a diagnostic; it does not simulate every color-vision difference or replace checking contrast, labels and interaction.
The short answer
Do not choose SaaS colors from an emotion chart. Choose a neutral ramp, one accent and a set of status colors by role; make the accent distinct from your category's defaults; then test every real pair against WCAG 2.2: 4.5:1 for text, 3:1 for large text and interface components, and never color alone. Recheck each accent on every surface it touches, because a color that passes on one background can fail on the next.
The ratios are calculations from the stated hex pairs, not a full accessibility audit. The W3C contrast explanation links the relative-luminance definition. Non-text contrast applies to required visual information about controls, states and essential graphics under its exceptions, not every decorative border.
Have a product idea?
Designed, built, and shipped in about 5 days.