The Complete Guide to Schema Markup

Why schema markup deserves its own discipline

Ask ten people what schema markup does and you'll get some version of "it gets you stars under your search result." That answer isn't wrong, exactly. It's just years out of date, and it's the reason so many sites either ignore structured data entirely or install it once, badly, and never touch it again. Schema markup was never really about star ratings. It's a machine-readable layer that sits underneath your visible page and tells search engines — and increasingly, AI systems that read the web on a user's behalf — exactly what kind of thing they're looking at: a product with a price, an article with an author, a local business with hours, an event with a date and a venue. The visible page is written for humans. Schema markup is the same information, written for machines that can't infer context the way a person can.

That distinction matters more today than it did five years ago, and for a very specific reason: the value of structured data has quietly shifted away from decorative search features and toward comprehension. Google has spent the last three years pulling rich result treatments out of the SERP one at a time — HowTo results disappeared from desktop back in 2023, and as of May 2026 FAQ rich results stopped appearing entirely, with Search Console reporting and the Rich Results Test following in June and API support in August. Several smaller schema types have been retired the same way. If you built your entire structured data strategy around chasing those specific visual treatments, a good chunk of that strategy just evaporated. But if you understood schema markup as an entity and comprehension layer all along, almost nothing changed for you — because the underlying vocabulary is still valid, still crawlable, and arguably more useful now that AI answer engines are reading and citing pages at a scale traditional search never operated at.

This is also why schema markup has a strange reputation problem. Beginners treat it as a checkbox: paste in a generator's output, confirm a green tick in a validator, move on. Experts sometimes fall into the opposite trap — treating every retired rich result as proof that structured data doesn't matter anymore, and deprioritizing it just as machine-read content is becoming more important, not less. Neither position holds up once you actually understand what schema markup does, what it doesn't do, and where the real leverage is in 2026.

This guide is built to close that gap for both audiences. If you're new to structured data, you'll come away understanding exactly what schema markup is, how search engines actually process it, and how to implement it without breaking anything. If you've been shipping JSON-LD for years, you'll find the deeper mechanics most surface-level guides skip entirely — the difference between syntactic validity and rich result eligibility, why two pages with "identical" schema can behave completely differently in Search Console, and the specific techniques that separate a markup implementation that actually earns its keep from one that's just sitting there unused.

📊 A quick reality check Adding valid schema markup to a page does not guarantee a rich result, does not directly boost rankings, and is not required for AI Overviews or AI Mode to cite a page. What it does is remove ambiguity — it gives machines a structured, unambiguous description of your content instead of forcing them to infer it from prose. That comprehension advantage is real, even on pages where no visual rich result ever appears.

How structured data actually works (and where it quietly breaks)

Before you can compress, expand, or fix schema markup, you need an accurate mental model of what actually happens between you publishing a page and Google — or any other system — deciding what to do with the structured data on it. Most confusion about "why isn't my schema working" traces back to a gap somewhere in this pipeline, and most guides never walk through it in enough detail to make the gap visible.

1. JSON-LD, Microdata, and RDFa are not the same decision

Schema.org is a shared vocabulary — a dictionary of types like Product, Article, and LocalBusiness, and properties like price, author, and openingHours. That vocabulary can be written into a page using three different syntaxes. Microdata and RDFa embed properties directly inside your visible HTML elements, using attributes like itemprop and property. JSON-LD, by contrast, is a single self-contained script block, usually dropped in the <head>, that describes the page's entities independently of the HTML around it. Google has recommended JSON-LD as the preferred format for years, for a simple practical reason: it doesn't require you to touch your visible markup at all, which means front-end redesigns, CMS template changes, and copywriting edits can't accidentally corrupt your structured data the way they routinely do with inline Microdata. Unless you have a very specific legacy constraint, JSON-LD is the right default in 2026.

2. There are two separate gates, not one

This is the single most misunderstood part of structured data. Passing validation is not the same thing as being eligible for a rich result, and conflating the two causes endless confusion. Gate one is syntactic and vocabulary validity — is the JSON well-formed, does the type exist on schema.org, are the properties spelled correctly. A generic schema validator checks this gate, and it's necessary but nowhere near sufficient. Gate two is Google's own eligibility layer, which is stricter and type-specific: Google publishes a separate list of required and recommended properties for each rich result type, and on top of that, applies content and spam policies that no automated tool can fully check — your markup has to accurately represent visible, current, original content, and can't describe anything hidden, fabricated, or irrelevant to the page. A page can sail through a generic validator with a perfect score and still be completely ineligible for any rich result, because it failed gate two. Understanding that these are separate systems, checked by separate tools, is the foundation everything else in this guide builds on.

3. The entity graph matters even when no rich result ever appears

Structured data doesn't only exist to earn visual SERP treatments. Every @id you define and every sameAs link you add to an authoritative external profile — a verified social account, a Wikipedia or Wikidata entry, a Crunchbase page — helps a search engine disambiguate which specific real-world entity your page is actually about. This is how Organization and Person schema feed into Knowledge Panels, and it's also, increasingly, how AI systems resolve which "Acme" or which "John Smith" a page is referring to when there are thousands of candidates. This benefit is invisible in the SERP — there's no badge for "Google understands who you are now" — but it compounds quietly across every page that reinforces the same entity, which is exactly why the experts section later in this guide treats a canonical entity definition as infrastructure, not decoration.

4. Rich results are a discretionary feature, not a reward for correctness

Google is explicit that even flawless, fully compliant structured data is never guaranteed to produce a rich result. Eligibility is necessary but not sufficient — Google's systems still make an algorithmic decision about whether displaying that enhancement serves a given search result, based on quality signals well beyond your markup. This is precisely why two competitor pages can ship near-identical Product schema and only one of them shows star ratings in the SERP. Treating structured data as a lever you pull to directly cause a specific visual outcome sets you up for confusion the moment reality doesn't cooperate. Treating it as raising your eligibility and improving machine comprehension — with the visual outcome as a possible but never-promised bonus — matches how the system actually behaves.

5. Structured data for AI systems plays by the same rule, stricter

There's no special schema type or dedicated vocabulary required to be cited in AI Overviews, AI Mode, or third-party AI answer engines — general guidance on this point has been consistent. What does carry over directly from classic search is the requirement that any structured data you do use has to match what's actually visible on the page, because AI systems retrieving and summarizing your content are exactly as intolerant of hidden or fabricated markup as traditional rich result eligibility is, arguably more so, since a mismatch there risks the content being misrepresented in a generated summary rather than just failing to earn a rich result. The practical implication is that clean, accurate, answer-first content paired with markup that faithfully mirrors it does double duty: it's the same asset serving classic search eligibility and machine-read AI retrieval at once, which is a better way to think about the relationship than treating AI visibility as a separate schema strategy that needs its own tags.

6. Google actively retires rich result types — the vocabulary usually survives

Google periodically decides a given rich result treatment isn't earning its place in an increasingly crowded results page and pulls it, even when the underlying schema.org type remains perfectly valid. HowTo lost its rich result on desktop in 2023. FAQ rich results followed in May 2026, with the supporting Search Console report, Rich Results Test support, and API access being wound down through the following months. A handful of smaller, less widely used types — things like ClaimReview, SpecialAnnouncement, and Estimated Salary — have quietly gone the same route in the years since, generally because Google's own data showed narrow adoption relative to the display real estate they consumed. In every one of these cases, Google has been consistent about one thing: the markup itself isn't deprecated, doesn't need to be ripped out, and doesn't cause any problem by remaining on the page — only the specific search-result display feature attached to it goes away. It's a distinction worth holding onto, because it's the difference between "stop using this vocabulary" and "stop expecting this particular visual outcome from it," and the two get conflated constantly in SEO commentary.

7. Required properties, recommended properties, and why "more" can also be worse

Every rich result type Google documents comes with its own list of required properties — the ones you must include for eligibility — and recommended properties, which improve the odds and richness of a result without being strictly mandatory. Beginners tend to under-fill these, missing a required field and never understanding why a page never shows a rich result despite passing a generic validator. Experienced implementers tend to overcorrect the other way, stuffing in every optional property a type supports whether or not the data is genuinely available and accurate. That second habit causes its own problems: a property populated with a placeholder, an estimated value, or something copied from a similar page because the real data wasn't on hand is exactly the kind of inaccurate markup Google's content policies flag. The right target isn't "as many properties as possible." It's every required property, plus every recommended property you can fill with data that's actually true and actually visible on the page — and nothing beyond that.

8. The three testing tools actually check different things

Most teams reach for exactly one testing tool and assume a pass means the job is done, which is how gate-two failures slip through unnoticed. The Schema.org validator (or any generic JSON-LD linter) only confirms your markup is syntactically valid and uses real schema.org types and properties — it has no idea what Google specifically requires for a rich result. Google's Rich Results Test checks against Google's own required and recommended property lists for supported types and will tell you exactly which rich result, if any, a given URL or code snippet is eligible for — but it still can't evaluate the content-policy layer, like whether a review is fabricated or a price is stale. The URL Inspection tool in Search Console goes one step further by showing you what Googlebot actually retrieved and rendered for a live URL, which is the only reliable way to catch cases where structured data is correct in your source code but never makes it into the version Google actually crawls, because of a rendering timing issue, a conditional that skips the script tag, or a caching layer serving stale HTML. Treat all three as complementary checks in a pipeline, not interchangeable options where any one will do.

🔍 Why this guide doesn't ship its own FAQPage schema You'll notice this article doesn't add invisible FAQPage JSON-LD to itself. That's deliberate, not an oversight. FAQ rich results no longer appear in Google Search as of May 2026, and adding schema for content that isn't presented as visible, structured Q&A on the page would violate the exact "markup must match visible content" principle this guide spends a whole section on. If we later add a genuine, visible FAQ section to this page, matching FAQPage markup would belong right next to it — not floating invisibly in the <head> on its own.
Skip the hand-written JSON-LD Pick a schema type, fill in the fields, and get clean, nested JSON-LD ready to paste into your page.
Open Schema Generator →

Common mistakes that quietly wreck your schema markup

Broken structured data almost never throws a visible error to the person browsing your site. It fails quietly, in a Search Console report you might not check for weeks, or in an algorithmic eligibility decision you'll never get a direct explanation for. These are the mistakes behind the vast majority of those silent failures.

Mistake #1: Still chasing FAQ or HowTo rich results as a 2026 strategy

If your structured data roadmap still has "add FAQ schema for the accordion snippet" as a line item, that line item no longer does what it used to. FAQ rich results have stopped appearing in Google Search entirely, and HowTo lost its rich result years earlier. Neither type is broken to use — FAQPage and HowTo remain valid schema.org vocabulary, and leaving existing markup in place causes no harm — but building new strategy around either one for the SERP appearance alone is effort spent chasing a feature that no longer exists.

Mistake #2: Marking up content that isn't actually visible on the page

This is the single most consequential structured data mistake, because it's the one most likely to trigger a manual action rather than a quiet non-appearance. If your JSON-LD describes a price, an author, or a review that a visitor can't actually find anywhere on the rendered page, that's a direct violation of Google's structured data content policies, not a technical error a validator will catch. This happens more often than it should through carelessness — a product schema left in place after a price was removed from the page, or an author block auto-generated for content the CMS never actually displays.

Mistake #3: Letting one page describe multiple, conflicting entities

Google has specifically flagged this as a common source of confusion: a page whose review or rating markup points to more than one distinct "thing," creating an ambiguous graph where it's unclear what's actually being reviewed. This tends to creep in through automated markup generation, where a template accidentally nests a product review inside an organization block, or duplicates a rating across two different entities on the same page. The fix is almost always structural — audit exactly how many separate entities your JSON-LD graph defines on a given page, and make sure every review or rating has exactly one unambiguous target.

Mistake #4: Marking up a curated subset of your reviews

If a page displays reviews, every review a visitor can see has to be represented in the structured data — not just the flattering ones. Quietly filtering out negative reviews from your AggregateRating or Review markup while leaving them visible on the page is treated as a quality violation, not a growth hack, and it's an easy one for Google to catch by comparing the visible count against the marked-up count.

Mistake #5: Defaulting to the generic type instead of the specific one

Schema.org is built as a hierarchy for a reason. NewsArticle is more specific than Article. Restaurant is more specific than LocalBusiness. Using the broader parent type when a more specific child type exists and fits isn't wrong exactly, but it under-describes your content and can quietly narrow which rich result types and search features you're even eligible for. When in doubt, walk the schema.org type hierarchy one level deeper before you commit to a type.

Mistake #6: Assuming schema.org validity means Google eligibility

As covered in the previous section, these are two different gates. A block of JSON-LD can be perfectly valid schema.org markup — correct types, correct property names, clean syntax — and still be missing the specific required properties Google's documentation lists for that rich result type. Always check both a general validator and Google's own Rich Results Test; they will not always agree, and when they don't, the Rich Results Test is the one that determines actual SERP eligibility.

Mistake #7: Letting price, availability, and date data go stale

Structured data describing something time-sensitive — a product's price and stock status, an event's date, a job posting's application deadline — has to stay current. Google won't surface a rich result for outdated time-sensitive content, and stale data left in place long enough starts to look, to an automated system, indistinguishable from neglect or manipulation. If a piece of marked-up data can change, it needs an owner and a process for keeping it in sync with the page, not a one-time export from whenever the schema was first added.

Mistake #8: Copy-pasting boilerplate schema across every page and every site

Reusable templates are good. Identical, unmodified schema blocks copied wholesale across pages that describe genuinely different things are not. This shows up constantly as placeholder logo URLs that were never swapped in, sameAs links pointing to the wrong social profile, or an Organization block duplicated site-wide with a slightly different name each time depending on which developer last touched the template. None of it throws an error. All of it quietly degrades how confidently a search engine can trust the entity data you're providing.

Mistake #9: Never checking the Search Console structured data reports

Templates change. CMS updates change. A developer refactors a component and doesn't realize it renders inside a conditional that sometimes skips the JSON-LD block entirely. None of this shows up unless you're actually looking at the Enhancements reports and the Unparsable Structured Data report in Search Console on a recurring basis, not just immediately after the schema was first implemented. Structured data that worked at launch and silently breaks eight months later is one of the most common and most avoidable failure modes in this entire discipline.

Mistake #10: Treating structured data as a ranking factor

Schema markup affects eligibility for enhanced search appearances and machine comprehension of your content. It is not a direct ranking signal, and treating it as one — stuffing extra properties in hoping for a rankings bump, or panicking about "losing SEO value" when a rich result type gets retired — misreads what the tool is actually for. The realistic payoff is a clearer signal to machines and, sometimes, a more prominent SERP appearance that can lift click-through rate. Neither of those is the same claim as "higher rankings," and conflating them leads to disappointment and misdirected effort.

Mistake #11: Testing the source code instead of the rendered DOM

Structured data injected client-side by JavaScript can look perfect in a browser's "view source" and still never reach Googlebot, if the render pipeline that inserts it doesn't complete before the crawler's rendering budget runs out, or if it depends on a client-side API call that Googlebot's environment handles differently than a real browser. Testing a code snippet in isolation, or checking raw HTML instead of the actually-rendered DOM, creates a false sense of confidence. The URL Inspection tool's rendered HTML view exists specifically to catch this gap, and it's worth checking on any page where schema is generated by client-side JavaScript rather than delivered in the initial server response.

Mistake #12: Letting hreflang variants describe the same entity inconsistently

On multi-region or multi-language sites, it's common for each locale's page to be built from a separate template or content record, which means each hreflang variant can end up with its own slightly different Organization block, its own inconsistent price formatting, or its own @id that doesn't match its sibling pages. That turns what should be one entity, described consistently across languages, into several loosely related ones in the eyes of a crawler. When you audit hreflang implementation, audit the structured data on each variant alongside it — they should describe the same underlying entities, not just translated copy.

⚠️ The pattern underneath all twelve mistakes Nearly every mistake on this list comes down to the same root cause: markup that has drifted out of sync with what a visitor actually sees, or with what Google's specific eligibility requirements actually ask for. The fix isn't a smarter one-time implementation. It's treating structured data as something that needs to be revisited every time the page it describes changes — not written once and forgotten.

Expert-level tricks that actually move the needle

This is where the real leverage lives. These aren't beginner concepts — they're the specific structural and process decisions that separate a schema implementation that quietly earns its keep from one that's technically present but doing almost nothing.

1. Build one canonical entity, then reference it everywhere by @id

Instead of repeating a full Organization or Person definition on every page, define it once with a stable @id, complete with a verified sameAs list, and reference that @id from every other schema block that needs to point back to it — articles, products, reviews, local business pages. This is the actual backbone of entity SEO: one consistent, well-connected definition beats a hundred slightly different copies of the same organization scattered across your codebase.

2. Use @graph to connect entities within a single page instead of scattering scripts

A page describing an article, its author, its publisher, and its position in your site hierarchy doesn't need four disconnected <script> blocks. Wrapping related entities in a single @graph array, connected through shared @id references, produces a coherent structured description of the whole page instead of four isolated fragments — and it's dramatically easier to validate and maintain as one unit.

{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Article",
      "@id": "https://example.com/post#article",
      "headline": "Example headline",
      "author": { "@id": "https://example.com/#organization" },
      "publisher": { "@id": "https://example.com/#organization" }
    },
    {
      "@type": "Organization",
      "@id": "https://example.com/#organization",
      "name": "Example Co",
      "logo": "https://example.com/logo.png",
      "sameAs": [
        "https://www.linkedin.com/company/example",
        "https://www.wikidata.org/wiki/Q000000"
      ]
    }
  ]
}

3. Automate BreadcrumbList generation from your URL structure

Breadcrumb schema is low-risk, cheap to implement, and consistently useful for how search engines understand site hierarchy — and it's one of the easiest types to generate automatically, since it can be derived directly from your existing URL path or navigation structure rather than hand-written per page. Wire it into your template layer once and it stays correct by construction, without anyone needing to remember to update it.

4. Treat schema generation as generated code, not hand-authored content

The most durable structured data implementations are produced programmatically from the same data source that renders the visible page — the same product record, the same CMS fields, the same author object — rather than typed separately by a content editor. When markup and visible content are generated from one shared source of truth, they can't drift apart the way hand-maintained duplicates inevitably do over months of edits.

5. Validate at both layers, every time, not just at launch

Run new or changed schema through a general schema.org validator to catch syntax and vocabulary problems, and separately through Google's Rich Results Test to check type-specific eligibility requirements. They check different things, they will sometimes disagree, and relying on only one leaves a real gap. Make both checks part of your regular publishing or deployment process, not a one-off audit you ran once during implementation.

6. Prioritize the types still worth active investment in 2026

Not all schema effort is equally rewarded anymore. Product, Offer, and AggregateRating for ecommerce; Organization and Person with strong sameAs connections for entity and brand SEO; BreadcrumbList for site structure; Article or NewsArticle for publishers; the correct LocalBusiness subtype for local search; VideoObject, JobPosting, and Event where genuinely applicable — these still carry real, active display and comprehension value. FAQPage and HowTo can stay in place if they accurately describe visible content, but neither should be the centerpiece of a 2026 structured data roadmap.

7. Write the visible content and the markup as one answer-first unit

Because AI answer engines reward exactly the same clarity and visible-content match that classic rich result eligibility does, structuring a page's actual prose — clear, direct, self-contained answers near the top of a section — and mirroring that structure in your markup serves both audiences at once. This is a content decision as much as a technical one, and it's a more reliable AI-visibility lever than any specific schema type on its own.

8. Keep canonical, hreflang, and schema consistent as one signal set

On sites with duplicate or multi-region content, canonical tags, hreflang annotations, and structured data are often fixed in isolation by different people at different times — and the inconsistencies between them are a common, underrated source of indexing confusion. A product page whose canonical points to one URL, whose hreflang set lists a different regional variant, and whose schema references a third @id entirely is sending three slightly different signals about the same content. Audit all three together, not as separate technical SEO tasks.

9. Maintain a simple entity-and-schema map

A basic internal record — which @id values exist, which schema types they appear in, and which templates or pages reference them — pays for itself the first time a business name, logo, or policy changes and you need to know exactly every place that has to be updated in sync. Without it, updates happen wherever someone remembers to make them, which is exactly how the boilerplate-drift problem from the mistakes section above starts.

10. Monitor Search Console structured data reports on a schedule

Set a recurring check — monthly is reasonable for most sites, weekly for large or frequently redesigned ones — of the Enhancements reports and the Unparsable Structured Data report, rather than only looking after something visibly breaks. Catching a template regression within weeks instead of months is the difference between a quick fix and months of silently degraded eligibility you didn't know you had.

11. Validate structured data changes in staging, not after deploy

Because Google eligibility failures are silent, the cheapest place to catch a broken template is before it ships, not weeks later in a Search Console report. Running the Rich Results Test against a staging URL — or against a raw code snippet pulled straight from a pull request — as a normal part of code review catches template regressions at the exact moment they're introduced, when they're a one-line fix instead of an investigation into which release quietly broke eligibility for an entire section of the site.

12. Use your schema graph as internal entity infrastructure, not just SERP bait

Once you have a canonical @id for a person, organization, or product, that same identifier is useful well beyond structured data — it becomes a stable reference point you can align internal linking, author bylines, and content clusters around. Treating your schema graph as a lightweight internal knowledge base, rather than purely an output aimed at Google, tends to produce more consistent entity data everywhere else on the site too, because there's one definition worth linking back to instead of several competing ones.

Schema typeSERP rich result todayStill worth implementing
Product / Offer / AggregateRatingYesYes — high priority
Organization / Person + sameAsIndirect (Knowledge Panel)Yes — foundational
BreadcrumbListYesYes — low effort, low risk
Article / NewsArticleYes (varies by surface)Yes
LocalBusiness subtypeYesYes
FAQPageNo (retired May 2026)Only if content is genuinely Q&A
HowToNo (retired 2023)Optional, low priority

13. Keep a known-good minimal example on hand, per type

A lot of debugging time gets wasted staring at a broken 200-line JSON-LD block trying to spot the one wrong bracket. It's faster to keep a minimal, verified-working example for each type you use regularly, and diff a broken implementation against it rather than reading it top to bottom every time. A minimal but complete Product block that satisfies Google's required properties looks roughly like this — every field present, none of it decorative:

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Trail-ready 20L backpack",
  "image": "https://example.com/images/backpack-20l.jpg",
  "sku": "BP-20L-BLK",
  "brand": { "@type": "Brand", "name": "Example Gear Co" },
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/products/backpack-20l",
    "priceCurrency": "USD",
    "price": "89.00",
    "availability": "https://schema.org/InStock",
    "priceValidUntil": "2026-12-31"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.6",
    "reviewCount": "212"
  }
}

Notice everything here is required or high-value: identity fields (name, image, sku), a properly nested Brand, a complete Offer with currency, price, availability, and a validity date, and an AggregateRating whose reviewCount matches what's actually visible on the page. Nothing is padded in for the sake of looking thorough — which is exactly the discipline worth applying to every type you implement.

Building an @graph by hand is tedious Generate nested, spec-correct JSON-LD — including @graph structures — without tracking every bracket yourself.
Open JSON-LD Generator →

Putting it all together

Schema markup rewards precision and consistency far more than it rewards volume. Wrapping every possible type around every possible page isn't the goal, and it never really was — the goal is an accurate, current, well-connected description of what's actually on the page, expressed in a vocabulary machines can parse without guessing. That's true whether you're marking up a single local business page by hand or generating structured data programmatically across a catalog of fifty thousand products.

If you take one idea away from this guide, let it be the distinction between the two gates: syntactic validity and algorithmic eligibility are different systems, checked by different tools, and passing one says nothing about the other. The second habit worth keeping is treating structured data as something that ages — every price, every review count, every organization detail needs an owner and a process for staying in sync with the page it describes, not a one-time export from the day it was implemented.

The rich result landscape will keep shifting. Google has shown a clear, repeated pattern of retiring specific visual treatments once they stop adding enough value to justify the space they take up in the results page, and there's no reason to expect that pattern to stop. What doesn't shift nearly as fast is the underlying need for machines — search engines, AI answer engines, and whatever comes after them — to understand your content unambiguously. Build your structured data around that need, not around whichever specific badge happens to be fashionable this year, and the effort keeps paying off long after any one rich result type comes and goes.

✅ Quick recap Use JSON-LD as your default syntax → define one canonical entity per organization or person and reference it everywhere by @id → match every property to something genuinely visible on the page → validate against both a general validator and Google's Rich Results Test → prioritize the types with active 2026 value over the ones losing SERP treatment → recheck Search Console on a schedule, not just at launch.

Generate schema markup the right way

Rebrixe's Schema Generator builds clean, spec-correct structured data for any page type — no hand-written JSON-LD, no guessing at required properties.

Launch the Schema Generator
← Back to SEO Tools