Shopify · Theme updates, Liquid edits and app removals
A Shopify storefront can look perfect after a theme update while its rendered HTML has quietly changed underneath. Titles, canonical tags, meta robots directives, H1s, JSON-LD and internal links all come from Liquid templates, and one edit to a shared file can change them on hundreds of URLs at once.
This page is a post-change SEO QA workflow. It assumes the change has already happened, a theme version update, a Liquid code edit or an app uninstall, and shows how to prove what changed, find the regressions and sign off the release with evidence. The method is the same throughout: crawl before, crawl after, and compare by URL and by template. For the general post-deploy method on any stack, see SEO QA.
Why Shopify theme changes can break SEO
A Shopify theme is not just a visual skin. It controls the <head> output, heading structure, structured data, pagination and most of the internal link graph. Any change to theme code is also a change to what Googlebot crawls and indexes.
The Shopify storefront: every layer can rewrite your HTML
Only a crawl sees the HTML that leaves this stack, the same HTML Googlebot sees.
| Change type | What breaks | Why it's easy to miss |
|---|---|---|
| Theme version update | Custom Liquid edits are not carried over: title logic, canonical rules, noindex conditions, hreflang tags | Theme editor settings migrate, so the store looks the same |
| Liquid edit to a shared file | One change to theme.liquid or a snippet reaches every product, collection and search template that renders it | The edited page looks fine; the others are never opened |
| App removal | Script tags, snippets and render calls stay in theme files; old Product or Review schema keeps printing | Shopify says the app is uninstalled |
| App embeds on a new theme | App blocks land in a different section, embeds are disabled by default, late widgets cause layout shifts | The app still shows as installed and active |
The common thread: the theme editor and a quick visual check hide almost all of these. Only a crawl of the published storefront sees what Googlebot sees.
Establish an SEO baseline before changing the theme
You cannot detect a regression without a record of what correct looked like. The baseline is the most valuable step in this workflow, and it takes minutes if you do it before you click Publish.
- Crawl the current published storefront. Crawl the live theme, not the preview of the new one. Turn on JavaScript Rendering if your theme or apps inject content client side.
- Record the head and status fields. For every URL, capture the title, meta description, H1 count and text, canonical target, meta robots and X-Robots-Tag values, and the HTTP status code.
- Record links, images and structured data. Capture collection to product links, pagination links, image alt text and loading attributes, and every JSON-LD block by type. Note how many Product, BreadcrumbList, Organization and Review entities each template outputs.
- Save the crawl and pick priority URLs. Keep the crawl as a dated snapshot, then list the URLs you will check by hand within minutes of release.
URLs to inspect first: / homepage, two or three high-revenue /products/ URLs, one product on each alternate template, a large paginated /collections/ URL, one /pages/ URL, one /blogs/ article, /search, /sitemap.xml and robots.txt.
Audit SEO after publishing a Shopify theme update
Start with this matrix. It links each type of change to the regression it can cause and the test that catches it. These are possible failure modes, not guaranteed outcomes.
| Change made | Potential regression | Validation |
|---|---|---|
| Theme updated | Custom metadata or Liquid output changes | Compare rendered HTML and crawl results |
| theme.liquid edited | Canonical, title or robots output changes site wide | Test representative URLs across templates |
| Product snippet edited | H1, price, image or Product schema disappears | Inspect product HTML and validate schema |
| SEO or review app removed | Obsolete scripts or duplicate schema remain | Inspect source, Network requests and JSON-LD |
| App embed disabled | Reviews, widgets or other content disappears | Check the rendered page and intended functionality |
| Collection template changed | Product links or pagination disappear | Crawl collection pages and inspect link discovery |
Then check the elements a theme change usually touches, one URL per template first, since theme changes break templates, not single products.
| Element | Expected after a clean update |
|---|---|
| Status code | Same as before, no new 404 or 5xx |
| Meta robots | No new noindex on products, collections, pages or articles |
| Title tag | One per page, same text and store name suffix |
| Canonical | /collections/x/products/y canonicalizes to /products/y, as before |
| H1 | Exactly one, not demoted to an H2 or doubled by a new header section |
| Pagination | Crawlable ?page=2 links still present, not replaced by a JavaScript load more button |
| Product links | Collection grids still link to canonical product URLs |
| Structured data | One Product entity per product page, offers and aggregateRating still present |
| Images | Main product image not lazy loaded, alt text and srcset still output |
| Mobile rendering | Tabs and accordions render their content, nothing hidden by failed JavaScript |
Check Shopify Liquid edits for SEO regressions
Liquid is where most Shopify SEO regressions start. Themes build the same output in different ways, so treat the file names below as common starting points, not fixed rules.
- Inspect layout/theme.liquid. It wraps nearly every page, and in most themes it, or a meta-tags snippet it renders, outputs the title, description, canonical and social tags. Diff the old and new versions first.
- Review the JSON templates. Open product.json, collection.json, page.json and article.json, note which sections they load, and check those section files for heading tags and schema output.
- Trace shared snippets and sections. Search for every {% render 'snippet-name' %} pointing to an edited snippet. A change to card-product.liquid reaches collection grids, search results, recommendations and featured collections.
- Check conditional logic. Conditions like {% if template contains 'collection' %} decide when tags print. A misplaced endif can drop the canonical on one template or print a second H1 on another. Test tagged and paginated collection URLs too.
- Verify canonical, title and robots output. Confirm the head still prints {{ canonical_url }} and that the title uses page_title with the expected page number and tag suffixes. If you edit robots.txt.liquid, check it survived.
- Confirm custom code survived the update. Keep a list of every customization: schema additions, hreflang, noindex rules, breadcrumb markup. After a version update, search the new theme for each one and reapply what is missing.
Worked example: after an update, the crawl shows 412 product URLs with no H1.
- Identify the affected URLs. Export them from the missing H1 issue in the crawl.
- Group them by template. All 412 use the default product.json template. Products on product.bundle.json are fine.
- Inspect the shared source. The new main-product section prints the title inside a paragraph with a product__title class instead of an H1.
- Compare against the baseline. The baseline crawl shows the H1 matched the product title before the update.
- Fix once, recrawl the group. Change the section, then recrawl the 412 URLs to confirm all pass.
One shared file caused the whole problem. Grouping by template turns 412 issues into one fix.
Find leftover scripts after uninstalling Shopify apps
Shopify's documentation notes that removing an app may leave code it inserted into theme files. That orphaned code costs load time, can throw JavaScript errors and can keep printing schema for data that no longer exists. Shopify's guide to auditing and removing third-party scripts is the official reference.
- Identify the obsolete integration. Record the app's name, script domains, snippet file names and any installation notes.
- Trace where it loads. Search theme.liquid, sections and snippets for the app name, vendor domain, script_tag filters and render or include calls. Check the theme editor's App embeds panel and empty app block placeholders.
- Confirm the browser behavior. Filter the DevTools Network panel by the old vendor domain and reload. Check the Console for 404s on missing assets and for Liquid errors in the page.
- Check for duplicates. Switching review or SEO apps is the classic cause of two Product or AggregateRating blocks on one page. Use Custom Source Search to find the old domain or snippet name across every crawled URL.
- Remove and validate. Duplicate the theme as a backup, delete the confirmed orphaned code, test the features that depended on it, then rerun the crawl and performance checks.
Measure the performance impact of theme and app changes
A new theme can improve rendering while a forgotten app script cancels the gain. Measure both and attribute each change to its source.
- Compare mobile Core Web Vitals. Test the same priority URLs as the baseline. Compare LCP, INP and CLS lab values first, then watch field data in Search Console over the next 28 days.
- Find new third-party requests. Any domain missing from the baseline needs an owner and a reason to exist.
- Check layout shifts and interactions. Late review widgets and announcement bars cause CLS. Test add to cart, variant pickers and filters, since errors from orphaned code can break them.
- Separate theme from apps. Preview a duplicate theme with app embeds off, then add them back one at a time. If performance is fine without apps, the theme is not the problem.
Run a before and after Shopify SEO comparison
Spot checks catch obvious breaks. A full crawl comparison catches the quiet ones, like a canonical that changed on 3% of collection URLs.
- Crawl again with identical settings. Same start URL, rendering mode, user agent and URL limits, or the comparison shows false differences.
- Compare the two audits. Open Audit Comparison and review new issues first, then changed values.
- Group changes by template. Product, collection, page, article and search. Most real regressions collapse into a handful of template patterns.
- Separate intended changes. Mark planned changes, like a new title format, as accepted so only unexpected ones remain.
- Prioritize, assign and recrawl. Fix indexability first, then metadata, internal links, structured data and performance. Record the affected template, likely source file and owner, then recrawl to close each issue.
Before and after example
/products/trail-x → 1 Product schema
Products with one Product entity: 412 / 412
/products/trail-x → 2 Product schema
Products with one Product entity: 0 / 412
Downloadable checklist
Tick items as you go, then download the list as CSV for a spreadsheet or Linear ticket, or print it and save as PDF. Your ticks are included in the download.
Frequently asked questions
Can a Shopify theme update affect SEO?
Yes. The theme generates titles, canonicals, robots directives, headings, structured data and internal links. An update can overwrite custom Liquid edits or change how those elements render, even when the store looks the same.
Does uninstalling a Shopify app remove its scripts?
Not always. Apps built on theme app extensions are removed cleanly, but older apps that edited theme code can leave script tags, snippets and render calls behind. Check theme files and browser Network requests after every uninstall.
How do I check whether a Liquid edit broke SEO?
Crawl the store, group affected URLs by template, and inspect the shared Liquid file or snippet behind that template. Compare the rendered HTML with your pre-edit baseline, fix the shared source and recrawl the affected group.
How do I compare Shopify SEO before and after a theme change?
Save a full crawl before publishing, then crawl again after release with identical settings. Compare titles, H1s, canonicals, indexability, status codes, links and schema by URL and template, and separate intended changes from regressions.
Should I crawl my Shopify store after every theme update?
Yes. Check priority URLs right after release, then run a full comparison crawl. Template regressions hit many URLs at once, and a crawl is the only reliable way to see their full scope. Scheduled SEO Audits keep a baseline ready for unplanned changes.