All 30 checks No JSON-LD structured data

No JSON-LD structured data

Updated

A page with no <script type="application/ld+json"> block leaves search engines to infer, from layout and prose alone, what kind of thing the page describes and who is behind it.

Fails: HTML <head> without structured data
<head>
  <title>Example Bakery | Portland Bakery and Cafe</title>
  <link rel="canonical" href="https://example.com/">
</head>
Fix: JSON-LD block to add
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Example Bakery",
  "url": "https://example.com/",
  "logo": "https://example.com/logo.png"
}
</script>

What JSON-LD is and who reads it

JSON-LD is a block of JSON inside a script tag that describes the page using the Schema.org vocabulary: this is an Organization with this name and logo, this is a Product with this price, this is an Article published on this date, this is the breadcrumb trail to get here. Browsers do not render it and visitors never see it.

Search engines read it to connect the page to real-world entities and to decide whether the page is eligible for rich results, such as breadcrumb trails, product prices, or event dates shown in the listing. Eligibility is all it provides. Google decides case by case whether to show any enhancement, and markup does not move a page's position.

Who gains from it

Local businesses benefit from stating their name, address, phone number, and opening hours in a form machines can parse without guessing. Shops, recipe sites, event listings, and publishers have specific types whose properties map directly onto the rich result formats Google Search supports.

For an agency, adding an Organization or LocalBusiness block to every client site is a small, repeatable task. It also gives you one place to keep the business details consistent, rather than relying on a crawler to piece them together from a footer.

How Skewcheck checks it

Skewcheck searches the page for a <script> element with type="application/ld+json". If there is none, the check warns with low severity and deducts 3 points from the audit score. One block of any type is enough to pass. The check is about presence, so validating the contents is a separate step covered below.

What to add first, and how in Next.js

Start with the type that describes the business on the home page, Organization or a more specific LocalBusiness subtype such as Bakery, Dentist, or LegalService. Then add types that match each template: Article for blog posts, Product for product pages, BreadcrumbList wherever there is a breadcrumb trail on screen.

In Next.js, render the script from a server component. Serialize with JSON.stringify and replace the < character with its Unicode escape, so a value containing a closing script tag cannot break out of the block. Plain HTML sites can paste the block anywhere in the head or body.

app/page.tsx
export default function HomePage() {
  const jsonLd = {
    "@context": "https://schema.org",
    "@type": "Organization",
    name: "Example Bakery",
    url: "https://example.com/",
    logo: "https://example.com/logo.png",
  };

  return (
    <>
      <script
        type="application/ld+json"
        dangerouslySetInnerHTML={{
          __html: JSON.stringify(jsonLd).replace(/</g, "\\u003c"),
        }}
      />
      {/* page content */}
    </>
  );
}

Validation and common mistakes

Run every template through Google's Rich Results Test, which reports parse errors and missing required properties for the rich result types Google supports, and through the Schema.org validator for general syntax. One broken comma makes the whole block unreadable, and CMS editors that convert straight quotes into curly ones are a frequent cause.

The markup must describe what is visible on the page. Ratings, reviews, prices, or FAQ answers that appear only in JSON-LD break Google's structured data guidelines and can lead to a manual action that removes rich results from the whole site. Other mistakes to watch for: relative URLs for logo and image, dates that are not ISO 8601, two plugins each emitting a conflicting Organization block, and markup injected only through a client-side tag manager, which crawlers that skip JavaScript never see.

Before and after

Before
<head>
  <title>Example Bakery | Portland Bakery and Cafe</title>
</head>
After
<head>
  <title>Example Bakery | Portland Bakery and Cafe</title>
  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "Bakery",
    "name": "Example Bakery",
    "url": "https://example.com/",
    "logo": "https://example.com/logo.png",
    "telephone": "+1-503-555-0142",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "120 Main Street",
      "addressLocality": "Portland",
      "addressRegion": "OR",
      "postalCode": "97204",
      "addressCountry": "US"
    }
  }
  </script>
</head>

Check your page

Run all 30 checks on any URL. Free, no account.