Skip to content
10 templates · CC BY 4.0 · Copy + ship

Schema Library

Production-grade JSON-LD for ecommerce, SaaS, and primary research. The patterns Google rewards, ready to paste.

Product

Single product page with offer, brand, GTIN, and aggregate rating.

schema.org

When to use

Every product detail page on an ecommerce store. Required for Google Shopping rich results and the most heavily-weighted Merchant Center compliance signal.

Why this shape

Includes GTIN, MPN, brand, and an Offer with hasMerchantReturnPolicy + shippingDetails - the four attributes Google Merchant Center weights highest for Shopping eligibility. AggregateRating included because review snippets boost CTR ~17% in our corpus.

product.json-ld
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Example Product Name",
  "image": [
    "https://example.com/photos/1x1/photo.jpg"
  ],
  "description": "A clear, accurate product description.",
  "sku": "SKU-12345",
  "gtin13": "0614141999996",
  "mpn": "MPN-99999",
  "brand": {
    "@type": "Brand",
    "name": "Example Brand"
  },
  "review": [
    {
      "@type": "Review",
      "reviewRating": {
        "@type": "Rating",
        "ratingValue": 5,
        "bestRating": 5
      },
      "author": {
        "@type": "Person",
        "name": "Jane Customer"
      },
      "reviewBody": "Excellent product.",
      "datePublished": "2026-04-01"
    }
  ],
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": 4.7,
    "reviewCount": 89,
    "bestRating": 5,
    "worstRating": 1
  },
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/product/sku-12345",
    "priceCurrency": "USD",
    "price": "49.99",
    "priceValidUntil": "2027-12-31",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition",
    "hasMerchantReturnPolicy": {
      "@type": "MerchantReturnPolicy",
      "applicableCountry": "US",
      "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
      "merchantReturnDays": 30,
      "returnMethod": "https://schema.org/ReturnByMail",
      "returnFees": "https://schema.org/FreeReturn"
    },
    "shippingDetails": {
      "@type": "OfferShippingDetails",
      "shippingRate": {
        "@type": "MonetaryAmount",
        "value": "5.00",
        "currency": "USD"
      },
      "shippingDestination": {
        "@type": "DefinedRegion",
        "addressCountry": "US"
      },
      "deliveryTime": {
        "@type": "ShippingDeliveryTime",
        "handlingTime": {
          "@type": "QuantitativeValue",
          "minValue": 0,
          "maxValue": 1,
          "unitCode": "DAY"
        },
        "transitTime": {
          "@type": "QuantitativeValue",
          "minValue": 1,
          "maxValue": 5,
          "unitCode": "DAY"
        }
      }
    }
  }
}

Organization

Single, canonical Organization node with logo, sameAs links, contact points.

schema.org

When to use

Place once on the homepage (and ideally on every page) using @id so the rest of the site graph can reference it. Powers the Google Knowledge Panel.

Why this shape

sameAs is the most important field for AI engine entity recognition. List every authoritative profile: Wikidata, LinkedIn, Crunchbase, G2, Capterra, plus official social accounts.

organization.json-ld
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "https://example.com/#organization",
  "name": "Example Inc.",
  "url": "https://example.com",
  "logo": "https://example.com/logo.png",
  "description": "What the company does, in one sentence.",
  "foundingDate": "2020",
  "sameAs": [
    "https://www.wikidata.org/wiki/QXXXXX",
    "https://www.linkedin.com/company/example",
    "https://www.crunchbase.com/organization/example",
    "https://www.g2.com/products/example"
  ],
  "contactPoint": [
    {
      "@type": "ContactPoint",
      "contactType": "customer support",
      "email": "support@example.com",
      "availableLanguage": [
        "English"
      ]
    }
  ]
}

FAQPage

Frequently-asked-questions block eligible for Google FAQ rich results.

schema.org

When to use

Place at the bottom of cluster articles and pillar pages. Five to ten questions is ideal. AI overviews extract these as one-line answers.

Why this shape

Plain Question + acceptedAnswer pairs. Don't nest in another schema. Google deprecated standalone FAQ rich results in some regions but the schema still feeds AI Overviews + voice search.

faq.json-ld
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is the question being answered?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The full answer in clear, sentence-cased prose. Cite sources inline if relevant."
      }
    },
    {
      "@type": "Question",
      "name": "Another common question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Direct, factual answer in one or two sentences."
      }
    }
  ]
}

HowTo

Step-by-step procedure with named steps. Powers Google's How-to rich results and voice-search step extraction.

schema.org

When to use

Any procedural article: 'How to fix X', 'How to set up Y'. Each step is a HowToStep with name + text + optional URL anchor.

Why this shape

Step text should be self-contained - voice assistants read each step in isolation. Add HowToTool and HowToSupply when the process requires them.

howto.json-ld
{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "How to do the thing",
  "description": "What this procedure accomplishes.",
  "totalTime": "PT30M",
  "tool": [
    {
      "@type": "HowToTool",
      "name": "Required tool"
    }
  ],
  "supply": [
    {
      "@type": "HowToSupply",
      "name": "Required supply"
    }
  ],
  "step": [
    {
      "@type": "HowToStep",
      "name": "Step 1 - short imperative title",
      "text": "Full instruction text for step 1. Self-contained.",
      "url": "https://example.com/page#step-1"
    },
    {
      "@type": "HowToStep",
      "name": "Step 2 - next action",
      "text": "Full instruction text for step 2.",
      "url": "https://example.com/page#step-2"
    }
  ]
}

Article

Blog post / editorial article with author Person, publisher, dates.

schema.org

When to use

Every blog post. Use BlogPosting if the article lives on a blog subdomain; use NewsArticle if it's news; otherwise plain Article is fine.

Why this shape

author should reference a Person node with sameAs links for E-E-A-T. dateModified + dateModified separately - Google weights freshness on dateModified.

article.json-ld
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "Article headline",
  "description": "What the article covers, in one sentence.",
  "image": [
    "https://example.com/og.png"
  ],
  "datePublished": "2026-05-22",
  "dateModified": "2026-05-22",
  "author": {
    "@type": "Person",
    "name": "Author Name",
    "url": "https://example.com/authors/author-name",
    "sameAs": [
      "https://www.linkedin.com/in/author",
      "https://x.com/author"
    ]
  },
  "publisher": {
    "@type": "Organization",
    "name": "Example Inc.",
    "logo": {
      "@type": "ImageObject",
      "url": "https://example.com/logo.png"
    }
  },
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://example.com/article-slug"
  }
}

SoftwareApplication

SaaS product with pricing tiers as OfferCatalog.

schema.org

When to use

Homepage of a SaaS product. applicationCategory + applicationSubCategory help Google's Knowledge Graph slot the product into the right competitive set.

Why this shape

Use AggregateOffer if you have multiple tiers - more compact than listing every Offer at the top level. operatingSystem 'Web' for browser apps.

software-application.json-ld
{
  "@context": "https://schema.org",
  "@type": "SoftwareApplication",
  "name": "Example SaaS",
  "applicationCategory": "BusinessApplication",
  "applicationSubCategory": "Compliance Monitoring",
  "operatingSystem": "Web",
  "url": "https://example.com",
  "offers": {
    "@type": "AggregateOffer",
    "lowPrice": "0",
    "highPrice": "499",
    "priceCurrency": "USD",
    "offerCount": 4
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": 4.8,
    "ratingCount": 142
  }
}

Service

Professional service with provider, area served, and offer catalog.

schema.org

When to use

Agency / consulting / managed-service offerings. Pair with Organization to anchor the provider.

Why this shape

areaServed accepts a country code or a Place. hasOfferCatalog gives Google a clean list of service tiers without committing to a price.

service.json-ld
{
  "@context": "https://schema.org",
  "@type": "Service",
  "name": "Example managed service",
  "serviceType": "Compliance monitoring",
  "provider": {
    "@id": "https://example.com/#organization"
  },
  "areaServed": "Worldwide",
  "hasOfferCatalog": {
    "@type": "OfferCatalog",
    "name": "Service tiers",
    "itemListElement": [
      {
        "@type": "Offer",
        "name": "Starter",
        "price": "39",
        "priceCurrency": "USD",
        "itemOffered": {
          "@type": "Service",
          "name": "Single-store monitoring"
        }
      }
    ]
  }
}

Course

Educational course with CourseInstance for delivery format.

schema.org

When to use

Knowledge-base hubs, learning paths, certification tracks. Course schema makes content eligible for Google's Learning surface.

Why this shape

hasCourseInstance carries delivery format. courseMode 'online'. Always include a free Offer if the course is free - omitting it can suppress the rich result.

course.json-ld
{
  "@context": "https://schema.org",
  "@type": "Course",
  "name": "Course title",
  "description": "What students will learn.",
  "provider": {
    "@type": "Organization",
    "name": "Example Inc."
  },
  "educationalLevel": "Beginner",
  "hasCourseInstance": {
    "@type": "CourseInstance",
    "courseMode": "online",
    "courseWorkload": "PT2H"
  },
  "offers": {
    "@type": "Offer",
    "price": "0",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "category": "Free"
  }
}

Dataset

Open data corpus with license, distribution, and creator.

schema.org

When to use

Primary research, public benchmarks, downloadable data tables. Indexed by Google Dataset Search separately from regular Search.

Why this shape

license must be a URL pointing to the actual license text. variableMeasured + temporalCoverage make the dataset citable. distribution adds machine-readable download URLs.

dataset.json-ld
{
  "@context": "https://schema.org",
  "@type": "Dataset",
  "name": "Dataset name",
  "description": "What the dataset measures and over what period.",
  "url": "https://example.com/dataset",
  "creator": {
    "@type": "Organization",
    "name": "Example Inc."
  },
  "license": "https://creativecommons.org/licenses/by/4.0/",
  "isAccessibleForFree": true,
  "temporalCoverage": "2020/2026",
  "variableMeasured": [
    "Variable A",
    "Variable B",
    "Variable C"
  ],
  "distribution": [
    {
      "@type": "DataDownload",
      "encodingFormat": "text/csv",
      "contentUrl": "https://example.com/dataset.csv"
    }
  ]
}

Report

Primary-research report with Dataset, methodology, FAQ.

schema.org

When to use

Annual State-of-X reports, industry benchmarks, white papers. Pair with a Dataset for the underlying numbers and a FAQPage for citation questions.

Why this shape

Report shares fields with Article but signals 'this is research, not editorial'. abstract carries methodology. Pair via @graph with Dataset + BreadcrumbList + FAQPage so the whole document graph stays connected.

report.json-ld
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Report",
      "@id": "https://example.com/report-2026#report",
      "name": "Report title",
      "headline": "Report title",
      "description": "What the report covers and concludes.",
      "datePublished": "2026-05-22",
      "author": {
        "@type": "Organization",
        "name": "Example Inc."
      },
      "publisher": {
        "@type": "Organization",
        "name": "Example Inc."
      },
      "abstract": "Methodology summary."
    },
    {
      "@type": "Dataset",
      "@id": "https://example.com/report-2026#dataset",
      "name": "Report - underlying dataset",
      "description": "The data behind the report.",
      "license": "https://creativecommons.org/licenses/by/4.0/",
      "isAccessibleForFree": true,
      "variableMeasured": [
        "Variable A",
        "Variable B"
      ]
    }
  ]
}

Want to know which schema your store is missing?

FeedShield's free audit checks every JSON-LD type Google expects on a Shopping-eligible store and flags the gaps. 250+ checks, no signup.

Run a free schema audit