Schema markup guide
Structured data, implemented through schema markup, tells Google what your content means to generate visible rich results like star ratings, FAQ accordions, and price ranges. While not a direct ranking factor, it can increase click-through rates by 20 to 30 percent. For modern SEO, exclusively use the JSON-LD format and prioritize Tier 1 schema types like Product, LocalBusiness, and FAQPage.
Beyond the Blue Link: Why Structured Data is Your Most Powerful SEO Asset
Open two tabs. In the first, search for a local restaurant. You'll see a plain blue link with a meta description that cuts off mid-sentence. In the second tab, search for a recipe. You'll likely see star ratings, cooking time, calorie count, and a thumbnail image, all right there in the search results before anyone clicks a thing.
Same search engine. Same algorithm. Completely different visual real estate. The difference is structured data.
Structured data, implemented through schema markup, tells Google what your content means rather than just what it says. When Google understands that a number on your page is a price, that a paragraph is an answer to a question, or that an address belongs to a physical business location, it can display that information as a rich result. Rich results are those enhanced SERP listings that include star ratings, FAQ accordions, price ranges, event dates, product availability, and more.
The visual payoff is real and measurable. Studies consistently show that rich results increase click-through rates by 20 to 30 percent compared to standard blue links. Some verticals see even higher lifts. A product listing with price, availability, and review stars simply commands more attention than one without. The eye goes where the information density is highest.
Three things happen when you implement schema correctly:
- Rich snippets in search results. Stars, prices, FAQ dropdowns, breadcrumbs, and other visual enhancements that increase CTR and build trust before the click.
- Voice search eligibility. When Google Assistant or Siri answers a question out loud, that answer often comes from structured data. If your FAQ schema matches the query, you become the spoken answer.
- Knowledge panel presence. Organization and LocalBusiness schema feed directly into the knowledge panels that appear on the right side of desktop search results. That panel is prime real estate you cannot buy with ads.
Now, here's the reality check that every honest schema guide must include: structured data does not directly boost your rankings. Google has stated this explicitly. Schema markup is not a ranking factor in the traditional sense. What it does is dramatically improve your visibility and click-through rate within the position you already hold. A page ranking #4 with rich results can easily outperform a plain blue link at #2. That CTR improvement sends positive engagement signals back to Google over time, which can indirectly support ranking improvements. But the primary mechanism is visibility, not authority.
Despite all of this, the majority of websites still don't implement schema correctly. Or at all. A crawl of most competitive SERPs will reveal that fewer than half of the results use structured data beyond the basics their CMS auto-generates. That gap is your opportunity. Your competitors are leaving rich results on the table because they think schema is too technical, too risky, or too time-consuming. It's none of those things once you understand the fundamentals.
Decoding the Technical Jargon: Schema.org vs. JSON-LD vs. Microdata
This is where most people get confused, and understandably so. Three terms get thrown around interchangeably in nearly every schema guide on the internet, and they are not the same thing. Let's fix that right now.
Schema.org is the vocabulary. Think of it as a dictionary. It defines the words you can use: "Product," "LocalBusiness," "FAQPage," "Review," "Event," and roughly 800 other types. Schema.org was created jointly by Google, Bing, Yahoo, and Yandex in 2011 as a shared language for describing web content. It tells you what you can describe. It does not tell you how to write the code.
JSON-LD, Microdata, and RDFa are the syntaxes. They are the formats you use to write that vocabulary into your website's code. They are competing methods for the same job, and they are not created equal.
| JSON-LD | Microdata | RDFa | |
|---|---|---|---|
| What it is | A JavaScript-based notation placed in a script block | HTML attributes woven directly into your page's body markup | HTML attributes similar to Microdata, more verbose |
| Where it lives | In a <script> tag in the <head> or <body>, separate from visible HTML | Inline, mixed into your existing HTML elements | Inline, mixed into your existing HTML elements |
| Google's preference | Officially recommended | Supported but not preferred | Supported but not preferred |
| Maintenance difficulty | Low. Changes don't touch visible page code | High. Edits risk breaking page layout | High. Same inline dependency issues |
| GTM compatible? | Yes | No | No |
The relationship is simple: Schema.org is the dictionary, and JSON-LD is the language you write it in. Schema.org defines that a "Product" has properties like "name," "price," and "availability." JSON-LD is the syntax that lets you express those properties in a clean block of code that sits independently from your HTML.
Here is the editorial verdict, and there's no reason to be diplomatic about it: use JSON-LD. Period.
Google explicitly recommends JSON-LD in its Search Central documentation. The reason is practical. JSON-LD lives in its own script block, completely separated from your page's visible HTML. You can add it, edit it, or remove it without any risk of breaking your layout, your CSS, or your front-end developer's sanity. Microdata, by contrast, requires you to weave attributes directly into your HTML tags. Every time a designer changes the page template, there's a chance the schema breaks silently. Nobody notices until the rich results disappear weeks later.
JSON-LD is also the only format you can inject through Google Tag Manager, which becomes critical when you need to scale schema across hundreds of pages without filing a dev ticket for each one. We'll get to that workflow later in this guide.
If you encounter existing Microdata on your site, you don't need to rip it out. Google still reads it. But every new implementation from this point forward should be JSON-LD. There is no technical scenario in 2026 where Microdata or RDFa is the better choice for a new deployment.
The Google Hierarchy: Which Schema Types Actually Generate Rich Results?
Schema.org lists over 800 types. You can describe everything from a medical condition to a bowling alley to a volcanic eruption. The vocabulary is enormous because it was designed for the entire web, not just for Google's search results.
Here's what nobody tells you clearly enough: Google only rewards roughly 32 of those types with visible rich results. The rest? Google can read them. Google might use them to understand your content a little better. But they will not generate any visible SERP enhancement. No stars. No accordions. No special treatment.
This matters because implementation takes time. If you spend two weeks marking up your site with "Organization" schema expecting some dramatic SERP transformation, you'll be disappointed. Organization schema has semantic value, meaning it helps Google understand entity relationships, but it produces no visible rich result on its own.
So let's sort this out with a clear priority framework.
Tier 1: High-Impact Schema Types (Visible Rich Results)
These are the types that directly trigger enhanced SERP features. If you're reading this schema guide to get tangible results, start here and don't leave until these are implemented on every eligible page.
| Schema Type | SERP Feature It Triggers |
|---|---|
| Product | Price, availability, review stars, merchant listing |
| LocalBusiness | Business details in knowledge panel, map pack support |
| FAQPage | Expandable question-and-answer accordion directly in SERP |
| Article / NewsArticle | Top Stories carousel, headline and date display |
| HowTo | Step-by-step instructions with images in search results |
| Review / AggregateRating | Star ratings beneath the page title |
| Event | Date, location, and ticket info in a dedicated events module |
| Recipe | Cook time, calories, ratings, thumbnail in recipe carousel |
| BreadcrumbList | Clean breadcrumb path replacing the raw URL in SERP |
Tier 2: Semantic-Value Schema Types (No Visible SERP Feature)
These types help Google understand your site's structure and entity relationships. They're worth implementing eventually, but they will not produce any visual change in your search listings.
| Schema Type | What It Does |
|---|---|
| Organization | Defines your company entity, logo, social profiles |
| WebSite | Enables sitelinks search box, defines site name |
| WebPage | Describes page-level metadata for entity association |
| Person | Author entity association for E-E-A-T signals |
A useful rule of thumb: implement every Tier 1 type that matches your content before touching a single Tier 2 type. A local plumber with perfect LocalBusiness, FAQ, and Review schema will outperform a competitor who spent weeks on Organization and WebPage markup with nothing visible to show for it.
One more thing worth stating plainly. Implementing unsupported or Tier 2 schema types will not hurt you. Google won't penalize you for marking up content with types it doesn't visually reward. But it won't help your SERP appearance either, and in a world where implementation time is limited, opportunity cost matters. Focus where the payoff is real.
How to Implement Schema Markup: A Step-by-Step Technical Workflow
Knowing which schema types matter is one thing. Getting them onto your website without breaking anything is another. The implementation process has a specific order, and skipping steps is how you end up with markup that looks fine in a code editor but never generates a single rich result.
Here is the six-step workflow that professional technical SEO teams follow. It works whether you're marking up a five-page brochure site or a 50,000-page e-commerce catalog.
Step 1: Audit your existing markup. Before writing a single line of JSON-LD, check what's already on your site. Many CMS platforms and themes auto-generate schema in the background. WordPress with Yoast, for example, outputs Article and BreadcrumbList schema by default. Shopify injects Product schema on product pages. If you add your own markup on top of existing auto-generated schema, you'll create duplicate types on the same page, and Google will either ignore both or throw validation errors. Run your key pages through the Rich Results Test first. Know what's already there.
Step 2: Identify target pages and match them to schema types. Not every page on your site needs schema, and not every page qualifies for the same type. Map your site's page templates to the Tier 1 types from the previous section. Product pages get Product schema. Location pages get LocalBusiness. Blog posts get Article. FAQ sections get FAQPage. Service pages with step-by-step processes can qualify for HowTo. Be specific. A spreadsheet with three columns (URL pattern, page template, schema type) is all you need.
Step 3: Choose your deployment method. This is the decision that determines how much ongoing maintenance you're signing up for. There are three real options, and the right one depends on your technical resources and scale.
| Method | Best For | Pros | Cons |
|---|---|---|---|
| CMS Plugin (Yoast, RankMath, etc.) | Small to mid-size sites on WordPress or similar | No coding required, automatic updates, built-in validation | Limited customization, can conflict with theme-generated schema |
| Google Tag Manager | Multi-location businesses, large catalogs, teams without dedicated dev | Scalable, no code deployments needed, centralized management | Requires GTM knowledge, depends on JavaScript rendering |
| Hardcoded (manual) | Critical single pages, custom platforms, maximum control | Full control over every property, no third-party dependency | Requires developer for every change, slow to scale |
If you're on WordPress and managing fewer than a few hundred pages, a plugin handles most of the heavy lifting. If you need to push schema across thousands of product or location pages and your dev team has a six-week backlog, Google Tag Manager is the answer. If you have one homepage and one critical landing page that absolutely must be perfect, hardcode it and move on.
Step 4: Write or generate the JSON-LD. This is where the actual code gets created. You can write it by hand, use a schema generator tool, or adapt the templates in the next section of this guide. Whichever route you take, make sure every required property for your chosen type is included. Google's documentation lists required and recommended properties for each supported type. Missing a required field means no rich result. Missing a recommended field means a less competitive rich result.
Step 5: Validate before deployment. This step is non-negotiable. Never push untested schema to a production site. Paste your JSON-LD into the Rich Results Test as a code snippet. Fix every error. Address as many warnings as practical. Then deploy to a staging environment and test the live URL. Code-level validation and URL-level validation catch different problems, especially when JavaScript rendering is involved.
Step 6: Deploy and monitor. Push the schema live, then watch Google Search Console's Enhancements reports over the following two to four weeks. Google needs to recrawl your pages before new schema appears in its systems. If errors surface during that period, Search Console will flag them. We'll cover that monitoring process in detail later in this guide.
Essential JSON-LD Templates for Local Business, Products, and FAQs
Below are three ready-to-use JSON-LD templates. Copy them, replace the placeholder values with your actual data, validate, and deploy. Each template includes inline comments marking required fields and flags the most common mistakes that cause validation failures.
LocalBusiness Schema
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "LocalBusiness", "name": "Your Business Name", // Required "image": "https://example.com/photo.jpg", // Recommended "address": { // Required "@type": "PostalAddress", "streetAddress": "123 Main Street", "addressLocality": "Helsinki", "addressRegion": "Uusimaa", "postalCode": "00100", "addressCountry": "FI" }, "geo": { // Recommended "@type": "GeoCoordinates", "latitude": 60.1699, "longitude": 24.9384 }, "telephone": "+358-9-123-4567", // Recommended "openingHoursSpecification": [ // Recommended { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"], "opens": "09:00", "closes": "17:00" } ], "url": "https://example.com", "priceRange": "$$" } </script> Required fields: name, address.
Common mistake: Using a generic "@type" of "Organization" instead of a specific subtype like "Restaurant," "Dentist," or "LegalService." Google prefers the most specific type that applies to your business. Check Schema.org's LocalBusiness subtypes and pick the one that matches.
Product Schema
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Product", "name": "Product Name Here", // Required "image": "https://example.com/product.jpg", // Required "description": "Brief product description.", // Recommended "brand": { "@type": "Brand", "name": "Brand Name" }, "offers": { // Required "@type": "Offer", "price": "49.99", // Required "priceCurrency": "EUR", // Required "availability": "https://schema.org/InStock", // Required "priceValidUntil": "2026-12-31", // Recommended "url": "https://example.com/product-page" }, "aggregateRating": { // Recommended "@type": "AggregateRating", "ratingValue": "4.5", "reviewCount": "87" } } </script> Required fields: name, image, offers (with price, priceCurrency, and availability).
Common mistake: Omitting priceValidUntil. Google Search Console will flag a warning for every Product page missing this field. The warning won't block your rich result, but it clutters your Enhancements report and makes it harder to spot real errors. Set it to the end of your current pricing period and update it when prices change.
FAQPage Schema
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "What is your return policy?", // Required "acceptedAnswer": { // Required "@type": "Answer", "text": "We offer a 30-day return policy on all unused items. Contact support@example.com to initiate a return." } }, { "@type": "Question", "name": "How long does shipping take?", "acceptedAnswer": { "@type": "Answer", "text": "Standard shipping takes 3-5 business days within Finland. Express shipping is available for next-day delivery." } } ] } </script> Required fields: At least one Question with a corresponding acceptedAnswer.
Common mistake: Adding FAQPage schema to a page that has no visible FAQ content. This is a direct path to a manual action from Google. Every question and answer in your schema must appear word-for-word in the visible page content. If users can't see the FAQ, the schema is deceptive, and Google treats it accordingly.
One syntax note that applies to all three templates: the number-one JSON-LD error is a missing comma after a property value. JSON is unforgiving about this. A single missing comma will silently break the entire block, and your page will render in the browser as if nothing is wrong while Google sees no structured data at all. Always validate.
Scaling Implementation: Using Google Tag Manager for Enterprise Schema
CMS plugins work well when you have a handful of page templates and a manageable site. The moment you're dealing with hundreds of location pages, thousands of product SKUs, or a platform where the dev team treats every code change as a two-sprint project, you need a different approach.
Google Tag Manager lets you inject JSON-LD into any page on your site without touching the source code. You manage everything from the GTM interface: the schema template, the dynamic values, and the pages it fires on. When you need to update a property or add a new schema type, you publish a GTM version instead of filing a development ticket.
Before walking through the setup, let's address the concern that stops most people from trying this: does Google actually see schema injected through GTM? Yes. Google has confirmed that Googlebot renders JavaScript, including scripts injected via Google Tag Manager. GTM-deployed JSON-LD is crawlable and valid for rich results. This is not a gray area.
Here is the step-by-step GTM setup:
1. Create a Custom HTML tag. In GTM, go to Tags > New > Custom HTML. This tag will hold your JSON-LD template.
2. Paste your JSON-LD template with GTM variable placeholders. Instead of hardcoding values like product name or price, replace them with double-curly-bracket GTM variables. For example: "name": "{{DL - Product Name}}" where DL - Product Name is a Data Layer variable you'll define in the next step.
3. Create Data Layer variables for dynamic values. Go to Variables > User-Defined Variables > New > Data Layer Variable. Each variable pulls a specific value from your site's Data Layer. Your development team needs to push these values into the Data Layer on page load. For e-commerce platforms, many of these values (product name, price, SKU, availability) are already in the Data Layer if Enhanced Ecommerce tracking is configured.
4. Set your trigger. Define which pages this tag should fire on. Use Page Path or Page URL triggers to target specific page templates. For product schema, you might trigger on all URLs matching /products/*. For LocalBusiness, trigger on /locations/*. Be precise. Firing schema on the wrong page type creates validation errors.
5. Preview and validate. Use GTM's Preview mode to confirm the tag fires correctly on your target pages. Then take the live preview URL and paste it into Google's Rich Results Test. Use the URL inspection method, not the code snippet method. Because GTM injects the schema via JavaScript at render time, a code snippet test won't see it. The URL test will, because it renders the page the same way Googlebot does.
6. Publish. Once validation passes cleanly, publish the GTM container version. Monitor Search Console over the following weeks for any new enhancement reports or error flags tied to the pages you targeted.
GTM makes the most sense for multi-location businesses that need LocalBusiness schema on 50 or 500 location pages, for e-commerce sites with large catalogs where product data is already flowing through the Data Layer, and for marketing teams that need to iterate on schema without waiting for engineering resources. For single critical pages like a homepage or a flagship landing page, hardcoding gives you more control and removes the JavaScript rendering dependency. Use both methods where each fits best.
One thing to watch carefully: GTM-injected schema is only visible after JavaScript execution. If Googlebot encounters a rendering timeout or your GTM container is slow to load, the schema might not be processed. Always verify with the Rich Results Test URL inspection after deployment, and check Search Console's Enhancements reports periodically to confirm Google is reading what you intended.
The Validation Protocol: Using the Rich Results Test and Schema Validator
You've written the JSON-LD, chosen a deployment method, and pushed it live. Now comes the part that separates schema that actually generates rich results from schema that sits on your site doing nothing: validation.
There are two official testing tools, and they do different things. Confusing them, or using only one, is how markup errors survive for months without anyone noticing.
The Google Rich Results Test (search.google.com/test/rich-results) checks whether Google can read your structured data and whether it qualifies for a rich result. It only evaluates the ~32 schema types that Google actively supports. If you feed it an Organization or WebPage type, it will tell you the markup is valid but "not eligible for rich results." That's not an error; it's the tool doing exactly what it's designed to do. The Rich Results Test also shows a preview of what your enhanced listing could look like, which is useful for getting stakeholder buy-in.
The Schema Markup Validator (validator.schema.org) checks your markup against the full Schema.org specification. Every type, every property, every nesting rule. It doesn't care whether Google rewards the type with a rich result. It cares whether your code is structurally correct according to the vocabulary standard. This tool catches issues the Rich Results Test ignores, like using a property that exists in Schema.org but isn't recognized by Google's subset.
| Rich Results Test | Schema Markup Validator | |
|---|---|---|
| Scope | Google-supported types only (~32) | All Schema.org types (800+) |
| Rich result preview | Yes | No |
| Catches syntax errors | Yes | Yes |
| Catches unsupported property use | Partially | Yes |
| Tests JavaScript-rendered pages | Yes (URL mode) | Yes (URL mode) |
| Best for | Pre-launch validation of Tier 1 types | Full-spec compliance audits |
Use both. Run the Rich Results Test first to confirm Google will reward your markup. Then run the Schema Markup Validator to catch anything the first tool glossed over.
Here's a testing checklist that works in practice:
- Test the code snippet first. Paste your raw JSON-LD into the Rich Results Test's code tab. This catches pure syntax problems: missing commas, unclosed brackets, wrong property types. Fix everything before the code goes anywhere near your site.
- Deploy to a staging environment. Put the markup on a non-production URL where you can test without affecting live search results.
- Test the live URL. Paste the staging URL into the Rich Results Test. This is critical if you're using GTM or any JavaScript-based injection, because the code snippet test doesn't execute JavaScript. The URL test renders the page the way Googlebot would, so it catches deployment failures that a code-level test cannot see.
- Distinguish warnings from errors. Errors block rich results entirely. A missing required field is an error. Warnings are about recommended fields you haven't included, like
priceValidUntilon Product schema. Warnings won't prevent your rich result from appearing, but they signal missed opportunities and clutter your Search Console reports over time.
Always test the live URL, not just the code snippet. This single habit will save you from the most common deployment failure: schema that validates perfectly as a snippet but never renders on the actual page because of a GTM trigger misconfiguration or a JavaScript loading conflict.
Monitoring Performance and Fixing Errors in Google Search Console
Validation at deployment is a one-time gate. Monitoring in Google Search Console is the ongoing work that keeps your rich results alive.
After Google recrawls your pages (which typically takes a few days to a few weeks depending on your site's crawl frequency), structured data begins appearing in Search Console under the Enhancements section in the left sidebar. Each supported schema type gets its own report: Products, FAQs, Breadcrumbs, How-tos, and so on. If Google found your markup and processed it, the type will appear here. If it didn't, the type won't show up at all, which is itself a diagnostic signal.
Each Enhancement report splits your pages into three categories: Valid, Valid with warnings, and Error. Valid pages are generating or eligible to generate rich results. Pages with warnings are still eligible but have recommended fields missing. Pages with errors are blocked from rich results entirely until you fix the issue.
Here are the errors you'll encounter most often, along with what actually fixes them:
"Missing field 'image'" on Product or Recipe schema. Google requires an image property for these types. Add a direct URL to a high-quality image. Don't use a relative path; use the full absolute URL starting with https://.
"Missing field 'priceValidUntil'" on Product schema. This shows as a warning, not an error. Add a date in ISO 8601 format (YYYY-MM-DD) representing when the current price expires. If your pricing doesn't have an explicit expiration, set it to the end of the current calendar year and update annually.
"Invalid enum value for field 'availability'" on Product schema. The availability property must be a full Schema.org URL like https://schema.org/InStock, not a plain text string like "In Stock" or "available." This is a formatting issue, not a content issue.
"mainEntity field is missing or empty" on FAQPage schema. Your FAQ markup has the FAQPage wrapper but no Question items inside it. This usually happens when a CMS plugin generates the outer structure but fails to populate the questions dynamically. Check the rendered page source, not just the plugin settings.
When Search Console flags an error, fix it, redeploy, and then use the "Validate Fix" button in the Enhancement report. This tells Google to recrawl the affected pages and recheck the markup. Google will process the validation request over a few days and update the report. Don't keep clicking the button repeatedly; one request is enough. Patience is part of the process.
Build a monthly habit of checking these Enhancement reports. Schema can break silently. A theme update, a CMS plugin update, a developer refactoring the page template: any of these can wipe out or corrupt your structured data without anyone intending to. The pages will load fine in a browser. The rich results will simply vanish from search. You'll only know if you're watching the reports.
Avoiding the Manual Action: Guidelines for Ethical and Safe Schema Deployment
Google's documentation on structured data includes a section most people skim past: the Structured Data General Guidelines. Buried in that page are the rules that, when violated, trigger manual actions. A manual action is not a gentle warning. It's a human reviewer at Google deciding that your schema is deceptive, and the penalty is the removal of all rich results from your entire site. Not just the offending page. The entire domain.
The rules themselves are straightforward. Following them requires discipline more than technical skill.
Every piece of structured data must reflect visible content on the page. If your FAQPage schema contains five questions and answers, those exact five questions and answers must be readable by a human visiting the page. If your Product schema says the price is €49.99, that price must be displayed on the page. Schema is a description of what exists, not a wish list of what you'd like Google to show.
Don't mark up content that is hidden from users. Putting FAQ content inside a display: none CSS block and then adding FAQPage schema for it is exactly the kind of thing that triggers manual review. The content must be accessible. Accordion-style FAQs that users can expand with a click are fine. Content that is permanently invisible is not.
Don't use Review or AggregateRating schema for self-serving reviews. Google's guidelines explicitly prohibit review schema where the entity being reviewed is the entity that controls the page. You cannot put AggregateRating schema on your own homepage to display five stars for yourself. Reviews must be about a specific product, service, or piece of content, and they must come from genuine third-party sources. Fabricated ratings are the fastest path to a manual action.
Don't create multiple conflicting schema blocks for the same entity on the same page. If your CMS plugin generates Product schema and you also hardcode a separate Product block with different values, Google receives contradictory information. At best, it ignores both. At worst, it flags the inconsistency. The audit step at the beginning of the implementation workflow exists specifically to prevent this.
Keep your schema current. Product schema with a price from 2023 and an availability status of "InStock" for an item you discontinued last year is misleading. Event schema advertising a date that already passed is misleading. Stale schema erodes trust with both Google and the people who click your rich results expecting accurate information. If a product goes out of stock, update the availability property. If an event ends, remove the Event schema or update it to the next occurrence.
The underlying principle behind all of these rules is simple: structured data is a promise. You're telling Google, "This is exactly what a user will find when they land on this page." When that promise holds, Google rewards you with enhanced visibility. When it doesn't, Google removes the privilege.
Treat your schema markup with the same editorial rigor you apply to the content itself. Audit it quarterly. Validate it after every site update. Monitor it in Search Console monthly. The payoff, richer search listings, higher click-through rates, and a competitive edge that most of your competitors still haven't captured, is worth the maintenance. And if you're unsure whether your current implementation is clean, run your top ten landing pages through the Rich Results Test today. The results will tell you exactly where you stand.
