Skip to content
← All articles
8 min read

Product schema and UZS prices: earning a rich snippet

Structured data does not lift rankings directly. It changes how your listing looks, and that affects click-through more than a couple of positions would.

Format and placement

Use JSON-LD in a script tag of type application/ld+json — Google's recommended format, decoupled from markup and resilient to redesigns. Attribute-based microformats only complicate maintenance today.

The markup must appear in server-rendered HTML. JSON-LD injected after hydration goes unseen by some crawlers; in Next.js, emit it from the page's server component.

A product page carries one Product object. A category page carries an ItemList linking to products, not twenty full Product objects in a row — that reads as excessive and yields no snippets.

Required and useful Product fields

Minimum: name, image with an absolute URL, description, sku and a nested offers object. Optionally brand, mpn, gtin for internationally coded goods, and aggregateRating when genuine reviews appear on the page.

Inside offers: priceCurrency set to UZS, price as a bare number without separators or currency symbols, availability as InStock, OutOfStock or PreOrder, and url pointing to the same product page.

Use priceValidUntil when the price is promotional and time-limited. For frequently repriced goods, update the markup price alongside the visible price rather than setting a distant date.

Specifics of pricing in UZS

Declare the currency by ISO 4217 code — UZS, not 'sum' or 'soʻm'. Write the price as 12500000 without separators: thousands separators are for humans in the layout, the markup wants a number.

UZS amounts are long and easy to get wrong by an order of magnitude during generation. Build markup from the same source as the displayed price; a mismatch between markup and page price counts as a violation.

For products sold in a range, use AggregateOffer with lowPrice, highPrice, priceCurrency and offerCount. It is more honest than publishing the minimum as the only price and survives review.

Reviews, ratings and common violations

AggregateRating is allowed only when reviews are genuinely visible on that page and relate to that product. Rating markup without displayed reviews is a direct violation that removes rich results.

You cannot mark company reviews as product reviews, nor import ratings from a marketplace listing. This is the most frequent cause of manual structured-data actions.

Duplicate Product objects on one page, marking unavailable items as InStock, and prices without a currency are three errors present in roughly every other catalogue.

What else is worth marking up

BreadcrumbList on every nested page is the cheapest snippet improvement: a path in the results instead of a bare URL makes the listing legible.

FAQPage where a real Q&A block exists, Organization on the homepage with phone, address and profile links, and LocalBusiness where there is a physical location in Tashkent or the regions.

Multilingual sites must localise their markup: name and description in the page's language, and inLanguage set to ru or uz. Identical Russian markup on an Uzbek page signals a content mismatch.

Validation and maintenance

Validate with the Schema.org validator and Google's Rich Results Test, and track site-wide health in the Search Console enhancements section, which shows error trends by type.

Add an automated test: a product page must contain valid JSON-LD whose price matches the displayed one. Markup breaks silently on template changes and otherwise surfaces months later.

Rich snippets are neither immediate nor guaranteed — Google decides. Expect anywhere from a couple of weeks to six weeks after recrawl, and the only accelerant is requesting reindexing.

Need a website or ads? Let’s discuss your project.