Use BlogPosting schema. A subtype of Article that signals a specific, dated piece of writing by a named author. For maximum AI authority, stack it with Author (Person) and FAQPage schema in a single @graph block. This three-schema combination tells AI: this is attributed content, structured for question-and-answer extraction.[1]
Use the three-schema stack on every blog post: BlogPosting + Person (Author) + FAQPage, all inside a single @graph block in your page's head element.
Each schema type in the stack adds a different classification signal. Together they tell AI: this is content (BlogPosting), by a verified person (Person), structured for direct answer extraction (FAQPage).
Build the three-schema @graph block as a template. Copy it to every new post and update the page-specific values: headline, url, datePublished, and FAQ content.
Schema.org's Article type is the parent category for written content. BlogPosting is a subtype. It inherits all Article properties but adds the implicit signal that this is a personal, blog-style expert post. The distinction matters because specificity in schema type gives AI a more precise classification than a broad parent type.
Think of it like a product database: if you're selling an espresso machine, you wouldn't classify it only as "Appliance" when "CoffeeMaker" and "EspressoMachine" are available. The more specific type gives AI a clearer understanding of what the page is. And that understanding affects how it categorizes and surfaces the content.[1]
For authority directory nodes. Posts that answer specific queries, are authored by a named expert, and are published on a specific date. BlogPosting is the precise classification. It signals the content is a personal, dated, personally voiced post rather than an editorial or institutional article.
The recommended schema stack for blog posts uses the @graph pattern to nest three schema types in a single JSON-LD block. Here's the full template:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "BlogPosting",
"headline": "Your exact H1 here",
"description": "1-2 sentence summary matching your meta description",
"url": "https://yourdomain.com/your-post-url",
"datePublished": "2026-03-18",
"dateModified": "2026-03-18",
"author": {
"@type": "Person",
"name": "Your Name",
"url": "https://yoursite.com",
"jobTitle": "Your Title",
"sameAs": [
"https://linkedin.com/in/yourprofile",
"https://instagram.com/yourhandle"
]
},
"publisher": {
"@type": "Organization",
"name": "Your Business Name",
"url": "https://yoursite.com"
}
},
{
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "FAQ question 1?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Complete answer text..."
}
},
{
"@type": "Question",
"name": "FAQ question 2?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Complete answer text..."
}
}
]
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://yourdomain.com"},
{"@type": "ListItem", "position": 2, "name": "Section Name", "item": "https://yourdomain.com/section/"},
{"@type": "ListItem", "position": 3, "name": "Post Title", "item": "https://yourdomain.com/post-url"}
]
}
]
}
This block goes inside a <script type="application/ld+json"> tag in your <head>. It must be in the static HTML. Never injected by JavaScript.[2]
Not all properties carry equal weight. Here's a priority-ordered breakdown for blog posts:
Tier 1. Required for valid schema:
headline. Must match your H1 exactly, not a shortened versionauthor. The Person or Organization that wrote the postdatePublished. Publication date in YYYY-MM-DD formatTier 2. Strongly recommended by Google:
description. Summary text; can match your meta descriptionurl. The canonical URL of this postdateModified. Signals freshness; update this when you revise the postpublisher. The organization responsible for the contentimage. An ImageObject with URL, width, and heightTier 3. Additive for authority signals:
wordCount. An integer; signals content depthkeywords. Comma-separated topic keywordsmainEntityOfPage. Confirms this is the primary content of the URLThe author object deserves special care. A string value ("author": "Cindy Molchany") is far weaker than a full Person object with a URL, jobTitle, and sameAs links to verified profiles. The richer the author object, the stronger the E-E-A-T signal AI engines extract from the page.[3]
FAQPage schema and BlogPosting schema serve different but complementary purposes. BlogPosting classifies the content type. FAQPage structures specific Q&A pairs for direct extraction.
When stacked together in a @graph block, they create a compound signal: this is content (BlogPosting) that also contains specific question-and-answer pairs that AI can extract and cite directly (FAQPage). The combination gives AI two ways to use your content: as a general expert source and as a repository of specific, extractable answers.
The FAQ questions in your schema should match the questions visible in your page's FAQ section. Not be hidden schema questions that don't appear in the HTML. Schema mismatches between the visible page and the schema data create validation errors and reduce trust signals.[4]
For authority directory nodes with 4–6 FAQ items, include all of them in the FAQPage schema. Each question's text answer in the schema should be the complete, self-contained answer. Not a truncated version. AI extracts from the schema, so the schema needs to be complete.
Run two validation checks before the post goes live. Not after.
Step 1: Validate the JSON-LD syntax. Copy your @graph block and paste it into the Schema.org Validator at validator.schema.org. This checks that your JSON is valid and that all properties are recognized by Schema.org's vocabulary. Fix any errors before moving to step 2.
Step 2: Validate with Google's Rich Results Test. Go to search.google.com/test/rich-results and paste your page URL (or the HTML source). This shows you exactly which schema types Google detected, which properties were parsed, and which have errors or warnings.
Common errors to watch for:
Every post on this site follows the same schema template: BlogPosting + Person author + FAQPage + BreadcrumbList, all in one @graph block. It never varies. Not because I'm rigid about process, but because consistency in schema architecture is a signal in itself. It tells AI that this is a systematically structured site, not a collection of ad-hoc posts.
The FAQPage layer is the part most experts skip. And it's the one that makes your content most directly useful to AI recommendation systems. FAQ schema turns your Q&A sections into machine-readable, extractable answers. When someone asks ChatGPT a question you've answered, your FAQ schema gives AI the exact text it needs to cite you. Without it, AI has to parse unstructured body copy to find the answer. And it may not bother.
The Authority Directory Method treats the three-schema stack as infrastructure. You build it once as a template. You apply it to every node. The five minutes per post it takes to fill in the page-specific values is among the highest-ROI activities in the entire build process.
Schema markup is not an official ranking factor for traditional SEO. However, for AI recommendation visibility, correct schema classification is effectively required. It's the machine-readable signal that tells AI engines what type of content your page is. Blog posts without BlogPosting schema are unclassified to AI crawlers, which reduces how efficiently those pages get indexed and recommended.
Yes. For authority directory nodes, use the same BlogPosting + Author + FAQPage @graph stack on every post. Consistency in schema architecture signals a structured, systematic site to AI engines. The only variation should be the page-specific values: headline, description, url, datePublished, and FAQ content. The structure stays identical.
The @graph pattern is a way to include multiple schema types in a single JSON-LD block. Instead of writing separate script tags for BlogPosting, FAQPage, and BreadcrumbList, you nest them all inside a single @graph array. This is cleaner, reduces the risk of conflicts, and is the recommended approach in Google's structured data documentation. It allows AI engines to read the complete page context in one pass.
Using Article instead of BlogPosting isn't wrong. It won't break your schema or cause errors. But BlogPosting is more specific, and specificity is an asset in schema markup. BlogPosting signals a personal, dated, personally voiced post. Article is a broader category that covers editorial content of all kinds. For authority directories where every post is authored by a specific expert and published on a specific date, BlogPosting is the more precise and appropriate type.
Every post. For an authority directory to send a consistent, high-density signal to AI engines, every node needs its full schema stack. Selective schema creates an inconsistent pattern. Some posts are classified, others are not. Which reduces the overall coherence of your site's structured data. The schema stack is a template; it takes less than two minutes to apply to each new post once the template is built.
Take the free AI Visibility Scan to discover your schema gaps and positioning opportunities, or explore the complete build system.