XooCode(){

BlogPosting

BlogPosting is the Article subtype for blog content: personal essays, opinion pieces, company updates, how-to guides published on a blog. Google's article rich result treats BlogPosting identically to base Article and NewsArticle, so the choice is about semantics, not search ranking. Use BlogPosting when the content lives on a blog and is written in a first-person or editorial voice.

The property that separates BlogPosting from its siblings is the isPartOf relationship to a Blog container. This tells consumers (and AI systems walking the graph) that the post belongs to a specific blog, which in turn belongs to a publisher. The other notable additions over base Article are comment/commentCount for reader discussion and interactionStatistic for social engagement metrics.

Full example of schema.org/BlogPosting json-ld markup

The markup is verified as valid with Rich Results Test from Google.

Highlight legend:Required by GoogleRecommendedOptional
schema.org/BlogPosting
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@id": "https://xoocode.com/blog/why-a-structured-data-company-sells-tshirts#article",
  "@type": "BlogPosting",
  "headline": "Why a Structured Data Company Sells T-Shirts",
  "alternativeHeadline": "The story behind XooTee and what screen-printing taught us about schema markup",
  "description": "Xoo Code started as a developer tools company. Then we launched a t-shirt line. Here is how screen-printing at our Dunmore shop became the best way to explain structured data to non-developers.",
  "image": [
    "https://xoocode.com/blog/images/xootee-launch-1x1.jpg",
    "https://xoocode.com/blog/images/xootee-launch-4x3.jpg",
    "https://xoocode.com/blog/images/xootee-launch-16x9.jpg"
  ],
  "url": "https://xoocode.com/blog/why-a-structured-data-company-sells-tshirts",
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://xoocode.com/blog/why-a-structured-data-company-sells-tshirts"
  },
  "author": {
    "@type": "Person",
    "name": "Lena Vasquez",
    "url": "https://xoocode.com/team/lena-vasquez",
    "jobTitle": "Head of Product",
    "worksFor": {
      "@id": "https://xoocode.com#organization"
    }
  },
  "publisher": {
    "@type": "Organization",
    "@id": "https://xoocode.com#organization",
    "name": "Xoo Code Inc.",
    "url": "https://xoocode.com",
    "logo": {
      "@type": "ImageObject",
      "url": "https://xoocode.com/images/xoocode-logo.png",
      "width": "600",
      "height": "60"
    }
  },
  "datePublished": "2026-02-10T09:00:00-05:00",
  "dateModified": "2026-02-14T11:20:00-05:00",
  "inLanguage": "en-US",
  "articleSection": "Company",
  "wordCount": "1820",
  "keywords": "XooTee, screen printing, structured data, Dunmore, company update",
  "isPartOf": {
    "@type": "Blog",
    "@id": "https://xoocode.com/blog#blog",
    "name": "Xoo Code Blog",
    "url": "https://xoocode.com/blog",
    "publisher": {
      "@id": "https://xoocode.com#organization"
    }
  },
  "about": [
    {
      "@type": "Brand",
      "@id": "https://xoocode.com/brands/xootee#brand"
    },
    {
      "@type": "Product",
      "@id": "https://xoocode.com/shop/xootee-classic#product"
    }
  ],
  "mentions": [
    {
      "@type": "LocalBusiness",
      "@id": "https://xoocode.com/shop/dunmore-1290"
    }
  ],
  "commentCount": 14,
  "comment": [
    {
      "@type": "Comment",
      "author": {
        "@type": "Person",
        "name": "DevRaj Patel"
      },
      "dateCreated": "2026-02-10T15:42:00-05:00",
      "text": "Love the analogy between print layers and nested schema types. Finally clicked for me."
    }
  ],
  "interactionStatistic": [
    {
      "@type": "InteractionCounter",
      "interactionType": "https://schema.org/LikeAction",
      "userInteractionCount": 237
    },
    {
      "@type": "InteractionCounter",
      "interactionType": "https://schema.org/CommentAction",
      "userInteractionCount": 14
    }
  ],
  "speakable": {
    "@type": "SpeakableSpecification",
    "cssSelector": [".post-title", ".post-intro"]
  },
  "isAccessibleForFree": true,
  "copyrightYear": "2026",
  "copyrightHolder": {
    "@id": "https://xoocode.com#organization"
  }
}
</script>

isPartOf and the Blog container

A BlogPosting can declare its parent blog via isPartOf with a Blog type. The Blog carries its own name, URL, and publisher reference. This is optional but useful: it lets search engines and AI systems group posts by blog, and it gives the blog itself a stable @id that other posts can reference. If your site has multiple blogs (engineering blog, company blog, guest blog), this structure disambiguates which blog each post belongs to.

Comments and engagement

commentCount is a simple integer: the total number of comments on the page, not just the ones you include in markup. The comment property takes an array of Comment objects, each with an author, date, and text. You do not need to include every comment, but a representative sample gives AI systems more context about reader response. The interactionStatistic array uses InteractionCounter objects to report likes, shares, and comments as aggregate numbers.

BlogPosting vs Article vs NewsArticle

All three produce the same Google article rich result. The difference is what you communicate about the content. Use Article as the default for long-form content that does not fit a more specific subtype. Use NewsArticle for time-sensitive reporting with a byline and dateline. Use BlogPosting for editorial and opinion content published on a blog. The subtype does not affect ranking, but it helps consumers of the structured data (feed readers, aggregators, AI) categorize the content correctly.

Author identity on blogs

Blog posts benefit from detailed author markup more than most content types. Include the author's url (their profile page), jobTitle, and worksFor if applicable. Google uses author identity signals for expertise evaluation, and AI systems use them for citation attribution. If the author has a Person entry elsewhere on the site, reference it via @id instead of duplicating the data.

Minimal valid version

The smallest markup that still produces a valid BlogPosting entity. Use it as the floor. Reach for the advanced example above when you want search engines and AI agents to understand more about your content.

schema.org/BlogPosting (minimal)
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "Why a Structured Data Company Sells T-Shirts",
  "image": "https://xoocode.com/blog/images/xootee-launch-16x9.jpg",
  "datePublished": "2026-02-10T09:00:00-05:00",
  "author": {
    "@type": "Person",
    "name": "Lena Vasquez"
  }
}
</script>

Google rich results this unlocks

Markup matching this example makes your page eligible for the following Google Search rich results. The primary target drives the required / recommended property classification in the advanced code block above.

Common BlogPosting mistakes

Mistakes that pass validation but silently fail to earn rich results or mislead consumers walking the graph. Avoid these and your markup will be ahead of most sites in the wild.

  1. 01

    Omitting the Blog container

    Wrong
    (BlogPosting with no isPartOf property)
    Right
    "isPartOf": {
      "@type": "Blog",
      "@id": "https://xoocode.com/blog#blog",
      "name": "Xoo Code Blog"
    }

    isPartOf with a Blog type is not required for the rich result, but it tells search engines and AI systems which blog the post belongs to. Without it, there is no structured connection between the post and the blog. If your site has one blog this is minor; if you have multiple blogs it is important for disambiguation.

  2. 02

    commentCount that only counts markup comments

    Wrong
    "commentCount": 1 (because only 1 Comment object is in the markup, when the page has 14 comments)
    Right
    "commentCount": 14 (the real total, regardless of how many Comment objects you include in markup)

    commentCount is the total number of comments on the page, not the number of Comment objects in your JSON-LD. You can include a representative sample of comments in the markup while still reporting the correct total count.

  3. 03

    Using NewsArticle for blog content

    Wrong
    "@type": "NewsArticle" on a personal or company blog post
    Right
    "@type": "BlogPosting"

    NewsArticle signals time-sensitive reporting to aggregators and Top Stories. Using it for evergreen blog content misrepresents the content. Google does not penalize the wrong choice, but news aggregators may pull and then deprioritize content that is not actually news.

  4. 04

    Author without a profile URL

    Wrong
    "author": { "@type": "Person", "name": "Lena Vasquez" }
    Right
    "author": { "@type": "Person", "name": "Lena Vasquez", "url": "https://xoocode.com/team/lena-vasquez" }

    Google uses author URLs for E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) evaluation. A named author without a verifiable profile page is harder for Google to connect to a real identity. Always include url on blog post authors.

  5. 05

    interactionType as a plain string

    Wrong
    "interactionType": "LikeAction"
    Right
    "interactionType": "https://schema.org/LikeAction"

    interactionType expects a full schema.org URL, not a plain type name. Plain strings may validate in some tools but are not reliably parsed by all consumers. Use the full URL form.

About the example data

The post is on the Xoo Code company blog, written by Lena Vasquez (fictional head of product at Xoo Code Inc.). It explains why a developer tools company launched a t-shirt line at the Dunmore shop. The about property references the Brand and Product examples via @id, and mentions points to the LocalBusiness.

Comments

Loading comments...

Leave a comment