ShipworkSite inspection
Rich results

Crawlability

PaginationAre paginated pages set up right?Internal searchIs site search eating crawl budget?URL parametersAre parameters creating duplicates?Log analyserWhat does Googlebot actually crawl?Robots builderNeed a robots.txt file?Soft 404sAre pages “not found” but returning 200?JavaScriptCan crawlers see it without running JS?FreshnessIs my site quietly going stale?Robots.txtDoes robots.txt say what I think?

Indexing

Sitemap lastmodAre my sitemap dates valid?SitemapIs my sitemap actually fetchable?IndexingIs Google allowed to index my pages?CanonicalsIs Google indexing the wrong URL?Index signalsDo sitemap and index signals agree?Sitemap generatorNeed a sitemap.xml for my site?Bulk URL statusWhere does each of these URLs really land?Redirect builderNeed the redirect rules?RedirectsAre my URLs answering directly, over HTTPS?

On-page

Keyword ideasWhat are people searching for?SERP previewHow does my page look in Google?Content qualityAre your pages too thin or too alike?Image weightAre images slowing the page?CannibalizationAre pages competing with each other?On-page checkDoes the page use its target phrase?ImagesAre my images accessible and loading?Meta tag builderWhat should my title and share tags say?DuplicatesDo my pages compete for one query?

Links

Orphan pagesWhich pages can no link reach?Link graphHow deep do your pages sit?Anchor textDo links say what they point at?Outbound linksAre external links still alive?Broken linksAre internal links sending visitors nowhere?

Structured data

Rich resultsIs my markup eligible for a rich result?Structured dataIs my product schema valid?Schema coverageDo my key pages carry structured data?Social previewHow does my page look when shared?Schema vs pageDoes markup match the page price?Schema builderNeed valid JSON-LD?

International

Hreflang sitemapDo page and sitemap hreflang agree?HreflangDo my language versions link back?Hreflang builderNeed the hreflang tags?Page DoctorWhy is this page not doing well?Redirect planMy site has dead links — what redirects do I write?Sitemap diffIs anything missing from my sitemap?Robots simulatorWhat does my robots.txt actually block?Can Googlebot?Can Googlebot fetch this URL?
Every error, explainedGuides
Pricing Learn Error guides Run free audit

+1 free check

Welcome to Shipwork

Sign in free and your next check this month is on us.

Continue with GoogleContinue with email

We email you a 6-digit code. No password.

No card needed. Reports and watches follow you to any device.

Is your markup eligible for a rich result?

Valid JSON-LD is not enough. Google requires specific fields per rich-result type: a Product needs an offer, an Article needs an image and a date. This checks each type against those requirements.

Reads the JSON-LD on the page and checks each type against Google's required fields. Nothing is stored.

Search Console

Not connected. Sign in and Connect Search Console to read Google's own verdict for this page. The check below still runs from public signals without it.

How this check works

Shipwork parses every JSON-LD block, finds each typed node, and checks it against the fields Google requires for that rich result: Product needs offers, Article needs headline, image and datePublished, FAQPage needs mainEntity, and so on. It reports which types are eligible and which are missing a required field.

What the rich results test checks

The test reads the JSON-LD blocks on one page and finds every node with a type. For each type it looks for the fields a search engine requires for that rich result: Product needs a name and offers, Article, BlogPosting and NewsArticle need a headline, an image and a date, FAQPage needs mainEntity, BreadcrumbList needs itemListElement, and so on through the types it supports.

When a required field is missing, the test checks whether your page already states it elsewhere, such as the title, the canonical URL, the Open Graph image or the published date, and names that value as a suggestion. It never invents a value: a missing price, address or rating stays manual work. It does not send the page to any external service.

How to read an eligibility result

An eligible type means the node carries every field the test knows is required, so it meets the markup bar for that rich result. That is the limit of the claim: eligibility is not the same as being shown. A search engine still decides per query and per site whether to display a rich result.

A finding names the type, the missing fields and, where it can, the value on your page that could fill them. A JSON-LD block that is not valid JSON is reported as an error and ignored entirely, because nothing inside it can be read. The test reads one page's markup, so a clean result there says nothing about the rest of the site.

Common causes and why they matter for search

Themes and plugins emit different schemas, and product markup that omits offers is valid JSON-LD yet ineligible. Articles often miss an image or a published date. Nesting can hide a type, and a node placed outside the main graph may not be found. These are markup gaps rather than content gaps.

Missing required fields keep a page out of eligible rich results, which can reduce how prominently it appears and how many clicks it earns. Well-formed markup alone is not enough. Because the test reads the page's own facts, it can point you to a value you already publish rather than asking you to invent new data.

How to fix ineligible markup

Add the missing fields to the JSON-LD for that type. Use real values from the page and keep them consistent with the visible content: the same price, the same product name, the same dates. For a Product, include an offers object with a price and currency; for an Article, include an image and a date.

On Shopify, the theme and apps can both emit markup, so look for duplicate or conflicting blocks before editing. In WooCommerce, the SEO plugin usually owns the product schema. After changing a template or plugin, rerun the test on a product page and on an article page. Do not add fields you cannot support with visible content.

When to use related markup checks

Use the structured data check when the question is whether your JSON-LD is well formed, and schema coverage to see which page types carry markup at all. This check is narrower: required fields for rich-result eligibility.

For the product case, read product schema, explained and the schema generator when you need to build a block. For returns and shipping fields on a store, see returns and shipping markup.

Questions

How is this different from the structured-data check?
The structured-data check asks whether the JSON-LD is well formed. This asks the narrower Google question: does each type carry the fields required to be eligible for a rich result. A Product with no offers is valid JSON-LD and still ineligible.
Which types does it check?
Product, ProductGroup, Article, BlogPosting, NewsArticle, BreadcrumbList, FAQPage, Event, Recipe, HowTo, VideoObject, JobPosting, Course, LocalBusiness, Organization, SoftwareApplication, WebSite, Review and AggregateRating.
Does eligibility guarantee a rich result?
No. It means the markup meets the required fields; Google still decides whether to show the result based on the query and the site.
How do I test rich results for my page?
The test parses the JSON-LD on one page, finds each typed node and checks it against the required fields for that type. It lists the eligible types and, for ineligible ones, the missing fields. It reads your page's markup directly and does not send it to an external service.
Does passing mean I will get a rich result?
No. Eligibility means the markup carries the required fields. Whether a rich result is shown still depends on the query, the site and the search engine's judgement. Treat a pass as clearing the markup bar, not as a guarantee of display.
Which schema types are supported?
Product, ProductGroup, Article, BlogPosting, NewsArticle, BreadcrumbList, FAQPage, Event, Recipe, HowTo, VideoObject, JobPosting, Course, LocalBusiness, Organization, SoftwareApplication, WebSite, Review and AggregateRating. A type outside this list is not judged for eligibility.
Why is a Product with no offers not eligible?
The Product rich result requires an offers field. Markup without it is still valid JSON-LD, which is why the structured data check can pass it, but it does not meet the required fields for eligibility. Add an offers object with a price and currency.
Does the test use my live page or a Google tool?
It reads the public HTML of the URL you submit and checks the JSON-LD in it against the required fields. It does not call a separate search engine tool and does not store the page. Results reflect the markup the page returns at that moment.

Keep reading

What this reads

  • Checks the page's JSON-LD against Google's required fields for each rich-result type.
  • Names the fields already present, so you know what is missing.
  • Reads the raw markup, the same block a search engine parses.
83checks
0signups needed
0stored on free checks
Cool, just ran an audit and got some insights! Let’s see if I can fix them :)
Tenta Dev, @DevTenta
Whoah! this site is crazy, nothing to roast at all
Ainreek, @AinreekAI
cool as heck, tried it on my blog and the insights it gave are helpful and not bluff.
Refaat 🍉 (Mouse), @1Mouse__