BlogPosting schema markup is a JSON-LD structured data type based on Schema.org that is specifically designed for blog-format content. It is a subtype of Article, which is itself a subtype of CreativeWork, and it inherits all of those parent properties while signaling to search engines that the content is part of a blog rather than a news article or technical report. Google uses BlogPosting schema to understand who wrote a piece, when it was published and updated, and whether it qualifies for article rich results in Search, Discover, and Google News. The markup itself is not complicated, but specific fields are required versus recommended, and mixing those up accounts for most of the validation errors I encounter in schema audits.
BlogPosting vs Article vs NewsArticle: when each applies
The distinction matters more than most implementations suggest. Schema.org defines a clear hierarchy:
- BlogPosting — the correct type for blog content: posts with a named author, a publication date, a first-person or perspective-driven voice, and a home in a blog archive. Semantically more accurate than using the parent
Articletype for this content format. Either will satisfy Google’s parser for rich results, butBlogPostingsends a more precise entity signal to AI systems that are categorizing content by type. - Article — the broader parent type. Use it for long-form editorial content that is not blog-format: white papers, evergreen guides, research pieces, opinion essays that live outside a blog section. If the page has a byline and a date but the content is more formal or encyclopedic than blog-style,
Articleis the better fit. - NewsArticle — strictly for time-sensitive news content: breaking stories, event coverage, press releases. Google applies its own eligibility criteria for the Top Stories carousel beyond just the schema type, and using
NewsArticleon evergreen blog posts is both semantically wrong and unlikely to yield the results you want.
For most blog content published without a formal news operation, BlogPosting is the right type and requires no special publisher agreement or news indexing eligibility.
Required and recommended fields for BlogPosting
Google marks the following as required for article rich results — missing any means your markup is detected but not eligible for enhanced display.
- headline (required) — the post title, 110 characters or fewer. Must match the visible heading on the page. A mismatch between the schema headline and the on-page
<h1>is a guidelines violation. - image (required) — a full absolute URL to a representative image. Minimum 1200 pixels wide for large image rich results; 696 pixels wide is the minimum for any image rich result. A relative URL here is invalid. This is the most common missing field in BlogPosting implementations I audit.
- datePublished (required) — ISO 8601 format (e.g.,
2025-03-10T09:00:00+00:00or simply2025-03-10). The date of first publication. Used for freshness signals and for ordering content in Discover. - author (required) — a
PersonorOrganizationentity. At minimum include@typeandname. Including aurlpointing to an author page or profile strengthens the entity connection in Google’s knowledge graph. A plain string ('author': 'Terry Samuels') is technically valid but loses the entity linking. - dateModified (recommended, treated as expected) — ISO 8601 date of the most recent substantive update. Omitting it entirely reduces freshness confidence. Set it only when you have actually updated the content.
- publisher (recommended) — an
Organizationwithnameand alogoImageObject. Required for Google News eligibility. The logo must meet minimum dimension requirements (60px height, up to 600px wide on a white background per historical Google guidelines). - description (recommended) — a short summary of the post. Not required for rich results but useful for Discover card formatting and AI entity extraction.
- mainEntityOfPage (recommended) — a
WebPageobject with the canonical URL as its@id. Ties the post to its URL as the primary topic of that page.
BlogPosting JSON-LD example
Here is a complete working example with all required and key recommended fields. All JSON-LD keys and string values use single quotes — no raw double-quote characters.
<script type='application/ld+json'>
{
'@context': 'https://schema.org',
'@type': 'BlogPosting',
'headline': 'BlogPosting Schema Markup: How to Implement It Correctly',
'image': 'https://terrysamuels.com/images/blogposting-schema.jpg',
'datePublished': '2024-03-01',
'dateModified': '2025-06-10',
'author': {
'@type': 'Person',
'name': 'Terry Samuels',
'url': 'https://terrysamuels.com/',
'sameAs': 'https://www.linkedin.com/in/terrysamuels'
},
'publisher': {
'@type': 'Organization',
'name': 'Salterra Digital',
'logo': {
'@type': 'ImageObject',
'url': 'https://terrysamuels.com/images/salterra-logo.png',
'width': 600,
'height': 60
}
},
'description': 'A practical guide to adding BlogPosting schema markup — required fields, common errors, and how to test your output.',
'mainEntityOfPage': {
'@type': 'WebPage',
'@id': 'https://terrysamuels.com/blogposting-schema-markup/'
}
}
</script>
The sameAs property on the Person entity is where you extend the author beyond your domain by linking to an authoritative external profile — LinkedIn, Twitter/X, Wikipedia, or Wikidata. More external entity connections let Google identify the author more confidently as a real, known person.
How to add BlogPosting schema markup
WordPress with Yoast SEO or RankMath
Both plugins generate BlogPosting (or Article) markup automatically on post pages. Yoast outputs a full schema graph that includes author, publisher, and date fields drawn from the WordPress post metadata and the plugin’s own settings. RankMath does the same and adds per-post schema type overrides in the post editor sidebar — useful if you want to switch a specific post from BlogPosting to Article or NewsArticle.
The practical limit of both plugins is that the author entity quality depends on the WordPress user profile. A thin author profile with no bio, no photo, and no external links produces a weak entity signal even with otherwise complete markup. Strengthen it by filling out each author profile fully and linking to external profiles via the website field or a custom field your theme outputs as sameAs.
Manual JSON-LD injection
On WordPress without a schema plugin, hook into wp_head in functions.php and output the JSON-LD block for single post pages, pulling get_the_title(), get_the_date('c'), and get_the_post_thumbnail_url() dynamically. On Squarespace Business plan, Webflow, or static HTML pages, paste the block into per-page head injection. This is workable for small blogs but does not scale — for larger libraries a platform with native schema support is the more practical option.
How to test BlogPosting schema markup
Use two tools before publishing and after any theme or plugin change:
- Google Rich Results Test — paste the URL or raw HTML and see whether Google detects
BlogPosting, which required fields are present, and whether the markup is eligible for article rich results. Common errors: missing image, headline over 110 chars, author missing subproperties. - Schema Markup Validator (validator.schema.org) — tests against the full Schema.org specification and surfaces deprecated properties and type mismatches the Rich Results Test ignores.
- Google Search Console Enhancements — after deployment, Search Console’s structured data reports catch regressions across all crawled pages over time.
If Google flags Missing field: image, check that you are passing an absolute URL (https://yourdomain.com/images/photo.jpg) rather than a relative path — the most common image validation failure.
BlogPosting schema and AI search
AI Overviews and large language models use structured data as a translation layer — it gives them explicit, machine-readable facts about a piece of content rather than inferences from prose. A complete BlogPosting block tells these systems who wrote the content, when it was published, when it was last updated, and who the publisher is. Those are facts an AI can cite with confidence.
The datePublished and dateModified fields are freshness signals that AI systems use to assess whether content is current enough to surface for time-sensitive queries. Keep dateModified accurate — update it when you genuinely revise a post and leave it alone when you have not. The sameAs property on the Person entity extends the author into a broader knowledge graph, which is the structured data layer underneath what Google describes as E-E-A-T expressed as machine-readable entity relationships.
Common mistakes with BlogPosting schema
- Headline longer than 110 characters. Google’s guidelines explicitly cap the headline property at 110 characters and will flag longer values in the Rich Results Test. Truncate or rewrite rather than leaving an overlong headline in the markup.
- Relative image URL. The
imagefield requires an absolute URL beginning withhttps://. A relative path like/images/post-cover.jpgwill fail validation. - Omitting dateModified. Not required, but its absence reduces confidence in freshness signals. If you are going to add structured data, include it — and keep it honest.
- Author as a plain string.
'author': 'Terry Samuels'tells Google a name.'author': {'@type': 'Person', 'name': 'Terry Samuels', 'url': '...'}tells Google who that person is in the knowledge graph. Use the entity object, not the string. - Adding BlogPosting to non-article pages. Category pages, tag archives, the blog index, and the homepage are not blog posts. Adding
BlogPostingmarkup to those pages confuses the parser and may cause errors in Search Console across your entire crawled archive. - Duplicate schema from plugin plus manual injection. If Yoast or RankMath is active and you also add a manual
BlogPostingblock to the same page, you will have two competing structured data objects of the same type. Always check what is already being output before adding more.
- Article Schema MarkupThe parent type — when to use Article vs BlogPosting
- FAQPage vs QAPage SchemaWhich type to use when your post includes questions and answers
- Schema Markup AuditFull audit of your current structured data output and gap analysis
If you have a library of blog posts that have never had structured data, a schema audit is the efficient way to assess the scope and prioritize fixes. For full implementation support across your content archive, visit schema markup consulting.