Skip to main content
theme.json is required, at the theme root. A directory containing one is a theme root, for both publishing and git deploy detection.
theme.json
Unknown keys are ignored. A malformed manifest does not fail a publish except where noted below.

Listing fields

These become the theme’s marketplace listing. is_free is derived from price_cents == 0 and is not a field you set.
A path in preview_images that is not a real file in the bundle is dropped silently, never rendered as a broken image. If your previews do not appear, check the paths against what you actually shipped.

schema

The schema generation your theme is written against. An integer, at least 1. Absent, wrong type, negative or fractional all resolve to 1 rather than failing. The gate is one-directional. A deployment newer than the theme is accepted. A theme declaring a version higher than the deployment supports is rejected:

builder

Which editing surface merchants get. "full" or "simple".

full

Section tree, click-to-select on the canvas, SEO panel, nested block editing. The default.

simple

One scrolling column of forms beside the preview. No section tree, no click-to-select, no SEO panel.
The value is trimmed and lowercased, and anything other than simple resolves to full. A typo cannot make a theme unpublishable. builder is presentation only. Both shells call the same endpoints with the same scopes, and the server does not read this value. It grants and restricts nothing. Use simple for a theme small enough that a section tree adds overhead, such as a link-in-bio layout. See The builder.

version

The publish path does not read version. The published version comes from the publish request, or the server bumps the patch of the highest existing clean semver.
Changing version in theme.json does not produce a new version. It is read only by the dashboard when detecting a theme in a connected repository, for display.
config/migrations.json renames things across a schema change so merchant content survives:
config/migrations.json
setting_renames is keyed by the post-rename section type.