Skip to main content
Guides

Schema Markup: Structured Data Without Spam

Schema Markup: Structured Data Without Spam

A valid JSON-LD block can pass the Rich Results Test and still produce no rich result. That is not a testing failure. Structured data describes content in a machine-readable form; it does not replace the content, guarantee a search feature, or act as a ranking switch.

The common mistake is to begin with “which schema type should this site add?” A better starting question is: what entity does this page primarily describe, which facts can visitors actually see, and which presentation does Google currently support for that content?

Structured data, Schema.org, and schema markup

Structured data is information organized in a machine-readable format. Schema.org provides a vocabulary of entity types and properties. Schema markup is the implementation of that vocabulary on a page using JSON-LD, Microdata, or RDFa.

Google Search supports all three formats for many features and commonly recommends JSON-LD because it is separate from presentation HTML and easier to maintain. Format cannot rescue inaccurate data. A perfectly formed JSON-LD Product that declares a price absent from the page still violates consistency expectations.

Does schema improve rankings?

Schema should not be sold as a direct ranking factor. Structured data can help systems understand a page and make it eligible for certain rich results. A more prominent presentation can influence click-through rate in some situations, but Google does not guarantee display even when markup is correct.

Outcomes also depend on:

  • Whether the page can be crawled and indexed.
  • Whether content meets Search policies and feature-specific policies.
  • Whether data is accurate, complete, current, and visible.
  • Query, device, location, and Google's presentation choice.
  • Whether the feature remains supported in current documentation.

Rich-result availability changes. Check the official Search Gallery rather than relying on an old article or a plugin's type list.

Choose a type from the page's main content

Do not mark every page with every type that appears remotely related. Identify the main entity:

  • An editorial article: Article, BlogPosting, or a suitable subtype.
  • A purchasable product page: Product with real offer, price, and availability.
  • A physical business location: LocalBusiness or an accurate subtype.
  • A recipe: Recipe.
  • A page centered on a video: VideoObject.
  • An organization profile: Organization.
  • A hierarchical path: BreadcrumbList.

A category listing products is not automatically one Product. A laptop buying guide should not identify itself as a product merely because it discusses several models. The type must represent what the page actually provides.

Start with source data, not a JSON string

Maintainable schema is generated from the same sources that render the visible page:

Visible information Appropriate source
Product name Product record
Current price Pricing service
Availability Inventory service
Article author Author profile
Modified date Publication history
Breadcrumbs Taxonomy structure
Ratings Verified review system

If a template displays a database price while JSON-LD stores a hand-entered number in the CMS, they will diverge during the first promotion. Structured data should be another representation of the same truth rather than a second content repository.

A minimal BlogPosting example

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "@id": "https://example.com/blog/image-seo#article",
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://example.com/blog/image-seo"
  },
  "headline": "Image SEO and alt text",
  "image": [
    "https://example.com/images/image-seo-1200x630.png"
  ],
  "datePublished": "2026-06-10T08:00:00+07:00",
  "dateModified": "2026-06-15T09:30:00+07:00",
  "author": {
    "@type": "Person",
    "@id": "https://example.com/authors/alex#person",
    "name": "Alex Nguyen",
    "url": "https://example.com/authors/alex"
  },
  "publisher": {
    "@type": "Organization",
    "@id": "https://example.com/#organization",
    "name": "Example",
    "url": "https://example.com/"
  }
}
</script>

This illustrates structure only. During implementation, verify required and recommended properties in the current Article documentation. Never copy sample dates, URLs, or authors into production.

@id connects stable entities

An @id does not have to be a separate page a visitor opens. It is a stable identifier in the graph, commonly an absolute URL with a fragment:

  • https://example.com/#organization
  • https://example.com/#website
  • https://example.com/authors/alex#person
  • https://example.com/products/a#product

When an article's publisher and the site-wide Organization reference the same @id, systems can treat them as one entity instead of unrelated objects with matching names.

Identifiers must remain stable across renders. Do not generate a random UUID on every request. Do not use one @id for different entities such as the organization and its website.

Multiple items on one page

A page can contain several valid structured-data items:

  • WebPage describes the page.
  • BlogPosting describes the article.
  • BreadcrumbList describes its path.
  • Organization or Person is referenced as publisher or author.
  • VideoObject describes a primary embedded video.

Objects may be separate or connected in @graph. Accurate relationships and lack of contradictions matter more than layout. When a video is merely an unrelated advertisement, adding VideoObject to pursue a video feature misrepresents the page.

There is no need to repeat a large Organization object inside every node. Define one canonical entity and reference its @id to keep the graph clear.

Feature documentation separates required from recommended properties. Missing required data makes an item ineligible. Recommended fields can improve completeness, but only when genuine data exists.

A sound principle is fewer, accurate, complete properties. Do not add:

  • aggregateRating without real ratings.
  • A fabricated priceValidUntil to eliminate a warning.
  • “Admin” as author when no profile or editorial responsibility exists.
  • A generic logo as the image for unrelated content.
  • sameAs links to profiles the entity does not own.

A warning is not an order to invent information. It indicates that a recommended property is absent; the product team must decide whether a trustworthy source exists.

Marked-up content must be visible and consistent

Google requires structured data to represent the main content and prohibits markup for information hidden from readers. Risky examples include:

  • JSON-LD says $99 while the page says “contact us.”
  • Schema reports InStock while purchasing is disabled.
  • Markup declares five five-star reviews that are not displayed.
  • FAQ answers exist only in JSON-LD.
  • An expired job retains a future validThrough.

“Visible” does not mean every technical property must become raw page copy. URLs, identifiers, and graph relationships can remain metadata. User-facing claims such as price, rating, event details, questions, and author must correspond to the experience.

Product schema exposes data problems quickly

Price and inventory change frequently. Product markup should be created in the same request or pipeline as the interface. Standardize:

  • Currency using the appropriate ISO code.
  • Numeric prices without currency symbols in data fields.
  • Availability using the correct schema.org URL.
  • Offers attached to the correct variant.
  • Consistent variant canonicals and product IDs.
  • Ratings aggregated only from legitimate reviews of that product.

For products with variants, read current product-variant documentation rather than combining color, price, and SKU arbitrarily in one object. If a page does not sell the item or have a genuine offer, do not create a fake offer to make errors disappear.

LocalBusiness cannot manufacture locations

Each location needs a real name, address, phone, opening hours, service area, and URL. Its landing page must provide corresponding value. Creating 200 nearly identical city pages and adding LocalBusiness does not create 200 offices.

Schema facts should agree with contact pages, business profiles, and managed internal data. When holiday hours change, update the interface and JSON-LD from the same source.

Reviews and ratings are high-risk spam areas

Do not mark up:

  • Reviews written by the business about itself.
  • Ratings copied from a different product.
  • Aggregate scores without source reviews.
  • Company-wide testimonials as ratings on every service.
  • Hidden data present only in scripts.

Violating quality guidelines can remove rich-result eligibility and may lead to a structured-data manual action. That does not necessarily erase all web ranking, but the risk is not worth a row of decorative stars.

FAQ schema is not a default for every article

Visible FAQs can remain useful to readers, but markup should not be enabled merely because a plugin offers a checkbox. Eligibility and availability can change by time, industry, and policy. Before a broad rollout:

  1. Confirm the type remains in Search Gallery and applies to the site.
  2. Read the complete feature-specific guidelines.
  3. Ensure every question and answer appears on the page.
  4. Avoid repeating identical FAQs across thousands of URLs.
  5. Measure outcomes rather than treating “valid” as success.

Schema should not dictate editorial structure. Write an FAQ when readers need it, then determine whether any supported markup fits.

Test in three layers

Layer 1: JSON and schema syntax

A parser must read the JSON-LD: commas, braces, escaping, and data types must be correct. An unescaped quotation mark in a product name can invalidate the entire block.

Layer 2: Rich Results Test

This tool checks types supported by Google and reports errors and warnings. Resolve errors; evaluate warnings against real available data. “Valid” means technically eligible at the time of testing, not guaranteed to appear.

Layer 3: Production page and Search Console

Inspect the deployed URL with URL Inspection, review actual HTML, and monitor rich-result reports. A staging test cannot expose every cache, locale, feature-flag, consent, or live-product data failure.

Run the SEO Checker to sample page signals and a free SEO audit to find abnormal metadata or canonical patterns before blaming schema.

Test incomplete and hostile data

A template often looks perfect with a complete sample product and fails at the edges:

  • No image.
  • Zero or unpublished price.
  • Two currencies.
  • Names containing quotes and line breaks.
  • Missing author.
  • Modified date preceding publication after migration.
  • Zero review count.
  • Retired product.
  • An English page receiving unintended Vietnamese organization data.

Create fixtures for these cases. Assert that JSON parses, absolute URLs use the right locale, required properties appear only when eligible, and an object is omitted when essential data is unavailable.

Common implementation failures

Two plugins generate the same entity

The theme emits Article, an SEO plugin emits BlogPosting, and a review plugin creates another Product with a different ID. The result contains contradictory authors, images, or ratings. Inventory every application/ld+json script and assign one owner to each entity.

Schema contains staging URLs

Environment variables or caches can make @id, image, and canonical URLs point to a test domain. Search production HTML for every unexpected hostname.

Locales are mixed

An English page may have an English headline but Vietnamese breadcrumbs and organization names. Define which fields are shared and which are localized; verify inLanguage when it is used.

JavaScript injects markup too late

Google can render JavaScript, but dependence on a failing or blocked client request makes data less stable. When the server already owns the facts, rendering JSON-LD in initial HTML is usually simpler and more dependable.

Schema is used to disguise weak content

Detailed markup cannot compensate for an empty product page or copied article. Structured data describes value; it does not create value absent from the page.

Monitor after deployment

Treat schema as a release contract:

  • Unit-test generators with fixtures.
  • Validate or snapshot primary templates.
  • Crawl staging and production to count items and errors.
  • Alert when markup coverage drops suddenly.
  • Monitor enhancement reports and manual actions.
  • Record release dates for CTR, impression, and error comparisons.

When Google changes support for a rich-result type, there is no need to panic and remove every useful schema.org statement. Distinguish entity markup that clarifies content from markup maintained solely for one search feature. Compare maintenance cost with actual benefit.

Pre-publication checklist

  • Does the type represent the primary content?
  • Is the feature supported in current Google documentation?
  • Are required properties complete and sourced from real data?
  • Are important claims visible to visitors?
  • Are URLs, images, and @id values absolute, crawlable, and on the right domain?
  • Do canonical and mainEntityOfPage identify the same strategic URL?
  • Do dates, prices, availability, and ratings update automatically?
  • Does another plugin create a duplicate object?
  • Does the Rich Results Test pass?
  • Can missing data invalidate the JSON?
  • Has production and Search Console been checked?

Conclusion

Good schema markup is an honest, structured description of visible content. It begins with the data model and source ownership rather than a copied JSON-LD snippet. Choose an accurate type, use stable identifiers, provide genuine complete properties, test edge cases, and monitor after release.

Do not fabricate ratings to remove warnings, mark up hidden claims, or promise rich results as a certainty. When the interface and structured data are generated from the same truth, schema becomes maintainable engineering rather than a fragile decorative layer.

References: Google Search Central's structured data introduction, general structured data guidelines, and Schema.org documentation.

Advertisement

Frequently asked questions

Does schema markup directly improve rankings?
Do not treat schema as a ranking switch. It describes content and may create rich-result eligibility, but Google does not guarantee display.
Does a valid Rich Results Test guarantee a rich result?
No. Valid means the markup passes technical checks at that time. Content, policies, indexing, query context, and presentation choices still apply.
Should I invent values to remove recommended-property warnings?
No. Add a recommended property only when genuine, visible, maintainable data exists from a trustworthy source.
#Technical SEO #On-page SEO

Nhận bản tóm tắt SEO checklist qua email

Đăng ký để nhận bản tóm tắt các bước tối ưu SEO quan trọng nhất từ bài viết này.

Check your website for free

Run an SEO audit or check your traffic quality now — no signup required.