A product schema guide starts with one uncomfortable truth: without structured data on your product pages, Google sees the same plain blue link that it saw in 2005. Add the right JSON-LD block and those same pages can display your price, star rating, stock status, shipping cost, and return window directly in the search result — before a shopper clicks anything. For South African stores competing against Takealot and international brands in SEO in South Africa, that visibility difference is often the margin between winning the click and being scrolled past.

South Africa's online retail market is projected to reach R159 billion in 2026, growing at 22.5% — nearly six times faster than the broader retail sector (World Wide Worx, 2026). More product searches are happening, more buyers are comparing prices before they click, and the stores that show enriched results — price, rating, delivery badge — consistently win that comparison. Schema markup is the mechanism that makes those enriched results possible.

Yet research across 180 ecommerce sites found that roughly 15–30% of websites carry invalid or erroneous schema despite ranking on page one, meaning they are leaving rich result eligibility on the table.

This product schema guide walks through every property your markup needs, a production-ready JSON-LD example with South African currency and shipping fields, platform-specific implementation notes for WooCommerce and Shopify, and how to validate your markup so Google actually uses it.

Quick Answer

A product schema guide covers the JSON-LD structured data you add to product pages so Google can show your price, rating, availability, and shipping in search results as rich snippets. The required fields are name, image, and an offers block with price, priceCurrency (use ZAR for South African Rand), and availability. For full merchant listing eligibility in 2026, you also need shippingDetails, hasMerchantReturnPolicy, and either an aggregateRating or review block. Validate with Google's Rich Results Test before publishing.

Is Your Product Schema Passing Google's Rich Results Test?

Share your product URL and we'll run a free structured data check, showing you exactly which properties are missing and how to fix them.

Get a Free Schema Check

Product Schema Guide: Which Google Rich Results Does It Unlock?

Product structured data tells Google what type of content a page contains so it can build richer, more informative search results beyond a plain title and description. Google's official product structured data documentation identifies four distinct result types that well-formed product schema can generate.

Rich Result TypeWhat It ShowsRequires
Product snippetPrice, rating, availability under the page titlename + offers + (review or aggregateRating)
Popular productsVisual product grid with image and priceMerchant listing markup + GTIN
Shopping knowledge panelFull product card with seller list and specsComplete merchant listing markup
Google Images annotationPrice badge overlaid on product imageMerchant listing markup

Google separates product markup into two tracks. Product snippets work for editorial or review pages where a product is described but not sold directly from that URL. Merchant listings apply to pages where the product is actually purchasable, and they unlock the full set of features including shipping cost badges and return policy indicators. If you run a Shopify or WooCommerce store, you almost certainly want merchant listing markup.

One important qualifier: Google shows rich enhancements at its own discretion and they can change over time. The markup creates eligibility — it does not guarantee display. A clean, accurate, complete markup block is how you maximise the chance that Google shows the enhanced result on your product queries.

Key Takeaway: Two Schema Tracks

Editorial review sites need product snippets markup. Ecommerce stores selling directly from their own pages need merchant listing markup — which is a superset that also qualifies pages for product snippets. If you're implementing schema for a South African online store, start with the merchant listing specification.

Markup Properties: Required, Recommended, and Effectively Required

Every valid product schema block starts with the same core, then layers in properties that unlock specific rich result features. Here is how the property hierarchy works in practice.

PropertyStatusWhat It Unlocks
nameRequiredProduct name in rich result
imageRequiredProduct image in rich result and Google Images
offers.priceRequiredPrice display in snippet
offers.priceCurrencyRequiredCurrency display (use ZAR for South Africa)
offers.availabilityRequiredIn Stock / Out of Stock indicator
aggregateRatingStrongly recommendedStar ratings in snippet
brandStrongly recommendedBrand display in Shopping results
sku / gtin13Strongly recommendedGoogle Shopping integration and popular products
shippingDetailsEffectively required (2026)Free shipping badge; merchant listing eligibility
hasMerchantReturnPolicyEffectively required (2026)Return policy indicator; merchant listing eligibility
priceValidUntilRecommended for promotionsPrice validity period; required for promotional pricing

The "effectively required" label for shippingDetails and hasMerchantReturnPolicy reflects a real shift in 2025–2026: Google made these properties the gate for merchant listing rich results on most retail queries. They remain officially labelled "recommended" in the documentation, but pages without them are frequently excluded from the Shopping tab and price snippet features.

GTIN — Does Your Product Have One?

For products manufactured by third parties (branded goods), the GTIN (barcode number, typically 13 digits on SA products) is how Google matches your listing to its product knowledge base. For products you manufacture yourself, use your SKU and ensure the brand field points to your own brand entity. Resellers without GTIN rarely appear in the popular products carousel.

A Complete Product Schema JSON-LD Example for SA Stores

JSON-LD is Google's preferred format for structured data. It sits inside a <script type="application/ld+json"> tag in your page's <head> or <body> and does not touch your visible HTML — which makes it the easiest format to maintain and update. Here is a complete, production-ready block with South African currency and shipping fields already configured.

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Your Product Name",
  "image": [
    "https://yourstore.co.za/images/product-main.jpg",
    "https://yourstore.co.za/images/product-side.jpg"
  ],
  "description": "Clear, accurate product description matching page copy.",
  "brand": {
    "@type": "Brand",
    "name": "Your Brand Name"
  },
  "sku": "SKU-12345",
  "gtin13": "6001234567890",
  "offers": {
    "@type": "Offer",
    "url": "https://yourstore.co.za/products/your-product",
    "priceCurrency": "ZAR",
    "price": "499.00",
    "priceValidUntil": "2026-12-31",
    "availability": "https://schema.org/InStock",
    "shippingDetails": {
      "@type": "OfferShippingDetails",
      "shippingRate": {
        "@type": "MonetaryAmount",
        "value": "0",
        "currency": "ZAR"
      },
      "shippingDestination": {
        "@type": "DefinedRegion",
        "addressCountry": "ZA"
      }
    },
    "hasMerchantReturnPolicy": {
      "@type": "MerchantReturnPolicy",
      "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
      "merchantReturnDays": "30",
      "returnMethod": "https://schema.org/ReturnByMail",
      "returnFees": "https://schema.org/FreeReturn"
    }
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.7",
    "reviewCount": "38",
    "bestRating": "5",
    "worstRating": "1"
  }
}

A few SA-specific notes on this block:

  • priceCurrency: "ZAR" — always use the ISO 4217 code, not the symbol. Display the price with the R symbol in your visible HTML; always write ZAR in the schema markup.
  • addressCountry: "ZA" — the ISO 3166-1 alpha-2 code for South Africa. If you ship to multiple countries (e.g., Namibia, Botswana), add additional DefinedRegion entries.
  • gtin13 — South African retail barcodes are typically 13 digits. If your product uses a different format, use gtin as a generic property.
  • priceValidUntil — update this whenever prices change. A past expiry date causes a validation warning and may lose snippet eligibility.

Keep the Schema in Sync with the Page

Your structured data must match what's actually displayed on the page — if your schema says InStock and your page shows "Sold Out", Google can demote or remove your rich result. For Shopify stores, bind Liquid variables to live product data. For WooCommerce, use a schema plugin that pulls dynamically from the product database rather than hardcoding values.

Platform Implementation: What WooCommerce and Shopify Defaults Miss

Both major SA ecommerce platforms generate some product schema out of the box — but neither generates a complete merchant listing block without additional configuration. Knowing the gaps saves you from the false comfort of "we already have schema".

WooCommerce Default Output

WooCommerce Core generates basic JSON-LD with name, description, image, price, and availability. What it typically misses: brand, gtin, priceValidUntil, shippingDetails, and hasMerchantReturnPolicy. That is enough to block merchant listing eligibility in 2026.

WooCommerce With a Schema Plugin

Yoast SEO Premium and Rank Math (free) both extend WooCommerce schema automatically. Rank Math in particular maps GTIN and SKU fields if populated, adds aggregateRating from WooCommerce reviews, and supports the brand field. You still need to manually configure shippingDetails for each shipping zone — no plugin does this automatically for SA-specific zones.

Shopify Default Theme Output

Dawn and most free Shopify themes output name, description, price, availability, image, brand, and sku from your product data. They consistently miss shippingDetails, hasMerchantReturnPolicy, aggregateRating (from actual reviews), and priceValidUntil.

Shopify With a Custom JSON-LD App or Theme Edit

Adding a Liquid-driven JSON-LD block to your theme's product.json template — or using a dedicated schema app — lets you bind shippingDetails to your actual shipping rates and hasMerchantReturnPolicy to your returns policy settings. Make sure every variable pulls live data: hardcoded prices in Shopify JSON-LD are a common source of schema drift after sales end.

If your store is on the ecommerce SEO South Africa journey and you have not audited your platform's default schema output, start there. In many cases, the fastest win is a 30-minute plugin configuration, not a custom development project.

ShippingDetails and hasMerchantReturnPolicy: The 2026 Additions

These two properties shifted from "nice to have" to "effectively required" for merchant listing eligibility as Google expanded its shopping features. Here is what each block needs.

shippingDetails must include a shippingRate (with value and currency) and a shippingDestination (with addressCountry). If you offer free shipping, set value to 0. If you use carriers like The Courier Guy or Aramex and charge by weight or zone, you can define multiple OfferShippingDetails entries. Adding deliveryTime with handlingTime and transitTime improves your merchant listing completeness further and can display delivery timeframe estimates in results — useful for SA buyers who want to know whether an order arrives before the weekend. If your store needs schema set up alongside wider product page work, our ecommerce SEO service starts with a free audit and runs on a flat monthly retainer agreed upfront.

hasMerchantReturnPolicy needs at minimum a returnPolicyCategory and merchantReturnDays. The Consumer Protection Act gives South African consumers defined return rights, and stating a 30-day return window in your schema — if that genuinely matches your policy — signals buyer-friendly terms in a way that can improve click-through rates among price-comparing shoppers.

ShippingDetails for Multiple Regions

If you ship within South Africa and to SADC neighbours, define a separate OfferShippingDetails block for each addressCountry (ZA, NA, BW, ZW, etc.). For Google Merchant Center integration, the shipping details in your schema should match what is configured in your Merchant Center account — mismatches trigger warnings.

Are Your Shipping and Return Policy Fields Set Up Correctly?

Send us your product page URL and we'll audit your structured data — including the 2026 merchant listing fields — and show you exactly what Google is missing from your markup.

Request a Schema Audit

How to Validate Your Product Schema

Writing the markup is step one. Confirming Google can read and use it is step two — and they are not the same thing.

Google provides two separate validation tools that check different things:

  • Rich Results Test (search.google.com/test/rich-results) — checks whether your markup is eligible for specific rich result types. Use this to confirm product snippet or merchant listing eligibility. It will flag required fields that are missing and warn about recommended fields absent from the markup.
  • Schema Markup Validator (validator.schema.org) — checks general Schema.org validity, regardless of Google's specific requirements. Use this to catch syntax errors, wrong property names, or incorrect nesting that the Rich Results Test might not flag.

Run both tools on at least three representative product pages: a bestseller, a recently discounted product, and one that is temporarily out of stock. The out-of-stock page is the most common source of schema drift — where your markup still says InStock after a product sells out, because your template is not dynamically binding the availability field.

Once live, monitor your structured data performance in Google Search Console under Enhancements → Products. Search Console will flag pages that lose eligibility over time, usually because prices expired, stock changed, or a template edit broke the JSON structure.

For broader schema markup in South Africa beyond product pages — including FAQ schema and local business schema — the same two-tool validation approach applies. An improved crawlability baseline also helps Google discover and index your structured data faster after you publish changes.

Why SA Ecommerce Stores Lose Clicks Without Product Schema

South Africa's online retail growth — from under 1% of retail turnover a decade ago to roughly 10% in 2026 — means more product searches than ever, but also more competition for every one of them. Takealot, Makro, and Checkers Sixty60 all have comprehensive product schema with aggregateRating, GTIN, and shippingDetails. Every SA-based independent store that does not match that markup level is competing as a plain blue link against a full product card.

Research across 180 ecommerce websites found that 57.5% of top-ranking pages have implemented some form of schema markup. But "some form" is not the same as "complete merchant listing markup" — only the complete version unlocks the full set of rich results. Every property covered in this product schema guide exists for a specific reason: to unlock one more feature that competitors without complete markup cannot display.

The gap between a basic name/price block and a full merchant listing with shipping and returns is the difference between eligibility for two or three result types and eligibility for all four.

For South African stores, there is also an AI search dimension. Google's AI Overviews and Gemini increasingly surface product information directly in the results, drawing from structured data to identify your price, brand, and availability as citable sources. The structured data for AI search use case reinforces the same implementation priorities — complete, accurate, dynamically maintained markup.

The Schema Floor Has Risen

In 2020, any product schema was a differentiator. By 2026, major South African retailers and international competitors have comprehensive markup, and a minimal name/price block is no longer enough to win merchant listing features. The practical floor for a SA ecommerce store is: name, image, offers (ZAR, ZA, InStock/OutOfStock), brand, GTIN or SKU, aggregateRating, shippingDetails, and hasMerchantReturnPolicy.

Why South African Businesses Choose Growth Pulse Media

Dirk founded Growth Pulse Media after building and scaling a South African ecommerce business — which means the schema implementation advice here comes from having shipped parcels through The Courier Guy, handled Ozow and PayFast payment gateway configurations, and watched product pages move from invisible blue links to featured price snippets. That operator experience shapes how we approach technical SEO in South Africa: not as a checklist, but as a business outcome.

We work with a deliberately limited number of South African clients so that every schema implementation — including binding dynamic WooCommerce or Shopify variables to live product data, configuring multi-region shipping markup, and maintaining priceValidUntil dates as promotions roll over — gets senior attention, not a junior handoff. The platforms we work with daily include WooCommerce, Shopify, Rank Math, Yoast SEO, and Google Search Console's Products report. We do not template product schema and move on; we audit it quarterly as product catalogues change.

Who This Is NOT For

Product schema implementation is not the right priority for every business. Four situations where this guide does not apply:

Pure Service Businesses

Product schema is for pages that represent a physical or digital product with a price. If your business sells consulting, legal advice, or home services, the local business schema guide is the relevant starting point — and FAQ schema for your service pages will move the needle more than Product markup.

Businesses Selling Exclusively Through Takealot or Another Marketplace

If your product pages live on Takealot, Makro, or another marketplace rather than your own domain, you do not control the schema on those product pages. The marketplace handles it. Product schema on your own site only helps pages on your domain — and if you have no own-domain product pages, there is nothing to mark up.

Stores That Cannot Maintain Schema Accuracy

Stale or inaccurate schema is penalised. If your store has hundreds of SKUs with prices that change daily and no mechanism to generate schema dynamically from your product database, publishing a static JSON-LD block creates a maintenance liability. Address the dynamic generation problem first, or limit schema to your top 20 bestsellers where you can maintain accuracy manually.

Businesses Expecting Immediate Ranking Improvements

Product schema affects how your existing rankings appear in search results — it does not directly improve your ranking position. If your product pages do not yet rank for their target queries, schema will not fix that. Sort out your website indexation and on-page optimisation first; schema enriches the click-through, not the position.

Ready to Implement Product Schema for Your SA Store?

We set up and maintain JSON-LD product markup for South African ecommerce stores, keeping it dynamically synced with live pricing, stock, and shipping data. No obligation — we'll get back to you within 24 hours.

Talk to the Team

Frequently Asked Questions About Product Schema

What is the minimum product schema markup needed for a rich result?

Google requires name, image, and an offers block containing price, priceCurrency, and availability for a product snippet. For merchant listing features (Shopping tab, popular products, price badge), you also need shippingDetails and hasMerchantReturnPolicy. Adding aggregateRating is strongly recommended — results without star ratings typically see lower click-through rates on product queries.

Does product schema markup directly improve my Google ranking?

No — product schema does not change your ranking position. It changes how your existing rankings appear by adding price, rating, and availability information directly in the search result. This can significantly affect click-through rates because buyers who are ready to purchase often click the result that shows them the information they need before they even visit the page.

How do I handle product schema when a product goes out of stock?

Update availability from https://schema.org/InStock to https://schema.org/OutOfStock as soon as the product sells out. Markup that says InStock while the page shows Sold Out is what practitioners call schema drift — Google's structured data quality guidelines require markup to accurately represent visible page content, and practitioners consistently report that drift is associated with reduced rich result eligibility. Dynamic schema generation — pulling availability status directly from your product database — is the reliable solution for stores with inventory that moves quickly.

Can I use the same product schema guide for product variant pages?

For variants (different sizes, colours, materials), Google recommends using the ProductGroup type at the parent level with a variesBy property (such as colour or size) and individual Product entries under hasVariant. Each variant needs its own unique identifier, image, price, and availability. For stores where each variant has its own URL, this is especially important because it allows Google to surface the specific variant a shopper is searching for.

How long does it take for Google to show rich results after I add product schema?

Google typically discovers and processes new structured data within a few days to a few weeks, depending on how frequently it crawls your site. Use the Rich Results Test immediately after publishing to confirm your markup is valid — this confirms eligibility even before Google has recrawled. Search Console's Products report then shows processing status once Google has indexed the changes. There is no fixed timeline, and eligibility does not guarantee display on every query.

Do I need a separate product schema for each product page, or can one block cover the whole site?

Each product page needs its own schema block with that page's specific price, availability, image, SKU, and rating data. A single site-wide block with static data cannot represent hundreds of different products accurately. For ecommerce sites at scale, schema generation should be automated: WooCommerce and Shopify can output page-specific JSON-LD from templates that pull live product data, ensuring every page has accurate, current markup without manual maintenance.

Get Your Product Schema Implemented Correctly

We build and maintain product schema markup for South African ecommerce stores — WooCommerce, Shopify, and custom platforms. Our implementation covers the full merchant listing specification: ZAR pricing, ZA shipping zones, return policy, GTIN mapping, and aggregateRating from live review data. We validate against the Rich Results Test before go-live and monitor Search Console's Products report for drift. No obligation — we'll get back to you within 24 hours.

Request a Schema Implementation Quote
Dirk van Greuning — Founder, Growth Pulse Media
Dirk van Greuning Founder, Growth Pulse Media

Founder of Growth Pulse Media and a specialist in South African search dominance. Dirk translates his experience in scaling South African businesses into high-velocity digital strategies for B2B and retail leaders. He writes about SEO, lead generation, and paid media from an operator's perspective — prioritising pipeline value over impressions.

Connect on LinkedIn