Fix AI visibilityShopify (Liquid)

Why AI crawlers can't read your Shopify (Liquid) site

Shopify themes are server-rendered Liquid, so most of your store is already readable to AI crawlers, and the real gap is the content third-party apps and widgets inject with JavaScript after the page loads.

5 min read Lantad

Shopify is one of the friendlier stacks for AI visibility, because your theme renders on Shopify's servers before the HTML ever reaches a crawler. That is the good news. The less good news is that the apps you bolt on (review widgets, upsell blocks, size charts, FAQ tabs) often render their content in the browser with JavaScript, and most AI crawlers never run it.

So the question is not whether Shopify can be read, it usually can, but which specific pieces of your product, collection, and blog pages are being handed over as an empty shell. Here is how to find them and move them into the server-rendered HTML.

The fix, in short

  • Check what the raw HTML actually contains
  • Prefer app blocks over floating widgets, then verify the text is in the source
  • Move the facts that matter into Liquid
  • Stop hiding text behind JS-gated interactions
  • Verify with a Lantad scan
  • gymshark.com 94.3/100 grade A, fetched fine
  • allbirds.com no score HTTP 429 to an identified crawler
Two real Shopify storefronts, measured the same day, 15 July 2026. The platform is not what differed.

How Shopify (Liquid) renders

By default, Shopify renders your theme with Liquid on its Storefront Renderer. The layout, the product, collection, and blog templates, and their sections are built into the initial HTML response, so a raw HTTP fetch that runs no JavaScript still sees them. That is why a stock Online Store 2.0 theme like Dawn is typically readable. The nuance is that app-added content is only server-available if the app writes the actual text into Liquid. A theme app extension renders its Liquid on Shopify's servers, but many apps output only a container and a script tag and then fetch the real content in the browser, so the block is present in the HTML while its text is not. Content becomes invisible in a few common situations: when a third-party app renders as a floating widget or app embed that outputs a script and fills itself in client-side after load (many review, upsell, bundle, and FAQ apps default to this); when your theme hides text behind tabs, accordions, or load-more controls that fetch the real content by JavaScript on interaction rather than on page load; and when a section pulls copy from an external script or API in the browser instead of from Liquid. In each of those cases the server sends a shell with a script tag, the browser fills it in, and a crawler like GPTBot or ClaudeBot, which does not execute JavaScript, receives nothing where that text should be.

The fix

  1. Check what the raw HTML actually contains

    On a product page, view source (Ctrl+U) or fetch the URL with curl and search the response for your review text, spec tables, FAQ answers, and full product description. If a paragraph is visible on screen but missing from the source, an app or script is injecting it client-side. Repeat on a collection template (are the product grid and the collection description in the source?) and a blog article template. This tells you which templates have a gap before you change anything.

    verify

    • curl the URL with no JavaScript raw HTML
    • search that output for a sentence you expect found?
    • if it is missing, a crawler never sees it fix it
    • then scan to get the graded before and after score
    How to check it yourself, before trusting any dashboard.
  2. Prefer app blocks over floating widgets, then verify the text is in the source

    In the theme editor, many apps offer two ways to appear: an app embed, enabled under Theme Settings, which typically outputs a script that fills itself in client-side, and an app block you add inside a section. A theme app extension block renders its Liquid on Shopify's servers, which gives it a chance to place real text in the initial HTML, but only when the app writes that text into Liquid rather than fetching it in the browser. Where an app supports server-rendered output, for example a reviews block placed inside the product section, prefer the block over the floating widget, then confirm with step 1 that the text actually appears in the source. The block being present in the HTML is not proof that its content is.

    Sample Illustrative, not a measurement of any real site.

    Floating script widget

    • injected after load
    • absent from the Liquid output
    • reviews and specs invisible
    • nothing for a crawler to read

    App block in the theme

    • rendered into the HTML
    • present with no JavaScript
    • readable and quotable
    • auditable in view-source
    Sample illustration of where the words end up.
  3. Move the facts that matter into Liquid

    For content an app will not render server-side, put the canonical version into theme content: the product description field, the collection description, metafields rendered directly in your product template with Liquid, and the blog article body. A short spec table or a few FAQ answers written into the description reach every crawler, even when a richer JavaScript widget also loads for human visitors. The goal is that the important facts exist as plain server-rendered text, not only inside a script.

    • One h1, then ordered h2s A machine reads the outline before it reads the prose.
    • Semantic containers main, article and section, rather than nested unlabelled divs.
    • A recognised business type in JSON-LD Organization, LocalBusiness, SoftwareApplication and similar.
    • Server-rendered, not injected JSON-LD added by JavaScript is not in the HTML a crawler receives.
    What the structure and schema checks look for. Together they are 25% of the score.
  4. Stop hiding text behind JS-gated interactions

    Tabs, accordions, and read-more or load-more controls are fine when the full text is already in the HTML and JavaScript only shows or hides it. They are a problem when the text is fetched on click. Confirm that your description, care and sizing details, and at least the first page of reviews are present in the source on load, not only after interaction. Product schema (JSON-LD) is worth keeping, but it is a supplement; being read as plain server-rendered text is the prerequisite, and some review apps ship schema while rendering the visible reviews client-side.

    • Tabbed descriptions Often hidden Only the active tab is in the HTML in some themes.
    • Review widgets Usually hidden Third-party scripts inject after load, so the text is never fetched.
    • Bot defense Can block outright A 429 or a challenge means no page arrives at all.
    Where storefront copy usually goes missing.
  5. Verify with a Lantad scan

    Run your product, collection, and blog URLs through a Lantad scan. Lantad fetches each page as LantadBot with no JavaScript and diffs it against a full browser render, so the Prose Parity score and the diff show exactly which text is missing from the raw HTML. Re-scan after each change until the review copy, specs, and descriptions you care about appear in the no-JavaScript fetch. A high Prose Parity score means the visible text is present in the raw HTML that crawlers read. Being readable is a prerequisite for being cited, not a promise of it.

    • Server rendered 100/100 parity 1.0, grade A
    • Client-rendered SPA 34.4/100 parity 0, grade F
    • Hydration-gated 34.4/100 parity 0, grade F
    Constructed test pages from Lantad's own fixture set, not real websites. They isolate what rendering strategy alone does to the score.

Written by

Lantad

Common questions

Isn't Shopify already SEO-friendly and server-rendered?

Yes, the theme itself is server-rendered Liquid, and that is why most of a Shopify store is readable. The exception is content added by apps or scripts that render in the browser. Google can queue a page for a second pass that runs JavaScript, but most AI crawlers do not, so JS-injected content that Google may eventually see can still be invisible to GPTBot, ClaudeBot, and PerplexityBot.

My reviews app says it is SEO-friendly. Am I fine?

Check the raw HTML, not the claim. Some review apps inject a JSON-LD schema block for search engines while rendering the visible review text with client-side JavaScript. Schema helps, but a crawler that reads only server-rendered text still sees no reviews. Use the app's server-rendered app block if it has one, or write a summary of key reviews into your content, when the visible text is missing from the source.

Do I need to rebuild my theme?

Usually not. This is a per-app and per-section audit, not a re-platform. Most fixes are swapping a floating widget for an app block that renders text server-side, moving copy into the product or collection description or a metafield, and making sure tabbed content is present in the HTML on load rather than fetched on click.

See what AI reads on your Shopify (Liquid) site

Run a free scan: paste a URL and see exactly what AI crawlers can and cannot read, with a graded report and ranked fixes.