Theme development
Shopify color_palette setting: replace color schemes (2026)
Shopify's new color_palette setting type replaces color schemes as the recommended way to model a theme's colors. Here's the schema, the Liquid, and when to migrate.
Bas Lefeber
Founder, learnshopify.dev · June 19, 2026 · 7 min read
On June 17 2026, as part of the Spring '26 Edition, Shopify shipped a new theme setting type: color_palette. It's a flat, named set of colors that a merchant edits in one grid, and every color setting in the theme can point at it. More importantly, Shopify now recommends it over color schemes as the way to model a theme's color system for new themes. If you've spent the last few years wiring up color_scheme_group and role maps, this is a meaningful simplification.
This post covers what the setting is, the exact schema it expects, how to reference palette colors as defaults from individual settings, what changes for merchants, and when (and when not) to migrate an existing theme. For the wider context of what else shipped, see our Spring '26 Edition rundown for developers.
The short version
color_palette is a new theme setting type (Spring '26) that defines 2 to 20 named colors as a single editable grid in the theme editor. Individual color and color_background settings can use a palette color as their default via {{ settings.colors.key }}, so one change propagates everywhere. Shopify recommends it over color schemes for new themes. Existing color-scheme themes keep working and don't need to migrate.
What is the color_palette setting in Shopify?
A color_palette is a global set of named colors defined once in settings_schema.json. Merchants see those colors as a grid in the theme editor and pick from them whenever they adjust any color or color_background setting. You can define between 2 and 20 colors. There can be only one palette per theme, and it must live in settings_schema.json.
The schema is short. Unlike most input settings, color_palette supports only the id attribute (required) plus a default object: label, info, and visible_if are not supported. The default object holds the starting palette as key-value pairs.
{ "type": "color_palette", "id": "colors", "default": { "primary": "#121212", "secondary": "#FFFFFF", "accent": "#FF4416" }}The rules on those keys and values are strict, and worth getting right the first time: keys must start with a letter and can contain letters, digits, and underscores. Values must be valid hex colors without an alpha channel (for example #FFF or #FF4416). Eight-digit hex values with alpha are not supported. At least two entries are required, up to a maximum of twenty.
Name colors by role, not appearance
Use primary, accent, text, not blue or dark. The merchant will change the hex values, so a name describing the job survives a rebrand. A swatch named blue that's now orange is the kind of small lie that confuses everyone six months later.
How to access palette colors in Liquid
Each palette color is returned as a full color object, not a plain string, so you get the usual color filters (color_to_rgb, color_mix, color_modify, and so on). You access an individual color by its key through settings.<id>.<key>, where <id> is the palette's id.
{{ settings.colors.primary }} {% for color in settings.colors %} {{ color }}{% endfor %}One thing to know about iteration: looping over the palette yields each color as a color object in JSON-key order, but the keys themselves are not available during iteration, only the values. So a {% for %} is fine for rendering swatches or generating a row of variables, but if you need to address a specific color, reach for it by key.
Using a palette color as a setting default
This is the part that makes palettes worth adopting. A color or color_background setting can use a palette color as its default, by setting the default to a Liquid output tag that references a palette key. When the merchant later edits that palette color, every setting whose default points at it updates automatically.
{ "type": "color", "id": "heading_color", "label": "Heading color", "default": "{{ settings.colors.primary }}"}The same works for color_background, and palette references can be embedded inside a gradient string:
{ "type": "color_background", "id": "hero_gradient", "label": "Hero gradient", "default": "linear-gradient(180deg, {{ settings.colors.primary }}, {{ settings.colors.secondary }} 100%)"}Only palette paths work as dynamic defaults
The value must be a Liquid output tag referencing a palette key, for example {{ settings.colors.primary }}. Only color_palette access paths are supported as dynamic defaults: you can't point a default at an arbitrary Liquid expression. Keep it to a straight palette key reference.
color_palette vs color schemes: what changed
Color schemes (the color_scheme_group setting that defined named groups like background-1 with a role map, plus the color_scheme setting sections used to pick one) are now deprecated. Shopify's docs are explicit: the color_scheme and color_scheme_group types have been replaced by color_palette, and new themes should use the palette.
The mental-model difference: a scheme bundled a set of related colors (background, text, button, border) that had to move together, and you mapped them to semantic roles. A palette is flatter. It's a bag of named brand colors, and you compose the relationships yourself by pointing section and block settings at palette keys. For most themes that's less ceremony and a clearer story for the merchant: one place to manage brand colors, no need to understand grouped role relationships.
- Local overrides replace per-scheme tweaks. A
colorsetting with no default lets a merchant set a one-off color on a single section or block. Unset, it returnsblankin Liquid and the editor shows a Clear option, so your CSS handles the fallback. Pair palettes (the baseline) with local overrides (targeted exceptions). - Theme updates merge cleanly. When a theme update adds new keys to the palette
default, those keys appear automatically in the merchant's palette. Values the merchant already customised are preserved and take precedence. - Deleting a color is safe. When a merchant deletes a palette color in the editor, Shopify asks them to pick a replacement and stores the deleted color as a reference to that replacement. Existing references keep working without you touching every template.
You don't have to migrate
Color schemes continue to work in existing themes, and palettes are not required for new themes or Theme Store submissions. If your live theme uses schemes and you're not planning a major version bump, leave it. Reach for color_palette when you're building a new theme or doing a major rebuild.
How to migrate from color schemes to color_palette
There is no automatic converter, and the two models don't map one-to-one (schemes group colors, a palette flattens them). If you're rebuilding, the practical path is:
- List the distinct brand colors your schemes actually used, the unique hex values across every scheme, not every role in every scheme.
- Define one
color_paletteinsettings_schema.jsonwith those colors, named by role (primary,accent,text,surface). - For each section and block that previously read a scheme role, replace it with a
colorsetting whosedefaultreferences the right palette key, and add no-default overrides where merchants need per-section control. - Remove the
color_scheme_groupandcolor_schemesettings, and update the CSS custom properties your sections emit to read the new settings.
If you want to see the pattern in a real, current theme rather than a toy example, the latest Horizon release uses the palette system throughout. Sections and blocks are composed from palette-referencing color settings rather than scheme roles. For how those sections and blocks fit together in Horizon generally, see Shopify sections, blocks and theme blocks explained.
What AI tools get wrong here
This feature is new enough that most models' training data predates it, which produces two failure modes worth watching for when you review AI-generated theme code.
- It reaches for color schemes by reflex. Ask for "a theme color system" and you'll often get
color_scheme_groupwith a fullrolemap, because that's what the bulk of the training corpus shows. That code still runs, but it's the deprecated approach. For a new theme, ask explicitly forcolor_palette. - It invents palette attributes. A palette supports only
idanddefault. If you see a generated palette withlabel,info, or per-color objects with metadata, that's hallucinated. Thedefaultis a flat key-to-hex map, nothing more. - It forgets the alpha rule. Eight-digit hex with an alpha channel is not allowed in a palette default. A generated
#FF441680will be rejected. Catch it in review.
The durable skill here isn't memorising the schema, it's knowing the difference between "compiles" and "is the current recommended pattern," and checking new platform features against Shopify's docs rather than trusting a model's recall. That's exactly the judgement we build in the curriculum.
Learn this properly · free lesson
Build a 'Featured Coffee' section the merchant can edit
Build a real section with live merchant settings, color, text, and layout, and watch the storefront preview update as you type. Runs in your browser, free, no signup.
Try this lesson — freeWant the deeper version of brand tokens (colors, fonts, radius) and theme-wide settings? The Module 3 lessons take you from a single palette through dark-mode and section-level overrides on a production-shaped theme.
Frequently asked questions
What is the color_palette setting in Shopify?
It's a theme setting type introduced in the Spring '26 Edition (June 17 2026) that defines a flat set of 2 to 20 named colors in settings_schema.json. Merchants edit them as one grid in the theme editor, and any color or color_background setting can reference a palette color as its default so changes propagate across the theme.
Should I use color_palette or color schemes?
For new themes or a major rebuild, use color_palette: Shopify now recommends it and color_scheme / color_scheme_group are deprecated. For an existing theme already on color schemes that you're not significantly reworking, leave it. Schemes keep working and palettes aren't required for Theme Store submissions.
How do I access a palette color in Liquid?
Access an individual color by its key through settings.<id>.<key>, for example {{ settings.colors.primary }}. Each color is returned as a full color object, so you can pipe it through color filters. You can iterate with {% for color in settings.colors %}, but the keys aren't exposed during iteration, only the color values.
How do I migrate from color schemes to color_palette?
There's no automatic converter and the models differ (schemes group colors, a palette flattens them). List the unique brand colors your schemes used, define one color_palette named by role, point each section/block color setting's default at the right palette key, then remove the color_scheme_group and color_scheme settings. Migrate only on a new theme or a major version bump.
On the launch list
Get updates on the platform.
Same waitlist as the homepage. New posts plus a heads-up when v1 launches. No drip, no spam.
About the author
Bas Lefeber, Founder, learnshopify.dev
Bas builds learnshopify.dev, where developers learn production-grade Shopify theme development against a live storefront. He writes about Liquid, theme architecture, and the parts of the job that still matter now that AI writes the code.
Keep going in the curriculum
