{% include %} Is Deprecated in Shopify — Migrate to {% render %} in 5 Minutes
Still using {% include 'snippet-name' %} in your Shopify theme? This tag has been deprecated since 2020 and triggers Theme Check warnings that cause Theme Store rejections. The replacement — {% render %} — introduces isolated variable scoping, meaning snippets no longer inherit parent-scope variables automatically. That single change is responsible for most failed migrations. This guide walks you through exactly what breaks, why it breaks, and how to migrate every include without surprises.
Why {% include %} was deprecated
The core problem with {% include %} was implicit state sharing. A snippet could read any variable defined in the parent template without it being passed explicitly. This made themes fragile and impossible to cache safely. {% render %} enforces a clean boundary: snippets only access Liquid global objects (product, cart, shop, collection, customer, request) and variables you explicitly pass as parameters. This makes every snippet self-contained, enabling Shopify to cache them independently and reducing render time.
What breaks when you switch to {% render %}
The most common breakage is a snippet that uses a parent-assigned variable without it being passed. If your section does {% assign featured = section.settings.product %} and the snippet renders {{ featured.title }}, that assignment is invisible inside {% render %}. Fix: {% render 'snippet', featured: featured %}. Second breakage: {% include %} inside a {% for %} loop gave the snippet access to forloop.index, forloop.first, etc. {% render %} does not. Use the native loop syntax: {% render 'card' for collection.products as product %}.
Complete migration steps
Step 1: Global search your theme directory for '{% include'. Step 2: For each include, open the referenced snippet and list every variable it uses that is not a Liquid global. Step 3: Rewrite the call: {% render 'snippet-name', param1: value1, param2: value2 %}. Step 4: For loops, use {% render 'card' for array as item %}. Step 5: Test every template that previously used the snippet — blank output means a missing parameter.
Automating detection with Theme Check
Theme Check flags every {% include %} via the DeprecatedTag rule with exact file paths and line numbers. Run: npx @shopify/theme-check-cli . from your theme root. Add it to CI so future PRs cannot reintroduce deprecated tags. The Shopify Liquid VS Code extension also underlines {% include %} in real time as you type.
The fix: before and after
// CODE_COMPARISON
Frequently asked questions
- Will my live theme break immediately if I keep using {% include %}?
No. {% include %} still renders on live themes as of 2025. However, it is excluded from Shopify rendering optimizations, generates Theme Check warnings, and causes Theme Store rejection. It is also the most common source of snippet-related bugs as themes grow.
- Can snippets rendered with {% render %} still access cart and product objects?
Yes. Liquid global objects — shop, cart, product, collection, variant, customer, request — are always available inside {% render %} without being passed. Only variables created with {% assign %} or {% capture %} in the parent scope need explicit passing.
- What does blank output after migrating to {% render %} mean?
Blank output means a variable the snippet depends on was not passed as a parameter. Since {% render %} resolves missing variables as nil with no error thrown, failures are silent. Open the snippet, identify every variable it uses, and ensure each one is a Liquid global or an explicitly passed parameter.
// SCAN_YOUR_CODE
Does your theme have this bug?
Paste your code. Syphio automatically detects and fixes this error and hundreds of others — in seconds.
Validate my Liquid →