Your site appears in search results without stars, without prices, without recipes. Competitors have breadcrumbs, reviews, and images. The difference? Structured data. If you don't use it, you let Google (and Bing) guess what's on your pages. And Google guesses wrong, almost always.
At Meteora Web, we work on this every day. We come from accounting and ERP — for us, every markup must have a measurable return, not just technical pride. A well-implemented rich snippet can boost CTR by 20–30%.
This guide goes straight to the point: what you need, how to implement in JSON-LD, how to test. No useless theory.
Why structured data is a pillar, not an extra
Search engines don't see pages the way we do. They read HTML and infer context. With Schema.org (a shared vocabulary by Google, Bing, Yahoo, Yandex) you can say exactly: “This is a recipe, it takes 45 minutes, 4.5 stars, 320 calories.” The search engine takes that info and displays it as a rich snippet.
It's not a trick. It's a standard language. Not implementing it means leaving money on the table: more visibility, more clicks, more conversions.
Google recommends JSON-LD (JavaScript Object Notation for Linked Data). It goes into the <head> or <body>, is easily managed with PHP, Laravel, or WordPress, and doesn't affect visible HTML.
JSON-LD vs Microdata vs RDFa
There are three ways to mark up data. JSON-LD won because:
Sponsored Protocol
- It doesn't touch HTML markup (no
itempropattributes scattered in the code). - You can generate it dynamically on the backend without changing templates.
- Google prefers it, and it's required for advanced features like product reviews on Google Shopping.
Schema.org types every site should implement
You don't need to mark every paragraph. Choose types that drive traffic and conversions. The most common:
Product and Review
If you sell online, Product markup is mandatory to show price, availability, and rating. Real example:
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "Organic cotton T-shirt",
"image": "https://example.com/tshirt.jpg",
"description": "T-shirt made with GOTS-certified cotton",
"sku": "TS-001",
"offers": {
"@type": "Offer",
"priceCurrency": "EUR",
"price": "29.90",
"itemCondition": "https://schema.org/NewCondition",
"availability": "https://schema.org/InStock"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.5",
"reviewCount": "34"
}
}
Note: Google requires the price and availability to be visible on the page. You can't put them only in JSON-LD if they're not in the text.
Article and NewsArticle
For blogs and publications, Article markup helps Google understand author, publication date, and main image. It adds the author in SERPs.
Sponsored Protocol
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Structured Data JSON-LD Guide",
"author": {
"@type": "Person",
"name": "Calogero Bono"
},
"datePublished": "2026-02-15",
"dateModified": "2026-02-20",
"image": "https://example.com/image.jpg"
}
For news, use NewsArticle — adds dateline and chronology.
FAQ and HowTo
Frequently asked questions with FAQPage can appear as expandable lists directly in search results. Great for CTR on support pages or landing pages.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "How much does an SEO consultancy cost?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Starting from $500 per month for audit and implementation."
}
}]
}
HowTo is perfect for step-by-step guides (recipes, tutorials) and can show total time and number of steps.
BreadcrumbList
Structured breadcrumbs improve navigation and help Google understand site hierarchy. Very simple to implement.
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://example.com/"
},{
"@type": "ListItem",
"position": 2,
"name": "Category",
"item": "https://example.com/category/"
},{
"@type": "ListItem",
"position": 3,
"name": "Product",
"item": "https://example.com/category/product"
}]
}
LocalBusiness
For physical businesses (shops, restaurants, studios). Shows address, phone, hours, and rating in local SERPs.
Sponsored Protocol
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Meteora Web",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Via Roma",
"addressLocality": "Sciacca",
"addressRegion": "AG",
"postalCode": "92019",
"addressCountry": "IT"
},
"telephone": "+39 0925 123456",
"openingHours": "Mo-Fr 09:00-18:00"
}
How to test structured data
Writing JSON-LD is not enough. You need to verify Google interprets it correctly.
Google Rich Results Test
The official tool: Rich Results Test. Enter the URL or code directly. It tells you errors, snippet validity, and what will be shown. Always do this before going live.
Schema Markup Validator by Google
A more generic tool (validator.schema.org), checks syntactic and logical correctness of any Schema.org markup.
Google Search Console: Structured Data report
After implementation, in Search Console find the “Structured Data” report. It shows how many rich snippets were indexed, any errors, and warnings. Check it weekly.
Sponsored Protocol
Common errors and how to avoid them
- Hidden markup: Don't include data not visible to the user. Google penalizes it (e.g., a fake price just to show a snippet).
- Wrong types: Using
Productfor a service. There'sService. Choose the most appropriate type. - Duplicate IDs: If you have multiple entities on a page, use
@idto distinguish them. - Forgetting context: The
@contextfield must behttps://schema.org, nothttp://. - Not updating data: If you change price or availability, update the JSON-LD too. A product marked “InStock” when sold out damages trust and can lead to penalties.
Practical implementation in CMS
WordPress
With a custom theme you can add JSON-LD in functions.php or use plugins like Yoast SEO or Rank Math (which generate it automatically). We prefer to do it manually in the header.php of product pages with conditional functions for full control.
Laravel
Generate JSON-LD on the controller side and pass it to the view. Example:
$structuredData = [
'@context' => 'https://schema.org',
'@type' => 'Product',
'name' => $product->name,
'offers' => [
'@type' => 'Offer',
'price' => $product->price,
'priceCurrency' => 'EUR',
'availability' => $product->inStock ? 'https://schema.org/InStock' : 'https://schema.org/OutOfStock'
]
];
return view('product.show', compact('product', 'structuredData'));
Then in the Blade view:
Sponsored Protocol
<script type="application/ld+json">
{!! json_encode($structuredData, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) !!}
</script>
How to measure impact
After implementation, monitor:
- CTR in SERPs (from Search Console → Search results).
- Impressions for queries with rich snippets.
- Conversion rate if the snippet includes price and availability (e.g., for e-commerce).
At Meteora Web, we've seen an average 22% CTR increase on clients who activated product markup with ratings.
Useful links
- Official Schema.org documentation: schema.org
- Google Rich Results Test: rich results test
- Google's complete guide on structured data: Intro to structured data
- Read our Pillar Guide to Advanced Technical SEO: Advanced Technical SEO
Summary — What to do now
- Choose the most relevant Schema types for your site: Product for e-commerce, Article for blogs, LocalBusiness for physical stores.
- Generate JSON-LD with real data — no tricks.
- Test it with Google's Rich Results Test.
- Deploy it in production (manually or via CMS).
- Monitor CTR and errors in Search Console for at least a month.
- Update data as offers change.
Structured data is not a fad: it's a technical requirement to compete in search results. If you don't have it, you're only doing half of SEO.