Shopify Campaign Velocity Lab

Marketing asks for a hero swap on Tuesday.

In most themes that is a ticket, a pull request, a review and a deploy. In a theme built around sections, blocks and metafields, it is a text field. Everybody already agrees with that sentence, which is the problem with it.

So here is the same storefront built both ways, with twelve real campaign requests replayed through each.

1 — Change something

Both panes below are rendered right now, in your browser, by the same Liquid engine the audit runs in CI. Edit any control on the left. The composable theme responds. The one with its content in Liquid does not, because for it every one of these is a file edit.

Theme editor generated from the section’s schema

theme/ content in settings
theme-hardcoded/ content in Liquid does not move

Images are deterministic placeholders generated from the filename, so a change to an image setting is visible without shipping binaries. Everything else is the theme’s own Liquid, unmodified.

2 — Why the audit renders instead of reading the schema

A theme can declare forty settings and read none of them. The editor looks generous, the merchant moves the control, and the storefront never changes. Nothing errors. Below is a section with exactly that bug: ghost is declared in the schema and referenced by the Liquid, so it passes every static check there is.

rendered output

This is why every setting the backlog depends on is rendered twice, with only that value changed, and only counts if the HTML differs. npm run audit exits non-zero otherwise.

3 — The backlog

Twelve requests of the kind that actually arrive. Select one to see what each theme was missing.