How-To Guide 7 min read

Run Shopify Theme Check Before Every Handoff

A free linter that takes seconds and catches the class of bug that takes a product page down. Most teams have never run it.

TS
ThemeSync Team
WHAT A LINT PASS TYPICALLY FINDS ON AN INHERITED THEMEUndefined objects & Liquid errors6 criticalMissing / broken template refs4 criticalDeprecated filters & tags11 warningsPerformance: blocking assets8 warningsUnused assets & snippets14 infoSchema & translation issues5 infoSeconds to run. The first two rows are the ones that take pages down.

What it is and why it’s free money

Theme Check is a linter that ships with the Shopify CLI. It reads your theme source and reports problems with file names and line numbers. It doesn't need a store connection, it doesn't need a running dev server, and it finishes in seconds.

The whole command
shopify theme check --path .

The reason it's worth building a habit around isn't the volume of things it finds. It's the class of thing. A Liquid error referencing an object that doesn't exist on a product template doesn't degrade gracefully — it can take the page down. That's the failure mode most likely to be discovered by a customer rather than by you.

The economics are absurd: a few seconds per handoff against the possibility of a blank product page on a live storefront. There is no other check in theme development with that ratio.

What it actually catches

Findings come with a severity. Treat them differently.

CategoryExampleWhy it matters
Liquid errorsUnclosed tag, malformed syntaxPage can fail to render entirely
Undefined objectsReferencing product in a template where it doesn't existSilent blanks, or an error page
Missing templatesA section referencing a snippet that isn't thereRender failure on that template
Deprecated filtersOld image filters replaced by image_urlWorks today, breaks on a future platform change
Blocking assetsStylesheets and scripts loaded render-blocking in headDirectly hurts Core Web Vitals
Remote assetsFonts or scripts from third-party domainsExtra connections, slower first render
Unused assetsSnippets and CSS nothing referencesDead weight, and a hint of unfinished work
Schema problemsInvalid section schema, duplicate setting idsSettings misbehave in the theme editor
Translation keysReferenced keys missing from locale filesRaw keys rendering as visible text

How to triage

  • Errors: fix before handoff, no exceptions. These are the page-down class.
  • Warnings: fix on your own code. On inherited themes, decide deliberately — note them rather than silently accepting them.
  • Info: useful signal, not a gate. Unused assets on a five-year-old theme are expected.
Don't try to reach zero on an inherited theme. A theme that's been through three agencies will produce hundreds of findings. Chasing all of them is unbilled work with no client value. Fix errors, then hold the line on new findings you introduce.

What it can’t see

Being clear about the boundary matters, because a clean lint pass creates false confidence.

Theme Check reads source code. It never renders a page. So everything that only exists at render time is invisible to it:

  • Layout and visual bugs. Overlapping elements, broken grids, text overflow.
  • Cross-browser differences. A missing -webkit- prefix is valid CSS; Safari just ignores the property.
  • Empty sections from missing data. A metafield binding with no definition is syntactically perfect.
  • App conflicts. Overlays injected at render time aren't in your files.
  • Real-world performance. It flags blocking assets; it can't measure what a page actually scores.
  • Whether the design is right. Obviously, but worth saying to clients who hear "automated checks passed."
WHERE THEME CHECK SITS IN A QA PASS1Theme CheckSource correctness. Liquiderrors, deprecatedfilters, schema problems.seconds2Visual captureEvery template acrossbrowsers and viewports.Layout, overflow,rendering.minutes3With apps onOverlays, blocks andfirst-visit state on thetheme you’re shipping.real state4PerformanceScore the key templates onmobile before anyone signsoff.measuredEach gate catches what the previous one structurally cannot.
Useful framing for clients: "Automated checks confirm the code is correct. They can't confirm it looks right — that's what the screenshot review is for." It sets accurate expectations and explains why both steps are on the invoice.

Making it automatic

A check you run when you remember is a check you don't run. Three places to attach it, cheapest first.

1. Editor integration

Theme Check powers the Liquid language server, so most editors can surface findings inline as you type. This is the highest-value version because the feedback arrives before the mistake is committed.

2. A pre-push habit

Wrap it with the deploy so it isn't a separate decision:

Lint, then push — one command
#!/usr/bin/env bash
set -e
shopify theme check --path .
shopify theme push --unpublished --theme "$1" --store "$STORE"

set -e is the point: if the check fails, the push doesn't happen.

3. A handoff gate

Put "Theme Check clean of errors" on the handoff checklist as a named item with a named owner. Findings from an automated check are also far easier to raise with a client than opinions — "the linter reports six errors on the current theme" is a fact, not a criticism of whoever wrote it.

Run it on inherited themes during discovery. The output is a decent proxy for code health, and it's a concrete thing to reference when scoping. Six Liquid errors and forty deprecated filters tells you what kind of project you're quoting.

How ThemeSync fits in

  • Theme Check runs from the same place as your pushes. Linting sits alongside push, pull and package rather than being a separate terminal habit, so it's part of the flow.
  • A separate compatibility scan covers what Theme Check doesn't. A static pass over CSS and JS flags cross-browser risks — backdrop-filter without -webkit-, flex gap on older Safari, unprefixed position: sticky, clip-path without a prefix — with severity, file and line.
  • Visual capture covers the rest. Every mapped template across Chromium, Firefox and WebKit at desktop, tablet and phone sizes, so layout problems that pass every linter get seen.
  • Performance is measured, not inferred. Scores for the templates that matter, so "blocking asset" warnings can be weighed against what the page actually does.
  • Findings live with the theme. Scan results sit next to the templates and client sign-off for that theme, so a handoff has evidence attached.

Takeaways

  • shopify theme check is free, local, and finishes in seconds.
  • It catches the page-down class of bug: Liquid errors, undefined objects, missing templates.
  • Fix errors always. Be selective with warnings on inherited themes, and don't chase zero.
  • It reads source, so it cannot see layout, cross-browser rendering, missing data or app conflicts.
  • Attach it to your editor and to your push script so it isn't a thing you remember.
  • A clean lint pass is not a clean QA pass — say that to clients explicitly.

Lint, capture and sign off in one place

ThemeSync runs Theme Check alongside a cross-browser compatibility scan and screenshot capture, so code correctness and visual QA live with the theme.

Try ThemeSync Free →