What is Structured Data?

Structured data is a standardized format for providing information about a page and classifying its content. Search engines use this data to understand your content better and create rich snippets in search results.

Benefits of Structured Data

  • Rich Snippets - Enhanced search result appearances
  • Better SEO - Improved search engine understanding
  • Voice Search - Better compatibility with voice assistants
  • Knowledge Graph - Potential inclusion in Google's Knowledge Graph
  • Social Sharing - Enhanced social media previews

Schema.org Vocabulary

Schema.org is a collaborative effort by major search engines to create a common vocabulary for structured data.

Common Schema Types

  • Organization - Company/business information
  • Person - Individual person details
  • Product - Product information
  • Article - Blog posts and articles
  • Recipe - Cooking recipes
  • Event - Events and occasions
  • LocalBusiness - Local business information
  • Review - Reviews and ratings

HTML Microdata

Microdata uses HTML attributes to embed structured data directly in your HTML.

Basic Microdata Syntax



html

<div itemscope itemtype="https://schema.org/Person">
    <h1 itemprop="name">John Doe</h1>
    <p>Email: <a itemprop="email" href="mailto:john@example.com">john@example.com</a></p>
    <p>Phone: <span itemprop="telephone">+1-555-123-4567</span></p>
    <p>Job Title: <span itemprop="jobTitle">Software Developer</span></p>
    <div itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
        <span itemprop="streetAddress">123 Main St</span><br>
        <span itemprop="addressLocality">Anytown</span>,
        <span itemprop="addressRegion">ST</span>
        <span itemprop="postalCode">12345</span>
    </div>
</div>

Product Microdata Example



html

<div itemscope itemtype="https://schema.org/Product">
    <h1 itemprop="name">Wireless Bluetooth Headphones</h1>
    
    <div itemprop="image" itemscope itemtype="https://schema.org/ImageObject">
        <img src="headphones.jpg" alt="Wireless Headphones" itemprop="url">
    </div>
    
    <p itemprop="description">
        Premium wireless headphones with noise cancellation and 30-hour battery life.
    </p>
    
    <div itemprop="brand" itemscope itemtype="https://schema.org/Brand">
        <span itemprop="name">TechAudio</span>
    </div>
    
    <div itemprop="offers" itemscope itemtype="https://schema.org/Offer">
        <span itemprop="price" content="299.99">$299.99</span>
        <meta itemprop="priceCurrency" content="USD">
        <link itemprop="availability" href="https://schema.org/InStock">In Stock
        <link itemprop="url" href="https://example.com/headphones">
    </div>
    
    <div itemprop="aggregateRating" itemscope itemtype="https://schema.org/AggregateRating">
        <span itemprop="ratingValue">4.5</span> out of 
        <span itemprop="bestRating">5</span> stars
        (<span itemprop="reviewCount">128</span> reviews)
    </div>
    
    <div itemprop="review" itemscope itemtype="https://schema.org/Review">
        <div itemprop="author" itemscope itemtype="https://schema.org/Person">
            <span itemprop="name">Sarah Johnson</span>
        </div>
        <div itemprop="reviewRating" itemscope itemtype="https://schema.org/Rating">
            <span itemprop="ratingValue">5</span> out of 
            <span itemprop="bestRating">5</span> stars
        </div>
        <p itemprop="reviewBody">
            Excellent sound quality and comfortable for long listening sessions.
        </p>
        <meta itemprop="datePublished" content="2024-01-15">
    </div>
</div>

Article Microdata



html

<article itemscope itemtype="https://schema.org/BlogPosting">
    <header>
        <h1 itemprop="headline">10 Tips for Better Web Development</h1>
        <p>
            By <span itemprop="author" itemscope itemtype="https://schema.org/Person">
                <span itemprop="name">Jane Smith</span>
            </span>
        </p>
        <time itemprop="datePublished" datetime="2024-01-20T10:00:00Z">
            January 20, 2024
        </time>
        <time itemprop="dateModified" datetime="2024-01-22T14:30:00Z" style="display:none;">
            January 22, 2024
        </time>
    </header>
    
    <div itemprop="image" itemscope itemtype="https://schema.org/ImageObject">
        <img src="web-development-tips.jpg" alt="Web Development Tips" itemprop="url">
        <meta itemprop="width" content="1200">
        <meta itemprop="height" content="630">
    </div>
    
    <div itemprop="articleBody">
        <p itemprop="description">
            Learn essential web development tips to improve your coding skills and build better websites.
        </p>
        <!-- Article content -->
        <h2>1. Use Semantic HTML</h2>
        <p>Semantic HTML elements provide meaning to your content...</p>
        <!-- More content -->
    </div>
    
    <div itemprop="publisher" itemscope itemtype="https://schema.org/Organization">
        <meta itemprop="name" content="Web Dev Blog">
        <div itemprop="logo" itemscope itemtype="https://schema.org/ImageObject">
            <meta itemprop="url" content="https://example.com/logo.png">
        </div>
    </div>
    
    <meta itemprop="wordCount" content="1250">
    <meta itemprop="timeRequired" content="PT5M">
</article>

JSON-LD (Recommended Approach)

JSON-LD (JavaScript Object Notation for Linked Data) is Google's preferred format for structured data.

Basic JSON-LD Structure



html

<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "Person",
    "name": "John Doe",
    "email": "john@example.com",
    "telephone": "+1-555-123-4567",
    "jobTitle": "Software Developer",
    "address": {
        "@type": "PostalAddress",
        "streetAddress": "123 Main St",
        "addressLocality": "Anytown",
        "addressRegion": "ST",
        "postalCode": "12345",
        "addressCountry": "US"
    },
    "url": "https://johndoe.example.com"
}
</script>

Product JSON-LD



html

<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "Product",
    "name": "Wireless Bluetooth Headphones",
    "description": "Premium wireless headphones with noise cancellation and 30-hour battery life.",
    "image": [
        "https://example.com/headphones-1.jpg",
        "https://example.com/headphones-2.jpg",
        "https://example.com/headphones-3.jpg"
    ],
    "brand": {
        "@type": "Brand",
        "name": "TechAudio"
    },
    "sku": "TA-WH-001",
    "gtin": "123456789012",
    "offers": {
        "@type": "Offer",
        "price": "299.99",
        "priceCurrency": "USD",
        "availability": "https://schema.org/InStock",
        "url": "https://example.com/headphones",
        "seller": {
            "@type": "Organization",
            "name": "TechStore"
        },
        "priceValidUntil": "2024-12-31"
    },
    "aggregateRating": {
        "@type": "AggregateRating",
        "ratingValue": 4.5,
        "reviewCount": 128,
        "bestRating": 5,
        "worstRating": 1
    },
    "review": [
        {
            "@type": "Review",
            "author": {
                "@type": "Person",
                "name": "Sarah Johnson"
            },
            "datePublished": "2024-01-15",
            "reviewBody": "Excellent sound quality and comfortable for long listening sessions.",
            "reviewRating": {
                "@type": "Rating",
                "ratingValue": 5,
                "bestRating": 5
            }
        }
    ]
}
</script>

Article JSON-LD



html

<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "BlogPosting",
    "headline": "10 Tips for Better Web Development",
    "description": "Learn essential web development tips to improve your coding skills and build better websites.",
    "image": {
        "@type": "ImageObject",
        "url": "https://example.com/web-development-tips.jpg",
        "width": 1200,
        "height": 630
    },
    "author": {
        "@type": "Person",
        "name": "Jane Smith",
        "url": "https://example.com/author/jane-smith"
    },
    "publisher": {
        "@type": "Organization",
        "name": "Web Dev Blog",
        "logo": {
            "@type": "ImageObject",
            "url": "https://example.com/logo.png"
        }
    },
    "datePublished": "2024-01-20T10:00:00Z",
    "dateModified": "2024-01-22T14:30:00Z",
    "mainEntityOfPage": {
        "@type": "WebPage",
        "@id": "https://example.com/web-development-tips"
    },
    "wordCount": 1250,
    "timeRequired": "PT5M",
    "articleSection": "Web Development",
    "keywords": ["web development", "coding tips", "HTML", "CSS", "JavaScript"]
}
</script>

Local Business JSON-LD



html

<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "Restaurant",
    "name": "Mario's Italian Kitchen",
    "description": "Authentic Italian cuisine in the heart of downtown",
    "image": "https://example.com/restaurant-photo.jpg",
    "address": {
        "@type": "PostalAddress",
        "streetAddress": "456 Oak Street",
        "addressLocality": "Downtown",
        "addressRegion": "CA",
        "postalCode": "90210",
        "addressCountry": "US"
    },
    "geo": {
        "@type": "GeoCoordinates",
        "latitude": "34.0522",
        "longitude": "-118.2437"
    },
    "url": "https://mariositalian.example.com",
    "telephone": "+1-555-PIZZA-01",
    "email": "info@mariositalian.example.com",
    "openingHours": [
        "Mo-Th 11:00-22:00",
        "Fr-Sa 11:00-23:00",
        "Su 12:00-21:00"
    ],
    "servesCuisine": "Italian",
    "priceRange": "$$",
    "aggregateRating": {
        "@type": "AggregateRating",
        "ratingValue": 4.3,
        "reviewCount": 156
    },
    "paymentAccepted": "Cash, Credit Card",
    "currenciesAccepted": "USD"
}
</script>

Recipe JSON-LD



html

<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "Recipe",
    "name": "Classic Chocolate Chip Cookies",
    "description": "Soft and chewy chocolate chip cookies with a perfect golden edge.",
    "image": [
        "https://example.com/cookies-1.jpg",
        "https://example.com/cookies-2.jpg"
    ],
    "author": {
        "@type": "Person",
        "name": "Chef Maria"
    },
    "datePublished": "2024-01-15",
    "prepTime": "PT15M",
    "cookTime": "PT12M",
    "totalTime": "PT27M",
    "recipeCategory": "Dessert",
    "recipeCuisine": "American",
    "recipeYield": "24 cookies",
    "keywords": "chocolate chip, cookies, dessert, baking",
    "nutrition": {
        "@type": "NutritionInformation",
        "calories": "150 per cookie",
        "fatContent": "7g",
        "carbohydrateContent": "20g",
        "proteinContent": "2g"
    },
    "recipeIngredient": [
        "2 1/4 cups all-purpose flour",
        "1 tsp baking soda",
        "1 tsp salt",
        "1 cup butter, softened",
        "3/4 cup granulated sugar",
        "3/4 cup packed brown sugar",
        "2 large eggs",
        "2 tsp vanilla extract",
        "2 cups chocolate chips"
    ],
    "recipeInstructions": [
        {
            "@type": "HowToStep",
            "text": "Preheat oven to 375°F (190°C)."
        },
        {
            "@type": "HowToStep",
            "text": "Mix flour, baking soda and salt in bowl."
        },
        {
            "@type": "HowToStep",
            "text": "Beat butter, granulated sugar, brown sugar, eggs and vanilla extract until creamy."
        },
        {
            "@type": "HowToStep",
            "text": "Gradually beat in flour mixture. Stir in chocolate chips."
        },
        {
            "@type": "HowToStep",
            "text": "Drop rounded tablespoons of dough onto ungreased cookie sheets."
        },
        {
            "@type": "HowToStep",
            "text": "Bake 9 to 11 minutes or until golden brown. Cool completely."
        }
    ],
    "aggregateRating": {
        "@type": "AggregateRating",
        "ratingValue": 4.8,
        "reviewCount": 95
    }
}
</script>

Event JSON-LD



html

<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "Event",
    "name": "Web Development Conference 2024",
    "description": "Join industry experts for the latest trends in web development, featuring workshops and keynote presentations.",
    "image": "https://example.com/conference-banner.jpg",
    "startDate": "2024-06-15T09:00:00-07:00",
    "endDate": "2024-06-16T17:00:00-07:00",
    "eventStatus": "https://schema.org/EventScheduled",
    "eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
    "location": {
        "@type": "Place",
        "name": "Tech Convention Center",
        "address": {
            "@type": "PostalAddress",
            "streetAddress": "123 Conference Way",
            "addressLocality": "San Francisco",
            "addressRegion": "CA",
            "postalCode": "94102",
            "addressCountry": "US"
        }
    },
    "organizer": {
        "@type": "Organization",
        "name": "WebDev Events",
        "url": "https://webdevevents.com"
    },
    "offers": {
        "@type": "Offer",
        "price": "299",
        "priceCurrency": "USD",
        "availability": "https://schema.org/InStock",
        "url": "https://example.com/conference-tickets",
        "validFrom": "2024-01-01T00:00:00-00:00"
    },
    "performer": [
        {
            "@type": "Person",
            "name": "John Smith",
            "jobTitle": "Senior Web Developer"
        },
        {
            "@type": "Person", 
            "name": "Emily Johnson",
            "jobTitle": "UX Designer"
        }
    ]
}
</script>

Combining Multiple Schema Types

Sometimes you need to use multiple schema types on a single page:



html

<!-- Organization + Website -->
<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@graph": [
        {
            "@type": "Organization",
            "@id": "https://example.com/#organization",
            "name": "TechCorp Solutions",
            "url": "https://example.com",
            "logo": {
                "@type": "ImageObject",
                "url": "https://example.com/logo.png"
            },
            "contactPoint": {
                "@type": "ContactPoint",
                "telephone": "+1-555-123-4567",
                "contactType": "customer service"
            },
            "sameAs": [
                "https://facebook.com/techcorp",
                "https://twitter.com/techcorp",
                "https://linkedin.com/company/techcorp"
            ]
        },
        {
            "@type": "WebSite",
            "@id": "https://example.com/#website",
            "url": "https://example.com",
            "name": "TechCorp Solutions",
            "publisher": {
                "@id": "https://example.com/#organization"
            },
            "potentialAction": {
                "@type": "SearchAction",
                "target": {
                    "@type": "EntryPoint",
                    "urlTemplate": "https://example.com/search?q={search_term_string}"
                },
                "query-input": "required name=search_term_string"
            }
        }
    ]
}
</script>

Testing Structured Data

Google's Rich Results Test



html

<!-- Test your structured data at: https://search.google.com/test/rich-results -->
<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
        {
            "@type": "Question",
            "name": "What is structured data?",
            "acceptedAnswer": {
                "@type": "Answer",
                "text": "Structured data is a standardized format for providing information about a page and classifying the page content."
            }
        },
        {
            "@type": "Question", 
            "name": "Why use JSON-LD over Microdata?",
            "acceptedAnswer": {
                "@type": "Answer",
                "text": "JSON-LD is easier to implement, maintain, and doesn't clutter your HTML markup. It's Google's recommended format."
            }
        }
    ]
}
</script>

Schema Markup Validator



javascript

// Simple JavaScript validator for JSON-LD
function validateJSONLD(jsonldString) {
    try {
        const data = JSON.parse(jsonldString);
        
        // Basic validation checks
        const errors = [];
        
        if (!data['@context']) {
            errors.push('Missing @context property');
        }
        
        if (!data['@type']) {
            errors.push('Missing @type property');
        }
        
        // Type-specific validation
        if (data['@type'] === 'Product') {
            if (!data.name) errors.push('Product must have a name');
            if (!data.offers) errors.push('Product should have offers');
        }
        
        if (data['@type'] === 'Article') {
            if (!data.headline) errors.push('Article must have a headline');
            if (!data.author) errors.push('Article should have an author');
        }
        
        return {
            valid: errors.length === 0,
            errors: errors
        };
        
    } catch (e) {
        return {
            valid: false,
            errors: ['Invalid JSON format: ' + e.message]
        };
    }
}

// Usage example
const testData = `{
    "@context": "https://schema.org",
    "@type": "Product",
    "name": "Test Product"
}`;

const result = validateJSONLD(testData);
console.log('Validation result:', result);

Advanced Structured Data Patterns

Breadcrumb Navigation



html

<nav aria-label="Breadcrumb">
    <ol itemscope itemtype="https://schema.org/BreadcrumbList">
        <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
            <a itemprop="item" href="/">
                <span itemprop="name">Home</span>
            </a>
            <meta itemprop="position" content="1">
        </li>
        <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
            <a itemprop="item" href="/products">
                <span itemprop="name">Products</span>
            </a>
            <meta itemprop="position" content="2">
        </li>
        <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
            <span itemprop="name">Headphones</span>
            <meta itemprop="position" content="3">
        </li>
    </ol>
</nav>

<!-- JSON-LD equivalent -->
<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "itemListElement": [
        {
            "@type": "ListItem",
            "position": 1,
            "name": "Home",
            "item": "https://example.com/"
        },
        {
            "@type": "ListItem",
            "position": 2,
            "name": "Products", 
            "item": "https://example.com/products"
        },
        {
            "@type": "ListItem",
            "position": 3,
            "name": "Headphones"
        }
    ]
}
</script>

Video Content



html

<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "VideoObject",
    "name": "How to Build a Website",
    "description": "Complete tutorial on building a modern website from scratch using HTML, CSS, and JavaScript.",
    "thumbnailUrl": "https://example.com/video-thumbnail.jpg",
    "uploadDate": "2024-01-15T08:00:00Z",
    "duration": "PT15M30S",
    "contentUrl": "https://example.com/videos/website-tutorial.mp4",
    "embedUrl": "https://example.com/embed/website-tutorial",
    "author": {
        "@type": "Person",
        "name": "Web Developer Pro"
    },
    "publisher": {
        "@type": "Organization",
        "name": "Learn Web Dev",
        "logo": {
            "@type": "ImageObject",
            "url": "https://example.com/logo.png"
        }
    }
}
</script>

Common Mistakes and Best Practices

Don't Do This



html

<!-- Incorrect: Missing required properties -->
<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "Product",
    "description": "Great product!"
}
</script>

<!-- Incorrect: Wrong data types -->
<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "Product", 
    "name": "Product Name",
    "offers": {
        "@type": "Offer",
        "price": "$99.99",
        "priceCurrency": "USD"
    }
}
</script>

Do This Instead



html

<!-- Correct: All required properties included -->
<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "Product",
    "name": "Awesome Product",
    "description": "Great product with amazing features!",
    "offers": {
        "@type": "Offer",
        "price": "99.99",
        "priceCurrency": "USD",
        "availability": "https://schema.org/InStock"
    }
}
</script>

Best Practices Checklist

  1. Use JSON-LD when possible (cleaner, easier to maintain)
  2. Include required properties for each schema type
  3. Use correct data types (numbers as numbers, not strings)
  4. Test regularly with Google's Rich Results Test
  5. Be specific - use the most specific schema type available
  6. Keep data accurate - match what's visible on the page
  7. Use structured data consistently across your site

Dynamic Structured Data with JavaScript



html

<script>
// Generate structured data dynamically
function generateProductSchema(product) {
    const schema = {
        "@context": "https://schema.org",
        "@type": "Product",
        "name": product.name,
        "description": product.description,
        "image": product.images,
        "brand": {
            "@type": "Brand",
            "name": product.brand
        },
        "offers": {
            "@type": "Offer",
            "price": product.price.toString(),
            "priceCurrency": product.currency,
            "availability": product.inStock ? 
                "https://schema.org/InStock" : 
                "https://schema.org/OutOfStock"
        }
    };
    
    // Add aggregateRating if reviews exist
    if (product.reviews && product.reviews.length > 0) {
        const totalRating = product.reviews.reduce((sum, review) => sum + review.rating, 0);
        schema.aggregateRating = {
            "@type": "AggregateRating",
            "ratingValue": (totalRating / product.reviews.length).toFixed(1),
            "reviewCount": product.reviews.length
        };
    }
    
    return schema;
}

// Insert structured data into page
function addStructuredData(schema) {
    const script = document.createElement('script');
    script.type = 'application/ld+json';
    script.textContent = JSON.stringify(schema, null, 2);
    document.head.appendChild(script);
}

// Usage example
const productData = {
    name: "Wireless Mouse",
    description: "Ergonomic wireless mouse with precision tracking",
    brand: "TechGear",
    price: 49.99,
    currency: "USD",
    inStock: true,
    images: ["https://example.com/mouse1.jpg"],
    reviews: [
        { rating: 5, text: "Great mouse!" },
        { rating: 4, text: "Good value for money" }
    ]
};

const productSchema = generateProductSchema(productData);
addStructuredData(productSchema);
</script>