Article is the Schema.org type for an editorial post on a Shopify blog1. Google requires no Article properties and recommends headline, image, datePublished, dateModified and author (with author.name and author.url)2. publisher is a useful Schema.org property but isn't on Google's list. Dawn and Horizon already print an Article on every blog post through Shopify's structured_data filter7. The 2026 install pattern: replace that line in main-article.liquid with your own block, using Liquid variables (article.title, article.image, article.published_at, article.author) and referencing the site-wide Organization by @id as the publisher.
Article JSON-LD is the schema type with the highest AI-engine citation lift per byte of markup. ChatGPT, Perplexity, Claude, and Gemini all parse Article blocks to confirm authorship, date, and publisher when deciding whether to cite a post — the bylines and dates in prose are inferred; the structured-data fields are read directly.
§01Definition
What Article schema is
Per Schema.org v30.0, Article is 'a news article or piece of investigative report.' Type hierarchy: Thing > CreativeWork > Article. Subtypes that matter for Shopify blogs: BlogPosting (informal editorial), NewsArticle (news), TechArticle (technical how-to). Google's Article documentation supports Article, NewsArticle and BlogPosting, and says no markup is required to appear in Top stories. For most Shopify blog posts, Article or BlogPosting is the right choice.
Mental model: Article describes one editorial page on the storefront. A Shopify blog post is exactly that — one piece of content, with a title, an author, a publication date, optional images, and a body. The Article block captures those fields in a single JSON-LD object placed inside main-article.liquid.
§02Auto-emission
What Shopify themes emit on blog posts
Shopify's structured_data filter converts an article into schema.org Article, and Dawn (main-article.liquid) and Horizon (main-blog-post.liquid) both print it on blog posts. On the Dawn demo store (read 2026-09-16) the output carries headline, description, image, datePublished, dateModified, articleBody, mainEntityOfPage, author as a Person with a name only, and publisher as an Organization with a name only. There is no author.url, which Google recommends, and no link to your Organization by @id. Older and third-party themes vary, so the audit is still per-theme.
Action: view source on a blog post page and find-on-page for BlogPosting or Article. If it's absent, add the block below. If it's the theme's structured_data output, replace that script tag with the block below rather than adding a second Article, so the page describes the post once8.
§03Fields
Article fields per Google's recommendation
The fields Google's Article documentation recommends: headline (Text), image (ImageObject or URL — Google suggests 16x9, 4x3 and 1x1 versions of at least 50K pixels each), datePublished (DateTime, ISO 8601), dateModified (DateTime), and author (Person or Organization, with author.name and author.url). Google lists no required properties. Useful Schema.org extras Google doesn't list: publisher (the site-wide Organization, referenced by @id), articleBody, articleSection (e.g. 'Skincare tips'), wordCount, inLanguage, mainEntityOfPage.
headline — recommended. {{ article.title | json }}, no quotes around it5. Google's current Article documentation sets no character limit, but long titles get truncated in results.
image — recommended. {{ article.image | image_url: width: 1200 | prepend: 'https:' | json }} (image_url returns a protocol-relative URL6). A plain URL is enough. Don't hard-code width and height: width: 1200 fixes only the width, so the height depends on each image.
author — recommended, with author.name and author.url. Person with name from article.author and url to an author or about page.
publisher — optional (not on Google's list). Organization referenced by @id (the site-wide Organization from theme.liquid).
articleSection — optional. The blog's name or category — {{ blog.title | json }}.
wordCount — optional. Useful for AI engine extraction.
mainEntityOfPage — recommended. The canonical URL of the article.
§04Example
JSON-LD example — Article in main-article.liquid
The block below is the full Article JSON-LD for a Shopify blog post. In main-article.liquid (Dawn; Horizon uses main-blog-post.liquid), replace the script tag that prints {{ article | structured_data }} with it; on older themes without that line, paste it into article-template.liquid. It references the Organization defined in theme.liquid via @id, and takes inLanguage from request.locale, which replaced the deprecated shop.locale.
JSON-LDArticle inside main-article.liquid, replacing the theme's structured_data line
Rich Results Test against a Shopify blog post URL with Article JSON-LD should report Article detected, zero errors. Because Article has no required properties, what the test flags are missing recommended fields such as author.url or image; add them if the post has them. Top stories don't depend on this markup: Google says there's no markup requirement for Google News features like Top stories.
A subtle Shopify gotcha on dateModified: article.updated_at in Liquid returns the last save timestamp from Shopify's admin, which includes saves that don't change the article content (touching tags, changing the SEO title). If your dateModified bumps every time you re-touch a post in admin, AI engines may infer freshness that isn't there. The honest fix is a metafield (e.g. seo.content_modified) the merchant updates only when the post's body content changes.
§06Gotchas
Shopify gotchas on Article
Four gotchas. First: Shopify's article.published_at and article.updated_at sometimes serialise with different timezone formats depending on theme/locale — always pass through | date: '%Y-%m-%dT%H:%M:%S%z' for ISO 8601 with timezone. Second: printing article.title inside quote marks instead of through | json causes JSON parse errors when a title contains a double quote mark or a backslash. Apostrophes are fine in JSON; | escape is an HTML filter and turns them into entities. Third: leaving the theme's structured_data Article in place and adding a second Article block, so the post is described twice. Fourth: emitting Article on /blogs/foo (the blog index) instead of /blogs/foo/articles/bar (the article itself). Blog indexes are CollectionPage; only article URLs carry Article schema.
A fifth gotcha for multi-author Shopify blogs: article.author returns one byline string per article, not a Person object with verification fields. If the blog has multiple authors with distinct expertise (a furniture brand with a craftsmanship column and a styling column), build a Liquid case statement that maps article.author to a Person object with url, jobTitle, knowsAbout. The work is per-author and pays off in author-Person knowledge-graph confirmation for AI engines.