16 min read · Technical SEO · Last updated July 2026
Quick answer: JSON-LD is the only format worth using for schema markup in 2026. Place it in
<script type="application/ld+json">tags in your HTML. This guide gives you validated, copy-paste ready code for every major schema type — Organization, LocalBusiness, Article, FAQPage, HowTo, and BreadcrumbList — plus the logic for combining multiple types on one page.
Introduction
Theory is easy. Execution is where schema markup implementations fail. Most tutorials show a single clean example and stop there — they don’t show you what the code looks like for a homepage that needs both Organization and BreadcrumbList, or a blog post that carries Article, BreadcrumbList, and FAQPage simultaneously.
This guide is implementation-first. Every schema type in here comes with complete, validated JSON-LD that you can copy, adapt to your site, and test. No handwaving about “add your properties here” — you get the structure, the required fields populated, and the logic for nesting complex objects.
By the end of this guide, you’ll have working code for every major schema type and a clear decision framework for which types go on which pages of your site.
What you’ll learn:
– The exact JSON-LD syntax for Organization, LocalBusiness, Article, FAQPage, HowTo, and BreadcrumbList
– Which properties are required vs recommended for each type
– How to combine multiple schema types correctly on a single page
– How to use the @graph construct for multi-type pages
– Common implementation errors and how to avoid them
Table of Contents
- JSON-LD Syntax Foundations
- Organization Schema
- LocalBusiness Schema
- Article Schema
- FAQPage Schema
- HowTo Schema
- BreadcrumbList Schema
- Combining Multiple Schema Types
- Frequently Asked Questions
- Conclusion
JSON-LD Syntax Foundations
Before diving into individual types, you need to understand three non-negotiable syntax elements:
@context — always "https://schema.org". This tells the parser which vocabulary you’re using. Without it, no structured data is parsed.
@type — the schema.org type you’re declaring (Article, Product, FAQPage, etc.). This determines which rich result you’re eligible for and which properties are valid.
@id — an optional but recommended canonical URL for the entity. When you want Google to recognize your Organization as a distinct entity across multiple pages, give it a stable @id. This helps with Knowledge Graph recognition.
Every JSON-LD block lives in a <script> tag:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "YourType",
"property": "value"
}
</script>
You can have multiple <script type="application/ld+json"> blocks on one page. Each is processed independently. Alternatively, use @graph to combine multiple entities in one block — covered in the Combining section below.
One critical rule: all values in JSON-LD must match what’s visible on the page. Price in your Product schema must match the displayed price. The author name in Article schema must match the byline on the page. Content mismatch is a Google policy violation with manual action consequences.
Organization Schema
Organization schema belongs on your homepage and typically in your site’s global header template so it appears on every page. It tells Google who you are as an entity — establishing your brand in the knowledge graph.
When to use it: Every website should have Organization schema. It establishes entity identity, which feeds AI Overview citations and Knowledge Panel data.
Required properties: name, url
Recommended properties: logo, contactPoint, sameAs, address, description, foundingDate
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://ignitednepal.com/#organization",
"name": "Ignited Nepal",
"url": "https://ignitednepal.com",
"logo": {
"@type": "ImageObject",
"url": "https://ignitednepal.com/assets/logo.png",
"width": 400,
"height": 100
},
"description": "Growth engineering company specializing in technical SEO, web development, and organic search systems.",
"foundingDate": "2019",
"address": {
"@type": "PostalAddress",
"addressLocality": "Kathmandu",
"addressCountry": "NP"
},
"contactPoint": {
"@type": "ContactPoint",
"contactType": "customer service",
"email": "hello@ignitednepal.com",
"availableLanguage": ["English", "Nepali"]
},
"sameAs": [
"https://www.linkedin.com/company/ignited-nepal",
"https://twitter.com/ignitednepal",
"https://www.facebook.com/ignitednepal"
]
}
</script>
The sameAs array is particularly important for AI visibility. It links your Organization entity to profiles on authoritative platforms that AI systems already have in their training data. The more sameAs connections you provide to trusted sources (LinkedIn, Crunchbase, Wikipedia if applicable), the more likely AI systems recognize you as a distinct, trustworthy entity.
The @id with a fragment identifier (#organization) creates a stable, referenceable ID for this entity that you can point to from other schema blocks on other pages. When your Article schema references "publisher": {"@id": "https://ignitednepal.com/#organization"}, Google can resolve that reference across your site.
LocalBusiness Schema
LocalBusiness extends Organization with location-specific properties. Use it for businesses with a physical address that serve customers in person or in a defined geographic area.
When to use it: Any business with a physical location — restaurant, dental clinic, retail store, consulting office, gym, hotel.
Required properties: name, address (PostalAddress)
Recommended properties: telephone, openingHours, geo, url, image, priceRange, servesCuisine (for restaurants)
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"@id": "https://yoursite.com/#localbusiness",
"name": "Your Business Name",
"url": "https://yoursite.com",
"telephone": "+1-555-123-4567",
"priceRange": "$$",
"image": "https://yoursite.com/storefront.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main Street",
"addressLocality": "Sydney",
"addressRegion": "NSW",
"postalCode": "2000",
"addressCountry": "AU"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": -33.8688,
"longitude": 151.2093
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "17:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "10:00",
"closes": "14:00"
}
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "247",
"bestRating": "5"
}
}
</script>
The geo property with GeoCoordinates strengthens your local search presence. Google Maps integration and local pack inclusion are influenced by structured geographic signals. The openingHoursSpecification format is more precise than openingHours (the shorthand string format) and handles holiday closures with validFrom and validThrough extensions.
For service-area businesses (plumbers, electricians, consultants) that don’t have a walk-in location, use ServiceBusiness or a more specific subtype like ProfessionalService. Add areaServed to indicate your service geography: "areaServed": {"@type": "City", "name": "Kathmandu"}.
Article Schema
Article schema (or its subtypes NewsArticle and BlogPosting) enables rich results in Top Stories and adds structured signals that Google uses for article freshness and author credibility assessment.
When to use it: Blog posts, news articles, editorial content, thought leadership pieces.
Required properties: headline, image, datePublished, author
Recommended properties: dateModified, description, publisher, mainEntityOfPage, keywords
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://yoursite.com/blog/your-article-url"
},
"headline": "Your Article Headline (Max 110 characters)",
"description": "A brief description of the article content that matches the visible meta description.",
"image": {
"@type": "ImageObject",
"url": "https://yoursite.com/blog/article-featured-image.jpg",
"width": 1200,
"height": 630
},
"datePublished": "2026-07-10T09:00:00+05:45",
"dateModified": "2026-07-10T09:00:00+05:45",
"author": {
"@type": "Person",
"name": "Priya Sharma",
"url": "https://yoursite.com/author/priya-sharma",
"sameAs": [
"https://www.linkedin.com/in/priyasharma",
"https://twitter.com/priyasharma"
]
},
"publisher": {
"@type": "Organization",
"@id": "https://yoursite.com/#organization",
"name": "Your Company Name",
"logo": {
"@type": "ImageObject",
"url": "https://yoursite.com/logo.png"
}
},
"keywords": ["technical SEO", "schema markup", "structured data"]
}
</script>
Use BlogPosting for blog content, NewsArticle for timely news content on news publisher sites, and Article for general editorial. The type choice affects Top Stories eligibility — NewsArticle is explicitly supported for news publishers in the Top Stories carousel.
The dateModified field matters for content freshness signals. If you update an article, update dateModified. Google uses this to assess whether content is actively maintained.
Author sameAs links are critical for E-E-A-T. Linking to an author’s LinkedIn profile, personal website, or Google Scholar page gives Google evidence that this author is a real, verifiable person with expertise in the field.
FAQPage Schema
FAQPage schema is one of the highest-impact schema types for content pages. When Google displays FAQ rich results, your page takes up significantly more SERP real estate — showing 2–5 questions and answers directly in the search result without a click required.
When to use it: Dedicated FAQ pages, FAQ sections on service pages, informational content with clear Q&A structure.
Content policy: Only use FAQPage schema when the Q&A content is genuinely present and visible on the page. The questions and answers in JSON-LD must match what’s displayed in HTML.
Required properties: mainEntity (array of Question objects with acceptedAnswer)
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is schema markup and why does it matter for SEO?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Schema markup is structured data code that explicitly tells search engines what your content is — a product, FAQ, event, etc. It matters for SEO because it enables rich results in SERPs (star ratings, FAQ dropdowns, recipe cards) which typically improve click-through rates by 20–30%. In 2026, schema also helps AI Overviews cite your content accurately."
}
},
{
"@type": "Question",
"name": "How many questions can I include in FAQPage schema?",
"acceptedAnswer": {
"@type": "Answer",
"text": "There is no official limit on the number of questions, but Google typically shows 2–5 FAQ dropdowns in rich results. All questions must have corresponding visible content on the page. Including 5–10 well-targeted questions is a reasonable approach."
}
},
{
"@type": "Question",
"name": "Can I use FAQPage schema on product pages?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, if the product page contains a visible FAQ section with questions and answers. Adding a FAQ section to product pages is an effective strategy for both rich result eligibility and answering pre-purchase questions that reduce barriers to conversion."
}
}
]
}
</script>
Target questions that match actual search queries. Pull from Google Search Console — look at queries containing “how,” “what,” “can I,” “does,” “is,” and use those as your FAQ questions. This creates direct alignment between user search intent and your FAQ schema content.
HowTo Schema
HowTo schema creates rich step-by-step results, especially visible on mobile where Google shows individual steps with images. It’s particularly effective for tutorial and instructional content.
When to use it: Any page with a step-by-step process — setting up software, cooking a recipe (use Recipe for food), installing hardware, completing a task.
Required properties: name, step (array of HowToStep objects with name and text)
Recommended properties: image, estimatedCost, totalTime, prepTime, supply, tool
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to Add JSON-LD Schema Markup to a WordPress Site",
"description": "A step-by-step process for implementing structured data on WordPress without coding.",
"totalTime": "PT30M",
"estimatedCost": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": "0"
},
"tool": [
{
"@type": "HowToTool",
"name": "Rank Math SEO Plugin"
},
{
"@type": "HowToTool",
"name": "Google Rich Results Test"
}
],
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Install Rank Math SEO",
"text": "Go to WordPress Dashboard > Plugins > Add New. Search for Rank Math SEO. Click Install Now and then Activate.",
"image": "https://yoursite.com/howto/step1-install-rankmath.jpg",
"url": "https://yoursite.com/howto-article#step1"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Configure Schema Settings",
"text": "In Rank Math, go to Titles & Meta > Global Meta. Select the default schema type for Posts (BlogPosting) and Pages (WebPage). Save changes.",
"image": "https://yoursite.com/howto/step2-configure-schema.jpg",
"url": "https://yoursite.com/howto-article#step2"
},
{
"@type": "HowToStep",
"position": 3,
"name": "Add Custom Schema Per Post",
"text": "When editing any post or page, scroll to the Rank Math sidebar. Click Schema. Select your schema type and fill in the required fields for that page type.",
"image": "https://yoursite.com/howto/step3-custom-schema.jpg",
"url": "https://yoursite.com/howto-article#step3"
},
{
"@type": "HowToStep",
"position": 4,
"name": "Test with Rich Results Test",
"text": "Copy your page URL and paste it into search.google.com/test/rich-results. Check that your schema type is detected and that no errors are shown.",
"image": "https://yoursite.com/howto/step4-test.jpg",
"url": "https://yoursite.com/howto-article#step4"
}
]
}
</script>
Images per step dramatically increase rich result visibility on mobile. Google can show step images in the rich result, making your result look like a visual tutorial in the SERP. Invest in screenshot or step illustration images for HowTo content.
BreadcrumbList Schema
BreadcrumbList is the most universally applicable schema type — it belongs on virtually every page of every site beyond the homepage. It controls the breadcrumb path displayed under your URL in SERP results.
When to use it: All pages below the homepage level. Category pages, product pages, blog posts, service pages.
Required properties: itemListElement array with ListItem objects, each with position, name, and item (URL)
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://yoursite.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Technical SEO",
"item": "https://yoursite.com/technical-seo"
},
{
"@type": "ListItem",
"position": 3,
"name": "Schema Markup Implementation Guide",
"item": "https://yoursite.com/technical-seo/schema-markup-implementation"
}
]
}
</script>
The breadcrumb in SERPs replaces the raw URL display with a readable path like yoursite.com › Technical SEO › Schema Markup Implementation. This improves CTR because it communicates page context at a glance and makes your result look more organized than a raw URL string.
Breadcrumb schema must match your actual site navigation structure. If the breadcrumb trail on your page shows Home > Blog > Article, your JSON-LD must reflect exactly that. Mismatches get rejected.
For dynamically generated breadcrumbs (common on e-commerce sites with multiple category paths to one product), use the canonical breadcrumb path — the primary hierarchy you want Google to display.
Combining Multiple Schema Types
Most pages benefit from more than one schema type. A blog post should have Article + BreadcrumbList. A service page might have Service + FAQPage + BreadcrumbList. A homepage needs Organization + WebSite.
Method 1: Separate <script> blocks (simplest)
<!-- BreadcrumbList block -->
<script type="application/ld+json">
{ "@context": "https://schema.org", "@type": "BreadcrumbList", ... }
</script>
<!-- Article block -->
<script type="application/ld+json">
{ "@context": "https://schema.org", "@type": "BlogPosting", ... }
</script>
<!-- FAQPage block -->
<script type="application/ld+json">
{ "@context": "https://schema.org", "@type": "FAQPage", ... }
</script>
Google processes each block independently. This is the easiest approach and avoids any syntax errors from trying to merge blocks.
Method 2: @graph for entity relationships
Use @graph when entities reference each other — for example, an Article that references an Organization publisher, and you want Google to resolve that relationship:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://yoursite.com/#organization",
"name": "Your Company",
"url": "https://yoursite.com",
"logo": { "@type": "ImageObject", "url": "https://yoursite.com/logo.png" }
},
{
"@type": "BlogPosting",
"@id": "https://yoursite.com/blog/post/#article",
"headline": "Your Article Headline",
"publisher": { "@id": "https://yoursite.com/#organization" },
"author": { "@type": "Person", "name": "Author Name" },
"datePublished": "2026-07-10",
"image": "https://yoursite.com/blog/image.jpg"
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://yoursite.com" },
{ "@type": "ListItem", "position": 2, "name": "Blog", "item": "https://yoursite.com/blog" },
{ "@type": "ListItem", "position": 3, "name": "Your Article", "item": "https://yoursite.com/blog/post" }
]
}
]
}
</script>
The @graph approach is more semantically powerful because entity relationships (publisher references Organization by @id) are explicitly resolved. This is what Yoast SEO and Rank Math generate by default on WordPress sites.
Key takeaway: Use
@graphwhen entities reference each other. Use separate script blocks for independent schema types. Test every combination with the Rich Results Test before deploying.
Frequently Asked Questions
What is the difference between @type Article and @type BlogPosting?
Both are schema.org types and both are supported by Google. Article is the parent type; BlogPosting and NewsArticle are subtypes. For blog content, BlogPosting is more semantically precise. For news publisher content eligible for Top Stories, use NewsArticle. Google treats all three similarly for most rich results — the distinction is primarily semantic precision.
Do I need to add schema markup to every page on my site?
No — focus on page types rather than individual pages. Create a schema template for each page type (blog post template, product template, homepage) and apply it programmatically. Every blog post gets the same Article schema structure, just with different dynamic values. On WordPress, plugins handle this automatically.
Can FAQPage schema and HowTo schema be on the same page?
Yes. If your page has both a how-to process and an FAQ section at the bottom, implement both. Each schema type is processed independently for its own rich result eligibility. A tutorial page with HowTo schema for the steps and FAQPage schema for the Q&A section at the bottom is a valid and common combination.
How do I update schema markup when content changes?
For dynamically generated schema (via CMS plugins or templates), it updates automatically when content changes. For hardcoded JSON-LD, you must update it manually whenever the corresponding content changes — particularly prices, dates, and ratings. Content mismatches are policy violations.
My site has thousands of product pages. Do I implement schema on all of them?
Yes, but through templates, not manually. Your product page template should have JSON-LD that dynamically pulls product name, price, availability, and rating from your database. Once the template is updated, all product pages get schema simultaneously. This is how platforms like Shopify and WooCommerce implement schema at scale.
Does schema markup help with voice search?
Indirectly. Voice assistants primarily read from featured snippets, and FAQPage and HowTo schema can improve featured snippet eligibility. There’s no direct “voice search” schema type, but well-structured schema that helps Google understand content context also improves the chances of voice search inclusion.
Conclusion
Schema markup implementation is a systematic process, not a creative one. The types are defined. The properties are specified. The testing tools are public. What most sites lack is execution — getting the right JSON-LD onto the right page types with the right properties.
Use the builder widget above to generate starting code for any page type. Validate every implementation with the Rich Results Test. Deploy, then monitor Search Console Enhancements monthly. Fix errors within two weeks of detection.
At scale — 500+ product pages, 200+ blog posts, 50+ service pages — schema markup implementation is the difference between appearing with plain blue links and appearing with star ratings, breadcrumbs, FAQ dropdowns, and step-by-step rich results. That visual differentiation compounds over thousands of impressions.
Let Ignited Nepal Handle This
→ Request a Free Technical SEO Audit
Written by the Ignited Nepal SEO team. We build organic search systems for businesses across Nepal, Australia, UAE, USA, UK, and beyond. ignitednepal.com