App Blocks vs. Liquid Sections in Shopify

App block or Liquid section? A side-by-side of how each renders, what a theme update does to each, when to pick which, and the honest trade-off of both.

5 min readUpdated

Part of our guide to Shopify Theme App Extensions, Explained.

Both an app block and a Liquid section can put the same thing on a Shopify page — a hero, a reviews grid, a size chart. On screen a shopper can't tell them apart. The difference is entirely in where the code lives and, because of that, what happens to it when the theme changes. This guide lays the two models side by side so you can pick with open eyes.

If you're new to either term, the parent hub — Theme App Extensions, explained — defines them; this guide is the direct comparison.

The two models in one sentence each

  • A Liquid section is a .liquid file in your theme's sections/ folder, with a {% schema %} block. It is part of the theme. You (or a tutorial) write it into the theme's code.
  • An app block is a block supplied by an installed app through a theme app extension. The theme references it through a slot; the block's source stays hosted with the app.

That's the whole distinction. Everything below follows from it.

Where the code lives

A Liquid section is a file you own inside one theme version. Here's a minimal one:

{% comment %} sections/promo-banner.liquid — a theme file {% endcomment %}
<section class="promo-banner">
  <h2>{{ section.settings.heading }}</h2>
</section>

{% schema %}
{
  "name": "Promo banner",
  "settings": [
    { "type": "text", "id": "heading", "label": "Heading" }
  ],
  "presets": [{ "name": "Promo banner" }]
}
{% endschema %}

An app block is declared in an app's theme app extension, in extensions/<name>/blocks/, and the theme opts in to app blocks by including an @app entry in a section's blocks array:

{% comment %} the theme section only *allows* app blocks — it doesn't contain them {% endcomment %}
{% schema %}
{
  "name": "Product information",
  "blocks": [
    { "type": "@app" }
  ]
}
{% endschema %}

The { "type": "@app" } line is the opt-in. It says "app blocks may be placed here." The block's Liquid never appears in the theme — only permission to render one does. That single detail is the reason the two behave so differently on update day.

What a theme update does to each

This is the practical fork.

  • Liquid section on a theme update. When you install a new version of the theme or switch themes, Shopify publishes a fresh copy of the theme's files. Your promo-banner.liquid is not merged in — it isn't carried over at all. The section, and the per-template settings that referenced it, can simply be gone. The full mechanics are in Update your theme without losing customizations.
  • App block on a theme update. The block's source lives in the app, so a theme update or swap doesn't touch it. As long as the new theme also supports app blocks (every Online Store 2.0 theme does), the merchant keeps the block rather than rebuilding lost code.

Neither behavior is a bug — it's the design. Theme files are replaced on update; app extensions are referenced, not copied, so they aren't in the blast radius.

The honest trade-off

App blocks aren't strictly "better." Each model has a failure it owns:

Survives a theme update / swapSurvives if the app is uninstalled
Liquid section (theme file)No — replaced with the new theme's filesN/A — no app involved
App block (extension)Yes — source stays in the appNo — removing the app removes its blocks

So the real question isn't "which is better" but "which failure would hurt less for this piece of content?"

  • A one-off tweak on a theme you rarely touch is fine as a Liquid section. You're unlikely to hit the update problem, and there's no app dependency.
  • A section you depend on across theme changes — one you'd hate to lose in a redesign or theme swap — is safer as an app block, accepting that it's tied to the app that provides it.

The full, vendor-neutral version of this table, including how different section apps handle it, is in the honest comparison.

When to pick which

A short decision guide:

  • Pick a Liquid section when you need total control over markup and the section is theme-specific, short-lived, or something you're comfortable re-applying by hand after an update. Build it with How to create a custom section.
  • Pick an app block when the section is long-lived, you change themes or run frequent theme updates, or a non-developer needs to keep it working without touching code. Just weigh the app dependency: the content lasts as long as the app is installed.

There's also a middle reality — many stores use both. Native, throwaway layout bits as theme sections; the handful of sections that must never disappear as app blocks.

A note on rendering and permissions

Two follow-ups tend to come up right after this decision:

  • How app sections actually get rendered — the endpoint behind app-rendered and dynamically-updated sections is the Section Rendering API.
  • What an app is allowed to touch — an extension-based app declares a theme scope; what that grants is in What is the write_themes scope?.

If the sections you're deciding about are ones you can't afford to lose in a theme change, SectionGuard renders them as app blocks through a theme app extension — the same in-editor experience, placed so a theme update or swap can't remove them.