Most "website color scheme" advice falls apart the moment you open a real design file. You pick three pretty swatches from a generator, drop them into a layout, and within an hour you're improvising a fourth color for the error message, a fifth for the muted caption text, and a sixth because the original brand blue is unreadable on white. The problem isn't your taste. It's that a website doesn't need a palette of pretty colors — it needs a small, layered system where every color has a job.
I've shipped enough interfaces to know the gap between "I love these colors" and "this site is usable." This guide is the method I actually use to get from one to the other, and how to assemble it from a palette you generate rather than guessing in the dark.
How many colors a website really needs
Far fewer than people think, and far more than three.
The confusion comes from conflating hues with colors used in the UI. A clean site might be built from only two or three hues — say a brand blue and a warm gray — but those expand into fifteen-plus actual values once you account for backgrounds, borders, text at different emphasis levels, hover states, and so on. So the honest answer is: aim for one or two real hues plus a disciplined set of neutrals, then derive everything else.
If you find yourself reaching for a genuinely new, unrelated hue, pause. Nine times out of ten you don't need another color — you need a lighter or darker version of one you already have. That single habit prevents the muddy, circus-tent look that screams amateur.
The layered set: assign a job to every color
Think in layers, not in a flat row of swatches. Here's the structure I build every time, top to bottom.
1. The primary / brand color
This is the color a visitor would name if you asked what your site "is." It carries personality and should appear on the things you most want noticed — the logo, primary buttons, active navigation. Pick this first, because everything else reacts to it.
One warning from experience: a saturated brand color is almost never readable as body text or usable as a large background. Stripe's purple, Spotify's green, GitHub's near-black — in practice these brands use their signature hue sparingly and lean on neutrals for the other 90% of the surface. Your brand color is a spice, not the meal. If you're choosing the hue from scratch, the emotional associations matter, and The Psychology of Color in Branding is a better place to reason about which hue than any generator preview.
2. A neutral / background ramp
This is the unsung hero of every professional-looking site, and the layer beginners skip. You want a ramp of neutrals — not one gray, but a gradient of five to eight steps from near-white to near-black. Something like #FFFFFF, #F7F8FA, #EBEDF0, #D2D6DC, #9AA0A8, #4B5159, #23272E.
Pure gray (equal R, G, B) is fine, but a tinted neutral feels more intentional — nudge the hue a few degrees toward your brand color and drop the saturation to around 5–10%. A blue-leaning gray under a blue brand reads as "designed"; a dead neutral gray reads as "default Bootstrap." Use these steps for page backgrounds, card surfaces, dividers, and disabled states. The mechanics of generating a consistent ramp are worth understanding properly — see Tints, Shades, and Tones Explained.
3. Readable text colors (and the contrast rule that governs them)
Body text is rarely pure black on pure white — #000000 on #FFFFFF can feel harsh and cause a vibrating, fatiguing effect for some readers. I usually set primary text around #1A1D21 and define two more tiers: secondary text near #5A6068 for captions and metadata, and a disabled/placeholder gray near #9AA0A8.
But the real constraint here isn't aesthetic, it's measurable. Per the W3C's WCAG guidelines, normal-size body text needs a contrast ratio of at least 4.5:1 against its background to meet Level AA; large text (roughly 24px, or 18.66px bold) only needs 3:1. That secondary gray you liked? Check it. The most common accessibility failure I see is light-gray "subtle" text on white that lands around 2.8:1 — pretty in the mockup, illegible in sunlight. Run every text-on-background pair through the WCAG contrast checker in the color palette generator before you commit. If you want to understand what the ratio actually measures and why 4.5:1 is the line, WCAG Contrast Ratios Explained goes deeper.
4. An accent / CTA color
Here's a counterintuitive move: your call-to-action color is often not your brand color. If your brand is blue and your primary buttons are also blue, the "Buy now" button competes with every link and header for attention. A distinct accent — frequently a complementary or split-complementary hue — makes the one action you care about pop off the page.
Generate this deliberately. Drop your brand hue onto the wheel, switch to a complementary or split-complementary harmony, and you'll get a candidate that's tense enough to draw the eye without clashing. A blue brand (#2563EB) pairs cleanly with a warm amber or coral accent (#F59E0B / #F97316) for the primary CTA. Reserve this color almost entirely for conversion moments — the second you use it for decoration, it stops meaning "click here."
5. Semantic state colors
Every real interface eventually needs to say success, warning, error, and info. Most people borrow the obvious defaults — green, yellow, red, blue — and stop there, which causes two problems.
First, the textbook red and green clash with carefully chosen brand colors and look like a separate, louder design language bolted on. The fix is to pull those hues toward your palette's overall saturation and warmth so they feel like family. Aim for something like success #16A34A, warning #D97706, error #DC2626, info #2563EB, then dial saturation to match your other colors.
Second — and this matters more — never rely on color alone to communicate state. Roughly 1 in 12 men and 1 in 200 women have some form of color vision deficiency, and red/green is the classic confusion. Always pair the state color with an icon, a label, or a shape. A red border and an "✕ Required field" message. A green check and the word "Saved." This is a WCAG requirement, not a nicety, and it's the single highest-leverage accessibility habit you can build. If your audience or product is color-sensitive, Color-Blind-Friendly Palettes covers how to test for this directly.
6. Link, hover, and focus colors
The smallest layer, and the one that separates polished sites from sloppy ones.
- Links usually take the brand color, but verify the contrast against the surface they sit on — a brand color tuned for buttons is often too light for inline text links.
- Hover should be a derived shade, not a new color: take the base and shift lightness down by 8–12% in HSL. Consistent, predictable, free.
- Focus rings are non-negotiable for keyboard users. WCAG 2.1 also requires UI components and their states to hit a 3:1 non-text contrast ratio, so a faint focus outline that "looks clean" but barely shows up is a failure. Make it obvious.
Assembling it from a generated palette
Here's the workflow that turns a generator's output into the system above, rather than five swatches you have to rescue later.
Start by locking your brand hue on the wheel. Use a harmony rule to propose, not dictate — analogous if you want a calm, cohesive feel; complementary or split-complementary if you need a punchy accent. (If you're torn between schemes, Split-Complementary vs Triadic Palettes breaks down the trade-offs.) Copy the brand hex and the accent hex; those are layers 1 and 4.
Then build neutrals deliberately. Take your brand hue, drop saturation to about 8%, and use the HSL readout to step lightness from ~98% down to ~14% in five or six stops. That's your entire neutral ramp — layer 2 — and because it shares the brand's hue, it'll feel unified instead of grafted on. Derive text colors from the dark end of that ramp (layer 3), and check each against its background with the contrast tool until every pairing clears 4.5:1.
For semantic states, generate green/amber/red/blue separately, then nudge their saturation in the HSL fields to sit alongside your palette rather than shouting over it. Finally, derive hover and focus values by shifting lightness on colors you already have — no new hues required.
The reason to work in HSL throughout is that it makes "a bit lighter" or "a touch less saturated" a single-number change instead of a guessing game across three RGB channels. If that representation is new to you, Hex, RGB, and HSL Color Codes Explained is worth ten minutes.
One step that saves you a redesign
Before you fall in love with any scheme, paste your final values into a gray, text-heavy wireframe — real headings, real paragraphs, real buttons — and look at it for a full minute. Color always seduces in a swatch grid and disappoints in a layout, because context, surrounding neutrals, and proportion change everything. The 60-30-10 rule gives you proportions worth respecting here: mostly neutral, a meaningful amount of brand, a small jolt of accent.
A website color scheme isn't a set of colors you like. It's a set of decisions — what's brand, what's surface, what's readable, what's click here, what's "something went wrong" — each one assigned, tested, and reused with discipline. Get the jobs right and almost any tasteful palette will work. Skip the jobs and even a beautiful palette will fight you on every screen.
Frequently Asked Questions
How many colors should a website use?
Aim for one or two real hues — a primary brand color plus an accent — supported by a ramp of five to eight neutrals derived from a single gray. Those few hues expand into roughly 15 actual values once you account for backgrounds, borders, text tiers, hover states, and semantic colors. If you find yourself reaching for a genuinely new, unrelated hue, you almost always need a lighter or darker version of an existing color instead.
Should my call-to-action button use my brand color?
Often no. If your brand color is also your link color, header color, and button color, your primary CTA has nothing to stand out against. A distinct accent — frequently a complementary or split-complementary hue to your brand — makes the one action you care about pop. Reserve that accent almost exclusively for conversion moments so it keeps meaning 'click here.'
What contrast ratio do my website text colors need?
Per WCAG 2.1/2.2 Level AA, normal body text needs at least a 4.5:1 contrast ratio against its background, and large text (about 24px, or 18.66px bold) needs at least 3:1. User interface components and their states, like focus rings and input borders, need at least 3:1. Check every text-on-background pair with a contrast checker before committing — light-gray 'subtle' text on white is the most common failure.
How do I make my error and success colors fit my palette?
Start from the conventional hues (green, amber, red, blue) but pull their saturation and warmth toward the rest of your palette so they read as family rather than a bolted-on set. Crucially, never rely on color alone to signal state — pair every state color with an icon, label, or shape so the meaning survives for the roughly 1 in 12 men with color vision deficiency. That's a WCAG requirement, not just good manners.
Why build my neutrals from my brand color instead of plain gray?
A pure gray ramp looks like an untouched framework default. If you take your brand hue, drop saturation to around 5–10%, and step the lightness to create your grays, the neutrals subtly echo the brand and the whole interface feels intentional and cohesive. Working in HSL makes this a one-number adjustment rather than juggling three RGB channels.
Want to experiment with colors?
Try our free color palette generator to find your perfect harmony — with a built-in WCAG contrast checker.
Open the Generator