Google's July 2026 Product.category update: fix your merchant listing schema
The new category property and sale-duration rules, with JSON-LD you can copy today
On July 7, 2026, Google updated its merchant listing structured data documentation with two changes that already affect which product pages win rich results: the new Product.category property, and a dedicated "Sale duration" section that tightens how validFrom, validThrough and priceValidUntil are allowed to appear together. If your Product schema still looks like it did in 2024, Google can quietly drop the listing — the docs now warn that a listing may not display when priceValidUntil indicates a past date. This guide walks through the exact JSON-LD you need to add, with a Shopify and a WooCommerce example, and a checklist you can run before pushing a template change.
Both updates were logged the same day on Google's Search Central changelog as "Added category to merchant listing structured data" and "Clarified sale price effective dates". Reading them together tells you two things: Google now wants a typed product category inside the markup (not only in the Merchant Center feed), and it is enforcing that promotional prices only show up when the dates still make sense.
What changed in the merchant listing schema on July 7, 2026
Google added support for Product.category as a merchant listing property. The property accepts either plain Text (your own category label) or a CategoryCode object that points at the Google Product Taxonomy — the same taxonomy Merchant Center uses under google_product_category. You can also pass an array that mixes both, which is what Google recommends for pages that want to signal both the shop's internal taxonomy and Google's canonical one.
The second update added a new "Sale duration" section to the merchant listing docs. It splits sale timing across two nodes:
- On the
Offernode: usepriceValidUntilto say when the current price stops being valid.validFromcan go here too, as a start date. - On a
PriceSpecificationnode: usevalidFromandvalidThrough.priceValidUntildoes not apply here.
Google's own wording is to use either validThrough or priceValidUntil for the end — never both on the same node. And the warning that matters: a listing may not display if priceValidUntil indicates a past date. That rule was in Google's thinking before, but writing it into the docs means Rich Results Test, Merchant Center and Search Console will all treat an expired sale price as a disqualifier instead of a soft hint.
The exact JSON-LD to copy, with the Dresses example
Here's the category block Google uses in its own documentation. The Google Product Category ID for Dresses is 2271. If you look it up in the Google Product Taxonomy, that corresponds to Apparel & Accessories > Clothing > Dresses.
"category": [
{
"@type": "CategoryCode",
"inCodeSet": "https://www.google.com/basepages/producttype/taxonomy-with-ids.en-US.txt",
"codeValue": "2271"
},
"Summer dresses"
]
Two notes about shaping this correctly: the codeValue can be the numeric ID (preferred) or the full path with > as the separator; and the plain string entry — "Summer dresses" above — is where your own taxonomy goes. If your product listing templates already output a breadcrumb, that breadcrumb's last node is usually a safe value for this slot.
For a sale, the Offer looks like this:
"offers": {
"@type": "Offer",
"url": "https://example.com/products/linen-dress",
"priceCurrency": "USD",
"price": "49.00",
"priceValidUntil": "2026-11-15T23:59:00-05:00",
"availability": "https://schema.org/InStock"
}
If you prefer the newer pattern with a priceSpecification node — which is what Google recommends when you need to encode both a sale and a strikethrough — use validFrom and validThrough, not priceValidUntil:
"offers": {
"@type": "Offer",
"priceSpecification": {
"@type": "UnitPriceSpecification",
"price": "49.00",
"priceCurrency": "USD",
"validFrom": "2026-10-20T00:00:00-05:00",
"validThrough": "2026-11-15T23:59:00-05:00"
}
}
Which product pages lose rich results if you ignore this
Google is explicit on priceValidUntil in the past: the listing may not display. Three concrete scenarios where this bites small ecommerce sites today:
- Last year's sale is still in the markup. Many WooCommerce stores set a
priceValidUntilduring Black Friday 2025 and never cleared it. The regular price now has an expiredpriceValidUntilattached, which disqualifies the listing even though the product is in stock at full price. - Shopify theme hardcodes
priceValidUntilone year ahead. Shopify's Dawn theme used to emitpriceValidUntilset to one year from the render date on every product page — a trick to avoid the "past date" warning. Google treats a far-future placeholder as technically valid but Merchant Center documentation now recommends removing it unless there is an actual promotion. - Both
validThroughandpriceValidUntilon the same node. Rich Results Test will warn, and the merchant listing enhancement will not render.
How to update your Product schema in each platform
Shopify
If you use the default theme JSON-LD, you can either keep letting the theme emit Product markup and inject the two new fields through a theme snippet, or move to a Merchant Listing app. The relevant file in Dawn is snippets/product-structured-data.liquid (or the equivalent in your theme). Add the category array using the product's Google product category metafield if you have one, and remove the hardcoded far-future priceValidUntil on products that are not on sale. If a Shopify discount is active, emit priceValidUntil only on the sale offer and let it match the discount's end date.
WooCommerce
If you rely on Yoast WooCommerce SEO or Rank Math WooCommerce, both plugins now expose a Google product category field on the product edit screen that writes to category as a CategoryCode. For legacy stores still outputting schema from a custom hook, bind to woocommerce_structured_data_product and append the category array. Audit priceValidUntil values across every active product — a one-time SQL query against wp_postmeta for keys that mention "sale_price_dates_to" will surface expired windows.
Custom builds
If you render JSON-LD server-side, keep two template variables: a categoryCode for the GPC ID (populated from a product-to-GPC lookup table) and a categoryLabel for your internal taxonomy. For sale periods, emit the dates with timezone offsets. Google parses ISO 8601, and local-time ambiguity around midnight sales is a common cause of listings dropping overnight.
A quick table of what maps where
| Schema field | Where it lives | Merchant Center equivalent |
|---|---|---|
Product.category (CategoryCode) | Product node | google_product_category |
Product.category (Text) | Product node | product_type |
priceValidUntil | Offer node | Sale end date on promotion |
validFrom / validThrough | PriceSpecification node | Sale start / end on promotion |
Related guides on Clariola
For context on where this fits in the bigger structured-data picture, our pillar on schema markup for AI search in 2026 covers which entity types matter most for AI Overviews. If you're on WordPress, our Yoast vs. Rank Math breakdown walks through which plugin writes which fields. For a wider ecommerce angle, our product page optimization guide covers the UX side that pairs with these schema wins. If you also want the Spanish version of this article, see our guía sobre Product.category y duración de ofertas.
When you need an audit
If any of the following signals apply, run a Clariola audit before you touch another product template:
- Your Shopify or WooCommerce store had sale rich results in Search Console a year ago, and those impressions dropped in the last 90 days.
- Rich Results Test shows "Either validThrough or priceValidUntil, but not both" warnings on half your products.
- You migrated themes in 2025 and nobody re-tested the Product schema afterwards.
- Your category breadcrumbs show in the SERP but your Product rich snippets stopped showing.
Clariola's $9.99 audit crawls the raw HTML your product templates render (no JavaScript assumptions), lists every schema type found per page, flags fields Google retired with the date, and compares what you emit against the merchant listing docs as of this quarter. You get a prioritized PDF action plan by email with the exact fields to add, keep or remove per template — run a $9.99 audit on your ecommerce site.
Frequently asked questions
Do I need a Google Product Category ID on every product?
No. Google treats Product.category as optional. But when a merchant listing wins the Shopping or Popular Products carousel, Google uses the GPC to decide which carousel to put you in. If you sell across many taxonomies, adding a CategoryCode is the fastest way to influence that match.
Can I keep priceValidUntil on the Offer and validThrough on a PriceSpecification at the same time?
Yes, as long as they are on different nodes. The rule is "either/or" per node, not across the Product. The common mistake is adding both to the same Offer, which Rich Results Test flags as a warning.
What if my products never go on sale?
Then you can skip priceValidUntil, validFrom and validThrough entirely. Only emit them when there is an actual promotion. A hardcoded far-future date is Google-tolerated but adds noise and makes Merchant Center diagnostics harder.
Does this apply to services and SaaS pricing?
The merchant listing enhancements apply to physical and digital goods tracked as Product. For SaaS pricing, the recommended entity is SoftwareApplication or Service, which have their own offer structure.
Keep reading
- technical seo7 min read
Schema Markup in Webflow: Native Field, CMS Templates and Traps
Webflow now has a native Schema markup field. How to use it on static pages and CMS templates, which Collection fields it can bind, how to avoid duplicate blocks, and why FAQ schema no longer pays off in Google.
- technical seo7 min read
Does Your Small Business Need an llms.txt File in 2026?
No major AI company officially reads llms.txt, and a 300,000-domain study found no link between the file and AI citations. Still, it takes minutes to add and carries no risk. A practical framework for deciding whether your small business needs an llms.txt file in 2026 — and what matters more.
- technical seo8 min read
Schema Markup for AI Search: The Best Schema Types for Small Businesses in 2026
Google says AI Overviews and AI Mode need no special schema. The best schema for AI search is accurate Organization, LocalBusiness, Article and Product markup in your raw HTML. Here is what to use for your business and how to add it.
