Skip to main content
Shopify guide

BlogPosting Schema for Shopify Stores

By ยท Updated ยท 6 min read

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.

Frequently asked questions

Does Shopify automatically add BlogPosting schema to blog articles?

Shopify and most of its default themes output a minimal JSON-LD block on article pages, but it covers only basic properties like name, URL, and datePublished. Key fields โ€” publisher, author details, ImageObject, and articleBody โ€” are absent from the default output. Store operators who need full schema coverage must edit their theme Liquid files or use a validated schema app.

Can I add BlogPosting schema to Shopify without coding?

Yes, through schema-focused apps in the Shopify App Store. These apps inject structured data automatically on article pages. Before relying on an app, confirm it does not create a duplicate schema block if the theme already outputs one โ€” duplicate BlogPosting types on the same page trigger validation warnings. Use Google's Rich Results Test to check for conflicts before and after app installation.

What Liquid variables does Shopify expose for BlogPosting schema?

The article object exposes article.title, article.url, article.author, article.created_at, article.content, article.excerpt_or_content, article.image, article.image.src, article.image.width, and article.image.height. The shop object provides shop.name and shop.url for the publisher field. Date fields require the | date filter with ISO 8601 formatting to meet schema spec requirements.

Does BlogPosting schema help Shopify blog posts rank higher?

Structured data does not directly influence ranking position. It helps search engines parse article metadata accurately, which improves eligibility for AI citations and rich result features like article carousels. For ecommerce stores, well-marked-up blog content that supports product categories can drive informational traffic that converts โ€” the schema ensures the content is correctly classified rather than ignored.

How do I handle dateModified in Shopify if the platform doesn't expose it natively?

Shopify's Liquid layer does not surface a native last-modified timestamp for articles. Two practical workarounds exist: set dateModified equal to datePublished using the same article.created_at variable, or store a manual update date in an article metafield and reference it as article.metafields.custom.date_modified in the JSON-LD block. The metafield approach requires creating a date-type metafield definition in Shopify Admin under Content โ†’ Metafields.

MG
Written by

Matt is the founder of RunOctopus. He built All Angles Creatures from zero to page-1 rankings in reptile feeder insects in under 60 days using exactly this method โ€” turning a hard, entrenched niche into RunOctopus's proof store for programmatic SEO and AI search citation.

Connect on LinkedIn →

See what Otto would build for your store

Free architecture preview. No card required. Five minutes.

Generate Preview →