What Shopify Does (and Doesn't) Generate for BlogPosting Schema
Shopify's Liquid templating engine auto-generates a limited set of structured data on blog article pages. Out of the box, most Shopify themes โ including Dawn, the default free theme โ output a JSON-LD block that includes the article's name, URL, and datePublished. That covers the bare minimum Google needs to recognize the content as an Article, but it falls well short of the full BlogPosting schema specification.
Critically, Shopify's default output omits several high-value properties: author details beyond a plain name string, image object markup, articleBody, description, publisher with logo, and breadcrumb connections to the blog index. These gaps mean AI search engines and Google's rich result systems cannot extract structured signals that improve citation likelihood and search feature eligibility.
How Shopify Themes Handle Schema in Liquid
In Shopify, structured data lives inside theme files โ typically article.liquid or a dedicated snippets/article-schema.liquid file that the article template includes. The JSON-LD block is rendered server-side by Liquid, which means every variable is accessible: {{ article.title }}, {{ article.author }}, {{ article.created_at | date: '%Y-%m-%dT%H:%M:%S' }}, {{ article.image.src }}, and {{ article.content }}. This gives developers full control without a plugin if they have theme edit access.
The complication is that Shopify's Liquid date filter formats timestamps, but the ISO 8601 format required for datePublished and dateModified needs a specific filter chain. Using {{ article.created_at | date: '%Y-%m-%dT%H:%M:%S+00:00' }} produces a valid datetime string. Shopify does not expose a native 'last modified' timestamp for articles at the Liquid layer, so dateModified either mirrors datePublished or must be managed through a metafield.
Shopify's article object also does not include a native excerpt field that maps cleanly to the schema description property. The article.excerpt_or_content variable exists but strips tags โ it works, but it requires a | truncate filter to avoid feeding hundreds of words into the description field.
The Publisher and Author Gap in Shopify BlogPosting Schema
The BlogPosting schema specification requires a publisher property containing an Organization type with a name and logo. Shopify does not generate this automatically. The store's name is available as {{ shop.name }}, and the logo URL can be referenced as {{ settings.logo | image_url }}, but these must be manually wired into the JSON-LD block inside the theme.
Author markup is equally incomplete by default. Shopify blog authors are store admin accounts, and the article.author variable outputs a plain string โ typically a first name or display name. The schema spec expects an author property with @type Person, name, and ideally a url pointing to an author page. Shopify does not generate author profile pages natively, so the url property either points to a filtered blog URL (e.g., /blogs/news/tagged/author-name) or is omitted. Omitting url is acceptable; inventing a URL that returns a 404 is not.
Apps and Tools That Add or Improve BlogPosting Schema on Shopify
Several Shopify apps in the App Store inject or enhance structured data across the store. Apps in the SEO category โ such as those branded around schema, SEO, or rich snippets โ typically add BlogPosting markup to article pages automatically. The trade-off is that app-injected schema is added via a script tag or theme app extension, which can conflict with schema already in the theme. Duplicate @type BlogPosting blocks on the same page cause validation warnings in Google's Rich Results Test.
Before installing any schema app, audit the theme's existing JSON-LD output using Google's Rich Results Test or Schema.org's validator. If the theme already outputs an Article or BlogPosting block, configure the app to skip article pages or disable its blog schema module specifically. Most paid schema apps expose per-type toggles in their settings dashboard.
For stores on Shopify's Online Store 2.0 architecture, theme app extensions are the cleanest injection method โ they render in a defined slot without directly modifying theme code, which matters for maintaining theme upgradeability. Older script-tag injection methods work but add render-blocking risk and are harder to audit.
Working Around Shopify's ArticleBody and Image Limitations
The articleBody property is supposed to contain the full text of the article. Shopify's {{ article.content }} outputs raw HTML, which is invalid inside a JSON-LD string โ HTML tags must be stripped and special characters escaped. In Liquid, the | strip_html filter removes tags, and the | json filter handles JSON-safe escaping. The combined filter chain {{ article.content | strip_html | truncate: 500 | json }} produces a usable, spec-compliant description or abbreviated articleBody value.
For the image property, BlogPosting expects an ImageObject with url, width, and height. Shopify's image object provides these via article.image.src, article.image.width, and article.image.height. If no featured image is set on the article, article.image evaluates to nil, so the JSON-LD block must wrap image output in a Liquid conditional โ {% if article.image %} โ to avoid outputting a null or broken ImageObject that fails validation.
Actionable Steps to Audit and Fix BlogPosting Schema on a Shopify Store
Start by opening a published blog article URL in Google's Rich Results Test. Note which properties are detected and which appear under 'Items detected but not eligible for rich results.' Cross-reference against the required and recommended properties for Article/BlogPosting: headline, datePublished, author with name, image as ImageObject, and publisher with logo.
In Shopify Admin, go to Online Store โ Themes โ Edit Code and locate article.liquid or the snippet it includes for JSON-LD. Add missing properties using the Liquid variables described above. After saving, re-run the Rich Results Test and also paste the page source into Schema.org's validator at validator.schema.org to catch any property-level errors. Set a recurring quarterly review since Shopify theme updates โ especially major version releases โ can overwrite customized Liquid files if edits were made to theme-owned files rather than snippet files.