Quick answer: You can add JSON-LD schema to Shopify without an app by editing your theme’s Liquid — put an Organization block in theme.liquid’s <head>, and Product markup in the product template — using Liquid variables to fill the fields. It works cleanly for a single static type like Organization. Across a changing catalog it is fragile: product data with quotes or line breaks can break the JSON, theme updates overwrite your edits, and a second Product block duplicates what your theme may already output. Validate everything in Google’s Rich Results Test.
Structured data is how you tell Google and AI answer engines what a page is in a language they trust, and you do not strictly need an app to add it. This is the honest walkthrough of the no-app route — how to do it, where it works, and where it quietly breaks. For the concepts behind each type, see the Shopify schema markup guide.
The no-app method, step by step
1. Organization schema (site-wide). This is the safest hand-coded block because it is static. In your admin, open Online Store → Themes → Edit code → theme.liquid, and inside the <head>, add:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "{{ shop.name }}",
"url": "{{ shop.url }}",
"logo": "{{ 'logo.png' | asset_url }}"
}
</script>
Because it uses stable shop variables, there is little to break. It gives search and answer engines a clean brand entity to anchor to.
2. Product schema (product template). Open the product template (sections/main-product.liquid or similar) and output a block using product variables — {{ product.title }}, {{ product.description | strip_html }}, price, and availability. This is where hand-coding gets risky, because live product text flows into the JSON.
The three things that break it
Escaping. A product description containing a quote, apostrophe, or line break, injected raw, makes the JSON invalid — and Google silently ignores the whole block, with no error in your admin. You must filter values (| strip_html, JSON-escaping) so the output stays valid, and re-check after edits.
Theme updates. Editing theme files directly means a theme update or a theme switch can overwrite or drop your code without warning. Hand-coded schema needs re-verification every time the theme changes.
Duplication. Many themes already emit a basic Product block, and adding a second one — or running an app that also injects Product schema — gives Google two conflicting blocks and can suppress the rich result entirely. Before adding Product markup, view source and search for existing application/ld+json tags. One owner per schema type, always.
Validate before you trust it
After adding any block, paste the live page URL into Google’s Rich Results Test and the Schema.org validator. They parse the JSON-LD exactly as Google reads it and flag missing required fields or broken syntax. The non-negotiable rule: the markup must match the visible page. Marking up a rating or price the shopper cannot see is structured-data spam and risks a manual penalty. Clean, honest schema is also one of the strongest signals for answer engine optimization — AI engines lean on it to understand and quote your pages.
When to stop hand-coding
For one static Organization block, the no-app route is perfectly reasonable and worth doing today. The calculus changes once you need valid Product, FAQ, and Breadcrumb schema across a catalog that changes — every new product, price change, or discontinued item is a chance for hand-written JSON to drift out of validity. At that scale, generating schema from live data, escaping it correctly, and keeping it valid automatically is exactly what an app does well: RankEngine injects validated Product, FAQ, Breadcrumb, and Organization JSON-LD, checks each block against the live page, and writes it back to Shopify — no Liquid editing, no duplicate blocks, no silent breakage after a theme update.
RankEngine