Fixes · Theme deploys

Theme push succeeded but changes don’t show

The fix

Shopify checks each file as it’s uploaded and skips any it rejects, while the rest of the push lands. Reject a section and every template that uses it goes too.

Read the upload errors: View logs on the theme’s card for a theme connected to GitHub, or the Shopify CLI’s output. Then fix what they name. shopify theme check doesn’t catch all of it.

01Why a push can succeed and still skip files

A push isn’t one upload. Each file is sent and checked on its own. If Shopify refuses a file, the others still land, the push reports success, and the theme keeps serving its old copy of the refused file.

Templates make it worse. A JSON template names the sections it uses, so a template that uses a refused section is refused as well. In the case below, one new section was used by 85 templates, so one file’s mistakes kept 86 files off the theme.

Two things hide it. The theme’s own last-updated time moves when any file lands, so it says nothing about the file you care about. And shopify theme check reads the theme on your disk; it doesn’t apply every rule Shopify applies on upload. On this thread (Aug 2025) developers describe the same thing with the GitHub integration and the CLI, and one later reply reports the integration logging no error at all. On an older one (Jan 2023), header changes pushed from an editor never appeared; the fix that came up most was reading View logs, which showed a syntax error the editor hadn’t flagged.

The upload rules that caught us

  1. 01

    A section name longer than 25 characters

    The schema name has a 25-character limit. This is the one theme check catches, as ValidSchemaName (Shopify, ValidSchemaName).

  2. 02

    A text setting with an empty default

    "default": "" was refused with Invalid schema: setting with id="master" default can't be blank. Leave default out instead. Theme check didn’t flag it.

  3. 03

    A section id that starts with an underscore

    In a JSON template, the key a section sits under (its id) can’t start with _. _generated_notice was refused and generated_notice was fine. Theme check didn’t flag it either.

  4. 04

    A video setting with the wrong kind of address

    An image_picker stores shopify://shop_images/..., so shopify://shop_videos/... looks right for a video setting. It isn’t: Shopify refused it with Setting 'video' value must be a valid video shopify url. The form that works is shopify://files/videos/<file name>, extension included.

02Read the log, then fix what it names

For store owners

  1. Open the theme’s log

    In Online Store > Themes, on the card of the theme connected to GitHub, click View logs beside the Last saved time. It lists the last few sync events (Shopify, GitHub integration); a refused file shows there with its reason.

  2. Send the errors to your developer

    Each one names the file and the rule it broke.

  3. If the theme has fallen behind the branch

    Once the files are fixed, Actions > Reset to last commit on the same card pulls the branch again (Shopify). If anyone has edited the theme in the editor since the last sync, duplicate it first.

For developers: find out what landed, then read the errors

The Admin API gives every theme file its own updatedAt and checksumMd5. For a Liquid file the checksum is the MD5 of the file as it is in git, so you can compare file by file (JSON files carry a comment Shopify adds, so compare those by updatedAt). files returns 50 by default, so ask for more and page on with endCursor while hasNextPage is true (Shopify, OnlineStoreTheme):

What the theme holds (GraphQL Admin API, read_themes)graphql
query ThemeFiles($id: ID!) {
  theme(id: $id) {
    name
    files(first: 250, filenames: ["sections/*.liquid", "templates/*.json"]) {
      nodes { filename updatedAt checksumMd5 }
      pageInfo { hasNextPage endCursor }
    }
  }
}
What git holdssh
md5sum sections/my-section.liquid   # on a Mac: md5 -q sections/my-section.liquid
  • Read the errors where Shopify writes them: View logs for the GitHub integration, or the CLI. Pointing shopify theme dev at the same files printed the video error for us straight away.
  • Run shopify theme check as well, but treat a pass as a start. On this theme it caught one of the three rejections in the new section.
  • Copy the conventions of a section that already syncs in the same repo: plain snake_case ids, a short plain name, no empty defaults.
  • When a push touches a section that many templates use, check one of those templates on the theme afterwards, not only the section.

03Compare the theme with git

  1. Compare checksums

    After the push, every Liquid file you changed should show your local file’s checksum and a new updatedAt.

  2. Open a page built from the template

    Preview the theme and load a page that uses one of the templates. The new section should be there.

  3. Read the log again

    No refused files in View logs.

From our work

0485 templates that never landed

On a new theme we built for a wellness brand, many pages are copies of one master template, stamped out by a script. We added a small section that marks each copy in the theme editor, so the team edits the master instead. It went into 85 templates.

Before (10 Sep 2026). The push succeeded, GitHub had the commit, and other files in the same push landed. The section and all 85 templates didn’t. The integration’s log named the reasons: the section’s name was 30 characters against a limit of 25, two text settings had empty defaults, and the section’s id in the templates started with an underscore. We fixed them in that order, in three commits the same afternoon. The section is on the theme today, with the same checksum as in git (checked 22 Oct 2026).

A week later (17 Sep 2026). Two templates with a new video row were refused for the shop_videos address. The theme went on serving the old versions; the only sign was a file whose updatedAt never moved.

What changed in how we work: when a push doesn’t show, we read the log first, and a new section starts as a copy of one that already syncs, not with conventions of our own.

  • In our log“Page copies in the theme editor now show a notice pointing staff to the master”

The bigger picture

05A deploy nobody can trust

A deploy that reports success and drops files is a deploy nobody can trust, and the next person to change that section builds on a version the store never had.

If your theme deploys from GitHub and nobody checks what landed, or many templates are generated from one master, our development work sets that up properly: each change checked on the theme itself, not only in git.

06Sources

Every step and claim above comes from one of these, or from the fix on the store it describes.

  1. Shopify developers: Shopify GitHub integration for themes
  2. Shopify developers: Theme Check, ValidSchemaName
  3. Shopify developers: Section schema
  4. Shopify developers: OnlineStoreTheme (GraphQL Admin API)
  5. Shopify Developer Community: Templates and sections are not uploaded if there are any schema errors (Aug 2025)
  6. Shopify Community: Why isn’t GitHub reflecting updates on my Shopify header? (Jan 2023)

Sources checked on .

Contact

Pushed, but not showing?

Tell us how your theme deploys and which files didn’t land.