Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change the domain and range of isVariantOf to Product #1797

Open
jvandriel opened this issue Nov 14, 2017 · 59 comments
Open

Change the domain and range of isVariantOf to Product #1797

jvandriel opened this issue Nov 14, 2017 · 59 comments
Assignees

Comments

@jvandriel
Copy link

jvandriel commented Nov 14, 2017

(edit by @danbri June 2020; see also: #2587)

One of the things I keep running into over and over again is that there currently is no way to express a 'variant' relation between products without the use of ProductModel. Which IMO is an serious issue as there are far more products out there of which publishers don't have info about / a resource for the ProductModel than there are publishers that do have such info.

For example, cell phone cases - a type of product that often is available in several colors yet for which, more often than not, doesn't exist a resource containing product model information, eg:

4 variants (color) of the same product of which the ProductModel.name is 'Evo Check' according to their own structured data, but that's all the info there is.

Currently such products can only be sort-of chained together by using either the isSimilarTo or isRelatedTo properties, which IMHO, don't express the correct relation (and sameAs doesn't do it for me either).

And so I suggest we change the domain and range of isVariantOf from ProductModel to Product.

Interesting note:
This topic became top of mind for me again when I was studying Google's Merchant Center documentation, which contains an example of an array of unchained products that implies a group of product variants on a single page (try adding a mainEntityOfPage to that example, which is important if there are also other top-level entities on a page, besides the product variants).

So the way I see it is that even Google isn't sure how to handle the relation between product variants and uses an array as a poor man's solution to come to some sort of implied semantics where explicit semantics are needed.

@jvandriel jvandriel changed the title Change the domain of isVariantOf to Product Change the domain and range of isVariantOf to Product Nov 15, 2017
@jvandriel
Copy link
Author

jvandriel commented Nov 15, 2017

What I'm hoping to achieve is that, when ProductModel info isn't available, publishers will be able to specify product variant relations as such in a:

Single page environment - base product

[
  {
    "@context":"http://schema.org",
    "@id":"#baseProduct",
    "@type":"Product",
    "name":"Evo Check Case for Galaxy S8 Rose Tint/White",
    "color":"Rose Tint/White",
    "sku":"T21-5664",
    "mainEntityOfPage":"https://www.tech21.com/en_us/evo-check-s8-rose-tint-white",
    "url":"https://www.tech21.com/en_us/evo-check-s8-rose-tint-white"
  },
  {
    "@type":"Product",
    "name":"Evo Check Case for Galaxy S8 Light Blue/White",
    "color":"Light Blue/White",
    "sku":"T21-5586",
    "isVariantOf":
    {
      "@id":"#baseProduct"
    }
  },
  {
    "@type":"Product",
    "name":"Evo Check Case for Galaxy S8 Clear/White",
    "color":"Clear/White",
    "sku":"T21-5584",
    "isVariantOf":
    {
      "@id":"#baseProduct"
    }
  },
  {
    "@type":"Product",
    "name":"Evo Check Case for Galaxy S8 Smokey/Black",
    "color":"Smokey/Black",
    "sku":"T21-5585",
    "isVariantOf":
    {
      "@id":"#baseProduct"
    }
  }
]

Multi page environment - base product

[
  {
    "@context":"http://schema.org",
    "@id":"#baseProduct",
    "@type":"Product",
    "name":"Evo Check Case for Galaxy S8 - Rose Tint/White",
    "color":"Rose Tint/White",
    "sku":"T21-5664",
    "mainEntityOfPage":"https://www.tech21.com/en_us/evo-check-s8-rose-tint-white",
    "url":"https://www.tech21.com/en_us/evo-check-s8-rose-tint-white"
  },
  {
    "@type":"Product",
    "url":"https://www.tech21.com/en_us/evo-check-s8-light-blue-white",
    "isVariantOf":
    {
      "@id":"#baseProduct"
    }
  },
  {
    "@type":"Product",
    "url":"https://www.tech21.com/en_us/evo-check-s8-clear-white",
    "isVariantOf":
    {
      "@id":"#baseProduct"
    }
  },
  {
    "@type":"Product",
    "url":"https://www.tech21.com/en_us/evo-check-s8-smokey-black",
    "isVariantOf":
    {
      "@id":"#baseProduct"
    }
  }
]

Multi page environment - product variant

{
  "@context":"http://schema.org",
  "@type":"Product",
  "name":"Evo Check Case for Galaxy S8 - Smokey/Black",
  "color":"Smokey/Black",
  "sku":"T21-5585",
  "mainEntityOfPage":"https://www.tech21.com/en_us/evo-check-s8-smokey-black",
  "url":"https://www.tech21.com/en_us/evo-check-s8-smokey-black",
  "isVariantOf":"https://www.tech21.com/en_us/evo-check-s8-rose-tint-white"
  }
}

@jvandriel
Copy link
Author

jvandriel commented Nov 15, 2017

And if we want to be helpful to publishers, in regards to ease of implementation, than we help them avoid the needed use of fragment identifiers, as shown in the examples above, by introducing an inverse property for isVariantOf, namely: hasVariant.

With the following description:

A pointer to a product variant from which this product is the base product. It is safe to infer that the variant inherits all product features from the base model, unless defined locally. This is not transitive.

Making the following possible for a:

Single page environment - base product

{
  "@context":"http://schema.org",
  "@type":"Product",
  "name":"Evo Check Case for Galaxy S8",
  "color":"Rose Tint/White",
  "sku":"T21-5664",
  "mainEntityOfPage":"https://www.tech21.com/en_us/evo-check-s8",
  "url":"https://www.tech21.com/en_us/evo-check-s8",
  "hasVariant":
  [
    {
      "@type":"Product",
      "name":"Evo Check Case for Galaxy S8 Light Blue/White",
      "color":"Light Blue/White",
      "sku":"T21-5586"
    },
    {
      "@type":"Product",
      "name":"Evo Check Case for Galaxy S8 Clear/White",
      "color":"Clear/White",
      "sku":"T21-5584"
    },
    {
      "@type":"Product",
      "name":"Evo Check Case for Galaxy S8 Smoey/Black",
      "color":"Smokey/Black",
      "sku":"T21-5585"
    }
  ]
}

Multi page environment - base product

{
  "@context":"http://schema.org",
  "@type":"Product",
  "name":"Evo Check Case for Galaxy S8 - Rose Tint/White",
  "color":"Rose Tint/White",
  "sku":"T21-5664",
  "mainEntityOfPage":"https://www.tech21.com/en_us/evo-check-s8-rose-tint-white",
  "url":"https://www.tech21.com/en_us/evo-check-s8-rose-tint-white",
  "hasVariant":
  [
    "https://www.tech21.com/en_us/evo-check-s8-light-blue-white",
    "https://www.tech21.com/en_us/evo-check-s8-clear-white",
    "https://www.tech21.com/en_us/evo-check-s8-smokey-black"
  ]
}

@jvandriel
Copy link
Author

jvandriel commented Nov 17, 2017

Done tinkering with the proposals and the code examples - feel free to shoot on 'm now

@vberkel
Copy link

vberkel commented Nov 24, 2017

I would like to propose a different way of solving this issue. Could we swap the rdfs:subClassOf hierarchy of Product and ProductModel?

As we have it today, the ProductModel is described as prototypical, as in something that is more abstract than the Product itself:

"A datasheet or vendor specification of a product (in the sense of a prototypical description)".

Yet, today's hierarchy goes from most abstract to concrete then back to abstract.
Thing > Product > ProductModel

In concrete terms, we can say today that all ProductModel data items are also implied to be a Product and a Thing. A Product conversely cannot be inferred to be a ProductModel even though all products are based on some conceptualization. I don't think it is correct that a prototype, abstract, template-able sort of thing is also through inheritance a kind of concrete thing.

If we flipped the hierarchy:
Thing > ProductModel > Product
We go from most abstract to concrete. A concrete, sellable product is also implied to based on some ProductModel (and Thing).

If we agree to the above, we might want to discuss which properties should be reassigned to a domain of ProductModel from Product. I would start with the assumption that all properties of Product get reassigned to ProductModel. This would solve @jvandriel issue of changing isVariantOf through inheritance.

I'm curious what @mfhepp would have to say about this.

@thadguidry
Copy link
Contributor

thadguidry commented Nov 24, 2017

@vberkel Its not ProductORModel ... its actually AProductModel
So the heirarchy is fine the way it is.
What needs to change is our current stupid confusing description. Which I never did agreed to. :) (but love ya @mfhepp ! )

The better description and what I alias in my apps is:
"A particular design or version of a Product."

@jvandriel
Copy link
Author

jvandriel commented Nov 27, 2017

Just to make sure I understand you correctly @thadguidry...

ProductModel = Product variant?

Cause if so, that's not how I understand ProductModel, and I'm pretty sure most publishers don't get it that way either, eg. the example I showed above refers to it as if it's a prototypical/abstract and all sites I checked on their use of ProductModel do so.

And if ProductModel = Product variant, than it might be an idea somebody talks to the major search engines as they sure don't treat it as if it's a "A particular design or version of a Product." given the fact none of 'm generate rich snippets for it (which only makes sense to me if it's an abstract).

@thadguidry
Copy link
Contributor

thadguidry commented Nov 27, 2017

@jvandriel ProductModel = model (which could be a variant of another model)

For clarity, scroll to the bottom and see the reversing properties
http://schema.org/ProductModel

In Good Relations and Schema.org...
Products can have Models.
Models can have variants. (another Model)

  • Product = iPhone (but sure, you can say a Product or you can say it is a Model with the text "Evo Check Case for Samsung 8", up to publishers)
    • ProductModel = iPhone 5
    • ProductModel = iPhone 6
    • ProductModel = iPhone 7
    • ProductModel = iPhone 6 S
      • isVariantOf = iPhone 6
      • predecessorOf = iPhone 7
      • successorOf = iPhone 5
  • IndividualProduct = iPhone 6 S
    • serialNumber = "IMEA # AA-BBBBBB-CCCCCC-D"
  • SomeProducts = iPhone 6
    • inventoryLevel = 2500

Some will argue that iPhone is ONLY a brand... well yeah, it "can be" a brand, but its not necessary to say ONLY. Its certainly allowable to say that iPhone can be a Product, and nothing in Good Relations or Schema.org prevents that. :) Thank goodness.

@jvandriel
Copy link
Author

jvandriel commented Nov 28, 2017

In Good Relations and Schema.org...
Products can have Models.
Models can have variants. (another Model)

Great, at least we're talking about the same thing. But for all intends and purposes, what I'm missing in this list is that products can have variants as well, eg:

  • ProductModel = iPhone 6s
    • @id = #iPhone6s
    • isVariantOf = iPhone 6
    • predecessorOf = iPhone 7
    • successorOf = iPhone 5
  • Product = iPhone 6s 4.7-inch 128 GB Silver
    • model = #iPhone6s
    • color = silver
    • memory = 128 GB
    • hasVariant = ???
    • isVariantOf = ???
  • Product = iPhone 6s 4.7-inch 32GB Gold
    • model = #iPhone6s
    • color = gold
    • memory = 32 GB
    • hasVariant = ???
    • isVariantOf = ???

Something I feel isSimilarTo & isRelatedTo don't cover as these can refer to completely different products (of a different brand) with similar properties as well - reason why I'd like to see the domain and range of isVariantOf be changed to Product as well as adding a reverse property (hasVariant).

Some will argue that iPhone is ONLY a brand... well yeah, it "can be" a brand, but its not necessary to say ONLY. Its certainly allowable to say that iPhone can be a Product, and nothing in Good Relations or Schema.org prevents that. :) Thank goodness.

Don't know if I agree with you on this one though. Reason being that it's not very often a ProductModel is up for sale - eg, Apple isn't very likely to sell it's iPhone 8 ProductModel though they do sell products. Heck, they even annotate their iPhone 8 as a Product as opposed to a ProductModel.

What's the rationale behind: "Its certainly allowable to say that iPhone can be a Product"? (after all, one buys a certain configuration of a product and not the ProductModel itself)

And at the same time, if a ProductModel could be considered a Product than why isn't this reflected by the major search engines by allowing them to generate 'rich snippets'* as well? To me this is an indication they see a substantial difference between the two types as well

* no, I don't want to get into a 'rich snippet' discussion over this, the example is just illustrative

@jvandriel
Copy link
Author

jvandriel commented Dec 22, 2017

@unor's answer to the question: "How to avoid repeating values that are the same for the differently sized products?" on StackExchange illustrates perfectly one of the issues I hope to resolve with this proposal - it would eliminate the need for repeating the same properties over and over again.

Something @mfhepp's publication about markup for product variants with different prices doesn't take into account either (plus it depends on the existence of offers).

@jaw111
Copy link
Contributor

jaw111 commented Apr 23, 2020

For the use cases I'm commonly dealing with (electronic components) I'd propose to tighten the definition of isVariantOf based around idea of form, fit and function, such that the (manufacturing) variants of a product model must have the same form, fit and function.

In that view the iPhone 6s is not a variant of the iPhone 6, but a separate model (perhaps in the same series or family).

However I can imagine consumer goods has it's own world view, same for other domains.

@danbri
Copy link
Contributor

danbri commented Jun 5, 2020

hi folks! As alluded to in #2587, @alex-jansen @rvguha and I have been discussing this with Google colleagues too. We think there is scope to clarify how to treat variants.- In line with @mfhepp in his old blog post (which seems offline but via archive.org) we would agree that the "abstract model of the product" (omitting /size, /color etc concrete details) is worth describing separately as a distinct entity. We think this can be done more explicitly with some modest tweaks, including a new (sub)type.

  • Although the idea is similar to /ProductModel data sheets, the "product model" construct addresses a slightly different situation (c.f. @jvandriel's point above, "there are far more products out there of which publishers don't have info about / a resource for the /ProductModel than there are publishers that do have such info.").
  • noting that @jvandriel and others have advocated to extend /isVariantOf so that it doesn't just relate /ProductModels to /ProductModels, but also relates specific product variants to general products that stand for a group of predictably-varying products.
  • and that @mfhepp's example markup instead uses an indirection through an Offer to implicitly link a general product to a specific one, i.e. a /Product ("The Hepp Smart Watch is a unique wristwatch.") would have /offers, one for each variant offered, such as "Hepp Smart Watch in Silver with 16 GB RAM", "Hepp Smart Watch in Gold with 64 GB RAM". This is fine when you have such offers to publish, but there seems be a shared desire to model the underlying product situation independently.
  • we see value in introducing a new type, analogous to /ProductModel, to more explicitly represent a group or cluster of varying products. We suggest /ProductCluster for this (or /ProductGroup). It could be used in the styles advocated by either @jvandriel or @mfhepp. This would make it easier for consuming applications to understand when a Product-description was intended as a general vs specific variant, rather than leaving it ambiguous (since sparse descriptions of the variants are otherwise indistinguishable from the general descriptions).
  • we also propose using /ProductCluster to describe common characteristics of the specific product variants in that group or cluster, as well as the nature of the variations (i.e. color, pattern etc.). We expect to propose a mechanism similar to that used in /StatisticalPopulation and /ProductModel for this, where properties applicable to the varying instances can be ascribed to the prototypical "item representing the whole group". 
  • Suggest rewording definition of /isVariantOf to something along these lines, with the details moved out into a dedicated doc: "Indicates a base or parent product that this product is a variant of. Properties of the referenced product are generally also applicable to the variant products, i.e. the convention is to describe a ProductModel or ProductCluster as the shared prototype of all its variants. See [doc] for details."There are reasonable reasons to debate whether extending /isVariantOf is better than a new property, or for that matter whether there's a case to have /ProductModel and the proposed /ProductGroup be a sibling type to /Product rather than a subtype.  Before we spin off into discussion of those details it would be good to re-affirm the value of doing something in this broad direction.

@jvandriel
Copy link
Author

Sounds good to me. Personally I'd prefer the name ProductGroup as it's closest to what it's called in other namespaces/specs for marketplaces, which often speak about a 'group' of products.

Any thoughts about the possibility of adding a hasVariant property so there's no dependency on the existence of offers or the need for referencing by fragment identifiers?

@danbri
Copy link
Contributor

danbri commented Jun 5, 2020

Having an inverse of /isVariantOf sounds useful to me. As for names, the terminology of "parent" also seems popular in e-commerce circles, but we have already used it in schema.org metaphorically in other places.

@thadguidry
Copy link
Contributor

thadguidry commented Jun 5, 2020 via email

@jaw111
Copy link
Contributor

jaw111 commented Jun 5, 2020

To me /ProductGroup is still quite vague and perhaps might just be a arbitrary group of products that share some similar feature or characteristic. How does it differ from a /category of products?

Perhaps something like /ProductLine, /ProductSeries or /ProductFamily might fit better?

Without wanting to muddy the waters further, isn't it the case that an /Offer is (logically) related to either an /IndividualProduct or /SomeProducts i.e. you (generally) do not offer the /ProductModel for sale. Isn't the use of the more generic /Product class just ambiguous in those cases?

@danbri
Copy link
Contributor

danbri commented Jun 5, 2020

@jaw111 /ProductGroup (or cluster or whatever) would be products which differed only along explicitly declared lines, e.g. w.r.t. sizes, colors.

Line/Series/Family seem closer to the "model" construct.

The observation that the abstract product model, or product group, isn't itself offered for sale is one of the points made in favour of having them be under /Intangible. At which point it becomes a technical debt / workflow etc management issue to keep the type/property associations properly in sync. The original Good Relations design had services and products in the same type, for example; in Schema.org we ended up treating them separately, and so have to maintain by hand various places in which either could appear. It's one of the costs of trying to avoid an over-deep type hierarchy with lots of abstractions.

As to @thadguidry 's point, yes - interactions with multi-typed entities could complicate things. I was talking recently with @alex-jansen also on how this would interact with subtypes of Product, if we (hypothetically) were to go in that direction and distinguish eg WearableProduct from others.

@jaw111
Copy link
Contributor

jaw111 commented Jun 8, 2020

@danbri the naming of the classes seems something that'll be hard to find something to please all parties. I struggle a bit with when something would be more of a /ProductGroup or a /ProductModel. In most cases I deal with the Series is a group of products that differ along explicitly declared lines, whilst also appearing in the same data sheet.

Would it help to have some concrete uses cases to clarify when it would be more appropriate to use which and how that might be interpreted by an application that consumes that data?

@alex-jansen
Copy link
Contributor

@jaw111 One key distinguishing characteristic of a /ProductGroup could be that it is always virtual (non-tangible). Which means that 1 or more defined attributes (the canonical examples of which are /size and /color for apparel) are needed to turn it into a real tangible product (aka a "variant"). A /ProductGroup will therefore not have the typical identifiers such as a /sku or a /gtin that a tangible item has.

In this example size and color are the variant attributes, while for example material and product details are common.

A /ProductModel on the contrary appears to represent a "complete" and tangible item in a series of related items (see also the comment of @thadguidry).

The main reason to make the concept of /ProductGroup explicit was nicely phrased by @JvDriel, namely to introduce an explicit and unambiguous way of representing and grouping product variants and their variant attributes. This would make it easier for consuming applications since those would not have to reconstruct (or guess) variant groupings.

@danbri
Copy link
Contributor

danbri commented Jun 9, 2020

Some notes towards draft schemas and examples (join #1797 and #2587), although not addressing all of the goals in the other issue around SizeDetails:

https://docs.google.com/document/d/19DpcLStce-n1iF1rsIyS3Pz9_h-xSaQ1J_Nu7m24Wjo/edit#

@jaw111
Copy link
Contributor

jaw111 commented Jun 9, 2020

@alex-jansen ok, so using an example at hand for microchips (B2B), we might have the series 74ABT125 which would be a /ProductGroup containing the /ProductModel instances (with some variant hierarchy):

Where the lowest level represent different packing methods for 'the same' product, like you might get 'the same' 330ml can of coke as a single item, or a 6-pack or 24-pack. As we're still not describing a specific box of chips, or 'some' anonymous boxes of chips, nor offering something for sale, then it's still appropriate to us /ProductModel for that.

Example:

@prefix schema: <http://schema.org/>

<74ABT125> a schema:ProductGroup ;
  schema:name "74ABT125" ;
  schema:description "Quad buffer; 3-state" ;
  schema:hasVariants <74ABT125BQ>, <74ABT125D>, <74ABT125DB>,  <74ABT125PW> .

<74ABT125PW> a schema:ProductModel ;
  schema:name "74ABT125PW" ;
  schema:description "Quad buffer; 3-state in SOT402-1" ;
  schema:hasVariants <74ABT125PW,118>, <74ABT125PW,112> .

<74ABT125PW,118> a schema:ProductModel ;
  schema:name "74ABT125PW,118";
  schema:mpn "74ABT125PW,118" ;
  schema:description "Quad buffer; 3-state in SOT402-1 on Reel 13\" Q1/T1 2500 pieces" ;
  schema:isVariantOf <74ABT125PW> .

<74ABT125PW,112> a schema:ProductModel ;
  schema:name "74ABT125PW,112";
  schema:mpn "74ABT125PW,112" ;
  schema:description "Quad buffer; 3-state in SOT402-1 Bulk pack 2400 pieces" ;
  schema:isVariantOf <74ABT125PW> .

Does that make sense?

@alex-jansen
Copy link
Contributor

alex-jansen commented Jun 10, 2020

@jaw111 It makes sense, you are modeling a 3-level hierarchy: series->types->orderable parts, where:

  • types belonging to a series vary based on "packaging"
  • orderable parts belonging to a type vary based on their "packing" (and possibly "quantity")
  • series and types are virtual
  • orderable parts are the tangible (buyable) items

The question then is whether the 2nd level (type) is a ProductGroup or a ProductModel?

It appears orderable parts differ along explicitly declared properties ("packaging", "packing"), quite similar to the examples of apparel (t-shirts), cola, and chips.

If we define ProductGroups as virtual (non-buyable) then would it make sense to model all but the leafs as ProductGroups?

For example (bear with me, this is only conceptual since Schema.Org does not define "package" , "packing", "quantity", or "variesBy" properties):

@prefix schema: <http://schema.org/>

<74ABT125> a schema:ProductGroup ;
  schema:name "74ABT125" ;
  schema:description "Quad buffer; 3-state" ;
  schema:variesBy "package" ;
  schema:hasVariants <74ABT125BQ>, <74ABT125D>, <74ABT125DB>,  <74ABT125PW> .

<74ABT125PW> a schema:ProductGroup ;
  schema:name "74ABT125PW" ;
  schema:description "Quad buffer; 3-state in SOT402-1" ;
  schema:package "TSSOP14" ;
  schema:variesBy "packing", "quantity" ;
  schema:isVariantOf <74ABT125>
  schema:hasVariants <74ABT125PW,118>, <74ABT125PW,112> .

<74ABT125PW,112> a schema:ProductModel ;
  schema:name "74ABT125PW,112";
  schema:mpn "74ABT125PW,112" ;
  schema:description "Quad buffer; 3-state in SOT402-1 Bulk pack 2400 pieces" ;
  schema:packing "Bulk pack" ;
  schema:quantity "2400" ;
  schema:isVariantOf <74ABT125PW> .

@jaw111
Copy link
Contributor

jaw111 commented Jun 10, 2020

@alex-jansen that's where I struggle with the distinction between /ProductModel and /ProductGroup types. In this case the second level already specifies the complete form, fit, function of the product, such that all manufacturing variants (produced in different locations or whatever) must conform to that specification. There may be some internal variance in how they are produced, but that should not affect how the product is used e.g. as a customer I know I can safely buy any variant of the 74ABT125PW and it'll still work in my design/application. Whereas the different product in a group are generally not drop-in replacements for each other. I don't know if this is a specific concern for electronic components, or something more generically applicable.

I guess something similar, but a bit further down the supply chain might be a product model like "iPhone 6s 4.7-inch 128 GB Silver". In a way all of those phones should be equal, but in practice there might be internal differences like the screen or battery might come from another supplier, but all should conform to the specification of that model.

Perhaps there is something to be said for tightening up the semantics of /isVariantOf such that a variant can only extend the specification of the parent model, but should never overrule an inherited value?

In case of components, the packing (i.e. box, reel, tray) is a secondary concern and more about the logistics. A distributor might resell the products in smaller quantities than are available direct from the manufacturer. I assume the same applies in other industries too. I'm not sure if it'd be of interest to try and capture that in Schema.org, or if it is already covered by something like the GS1 Web Vocabulary.

@alex-jansen
Copy link
Contributor

alex-jansen commented Jun 11, 2020

@jaw111 How about this to differentiate /ProductGroup and /ProductModel:

A /ProductGroup (1) never has a SKU and (2) contains a set of Products that vary on explicitly defined specific dimensions only (so it defines both the set of variants and which values must be added by those variants).

A /ProductModel (1) might have a SKU and (2) is more flexible in terms of the variations between related ProductModels (even if we disallow overruling inherited values).

A /ProductGroup is thus more restricted compared to a /ProductModel.

For example, in the world of eCommerce, the quantity is often an identifying dimension of a variant. One can buy the same roll of Scotch Tape in 3-packs or 6-packs. Each of the packs has a separate SKU, the /ProductGroup would be "Scotch Tape" and the /Products would be the 3-pack and the 6-pack.

danbri added a commit that referenced this issue Jun 16, 2020
including minimal linking into core via isVariantOf
danbri added a commit that referenced this issue Jun 16, 2020
Needed to pass sanity checks that there are even number of inverseOf claims.
/cc #1797
danbri added a commit that referenced this issue Jun 19, 2020
Hyperlinked 'size' in ProductGroup definition.
Removed accidental quote chars.
/cc #1797
@github-actions
Copy link

This issue is being tagged as Stale due to inactivity.

@github-actions github-actions bot added the no-issue-activity Discuss has gone quiet. Auto-tagging to encourage people to re-engage with the issue (or close it!). label Oct 25, 2020
@jvandriel
Copy link
Author

jvandriel commented May 30, 2023

I was wondering if any of you had any thoughts on how one should actually go about to exactly specify along which schema.org properties products vary?

(I couldn't find any issue discussing this other than some mentions about the use of string values for variesBy).

When playing around with it I came to something like this (which I consider quite convoluted):

"variesBy": [{
  "@type": "DefinedTerm",
  "@id": "https://schema.org/size",
  "name": "size",
  "url": "https://schema.org/size",
  "inDefinedTermSet": "https://schema.org"
}, {
  "@type": "DefinedTerm",
  "@id": "https://schema.org/color",
  "name": "color",
  "url": "https://schema.org/color",
  "inDefinedTermSet": "https://schema.org"
}],

Which, in an attempt to shorten it, led to :

"variesBy": [{
  "@id": "https://schema.org/size"
}, {
  "@id": "https://schema.org/color"
}],

And then I realized that even though it's not mentioned explicitly, providing a url should probably suffice as well (which definitely is the most publisher friendly annotation):

"variesBy":  ["https://schema.org/size","https://schema.org/color"],

Thoughts?

Note: related to #2587

@alex-jansen
Copy link
Contributor

@jvandriel fair question and just a url should indeed be sufficient. We were considering adding URL to the range of variesBy. An even better alternative could be Property. Thoughts?

@jvandriel
Copy link
Author

jvandriel commented Jul 6, 2023

Well, I'm right in the middle of 3 experimental projects involving ProductModel, ProductGroup and ProductCollection (hoping to share my experiences once the projects are live and done, so to help with the discussions).

One of which a is a basic webshop, for which I had to act quite pragmatic so to prevent them from losing their Rich Results in Google search; Which currently still happens when a page contains multiple products that are eligible for Rich Results. Meaning that "ProductGroup", "hasVariant": [{"a bunch of"},{"Products"}] won't work right now, which is a real obstacle for getting any actual experimental eCommerce implementations out there as folks aren't all that willing to sacrifice their Rich Results for some unsupported markup.

Though the other 2 involve SaaS products with subscriptions. Which is something we never really spoke about during the discussions around the new Product subtypes (thankfully we did stab a bit at subscription properties), yet for which I now discovered these new types actually make a wonderful fit. Interestingly enough I can already say that variesBy becomes a whole new playing field than we originally imagined it to be (or better said, than I foresaw, you lot probably not so much).

In 1 of the SaaS cases the variances lie with subscriptions offering different combinations of sub-applications that make up a software suite. The main entity being a whopping: ["ProductGroup","ProductCollection","WebApplication"]) of which the variances are defined by:

"variesBy": {
  "@type": "DefinedTerm",
  "@id": "https://schema.org/includesObject",
  "name": "includesObject",
  "url": "https://schema.org/includesObject",
  "inDefinedTermSet": "https://schema.org"
},

In this case though, includesObject seems reasonable for a ProductCollection, which I can't imagine is unheard of on GMC's side of things either (e.g. baskets with perfume, soap, oil, lotions, candles, etc). As such I don't expect this to be much of an issue for any consumer of such data, even if it involves an entity with multiple types.

In the last SaaS case however I'm describing eSim Data Plans (["ProductGroup","SoftwareApplication"]). Meaning the variances are defined with Offer and UnitPriceSpecification properties:

"variesBy": [{
  "@type": "DefinedTerm",
  "@id": "https://schema.org/price",
  "name": "price",
  "url": "https://schema.org/price",
  "inDefinedTermSet": "https://schema.org"
}, {
  "@type": "DefinedTerm",
  "@id": "https://schema.org/billingIncrement",
  "name": "billingIncrement",
  "url": "https://schema.org/billingIncrement",
  "inDefinedTermSet": "https://schema.org"
 }, {
  "@type": "DefinedTerm",
  "@id": "https://schema.org/billingDuration",
  "name": "billingDuration",
  "url": "https://schema.org/billingDuration",
  "inDefinedTermSet": "https://schema.org"
}, {
  "@type": "DefinedTerm",
  "@id": "https://schema.org/referenceQuantity",
  "name": "referenceQuantity",
  "url": "https://schema.org/referenceQuantity",
  "inDefinedTermSet": "https://schema.org"
}],

A scenario which definitely wasn't discussed during the conversations thus far as we've mostly been talking about variances which are a direct derivative of a Product's properties; And not properties that can be found 2 or 3 triple statements deep.

Now the above markup does illustrate I am able to express this with the current setup (so it seems robust) though I have my doubts about how 'consumable' this really is without introducing additional triple statements (not that I have any better ideas at the moment as I'm still elbows deep in writing markup. More reflections at a later moment, first I need to have actual urls I can share).

All this to say, I'm not sure - taking the final example into account - what to do with situations where the properties describing the variances are found at a deeper level of nesting, which as I now discovered, doesn't appear to be all that uncommon when expressing SaaS products (and likely other types of products I don't yet foresee as well). Thoughts?

As for your question about adding Property, do you mean the actual class, including its RDFs-ish properties (which I'd be quite scared of introducing to the rest of the world, especially marketers and SEOs) or did you mean to say that people would be allowed to simply provide a schema.org property label/name as value?

The latter seems like a really good idea to me because together with URL we'd end up with something equal as to how we can use schema.org enumerations either through short or full annotation (which is also robust).

Plus I'd also like to have the URL option for those cases where one might want to refer to a property from another vocabulary like gs1's (and no, I wouldn't expect support for that from day 1, no worries).

@Prlme1
Copy link

Prlme1 commented Jul 12, 2023

Hello Dear experts,

Thank you very much for your insights. I am a start up online shop and really struggle to accomplish google requirements. Would you mind please helping?

The advocates for "hasVariantOf" does not comply with the google demands, since Google insists that each variant must have a ProductID that refers to the original ProductID. please read this google link: https://support.google.com/merchants/answer/6324507?hl=en&ref_topic=6324338#zippy=%2Cgeneral-examples

here is there citation: "Submit a unique ID for each different product. Use the same value for item group ID [item_group_id] attribute for all variants of the same product. For example, a T-shirt comes in 9 variants: 3 sizes (small, medium, large) and 3 colors (red, blue, green). Submit each variant as a separate product (for a total of 9 separate products), and submit the same value for the item group ID attribute for each to indicate that these are variants of the same product."

In addition to this, there is no [item_group_id] attribute on schema.org, so what are they referring to?

@jvandriel
Copy link
Author

"there is no [item_group_id] attribute on schema.org, so what are they referring to?"

There is, though the properties used for this are called differently:
Product > inProductGroupWithID > Text and ProductGroup > productGroupID > Text

@Prlme1
Copy link

Prlme1 commented Jul 12, 2023

"there is no [item_group_id] attribute on schema.org, so what are they referring to?"

There is, though the properties used for this are called differently: Product > inProductGroupWithID > Text and ProductGroup > productGroupID > Text

Dear Jvandriel, do you know whether I am allowed to use separate schema code for each of the product variant, Or I must use a single code? For example if I have 3 colors and 3 sizes this is in total 9 products, hence 9 different schemas. I am failing to put everything in a single code.

@jvandriel
Copy link
Author

jvandriel commented Jul 12, 2023

All product variants that are part of the same ProductGroup are supposed to have the same value for their inProductGroupWithID, while the ProductGroup's productGroupID should also have that same value.

Part of you confusion might be caused by the fact that feeds for GMC only contain product data but don't contain any actual [item_group] definitions. GMC specific feeds only contain products, which you can virtually group by giving them the same [item_group_id] value.

Which you can express as such by using the schema.org vocabulary, though we're trying to come up with a solution that allows one to model the same info in multiple directions. Let me give you 3 code examples to illustrate what I'm trying to get across...

Multiple Product variants which identify the ProductGroup they belong to without mentioning the actual ProductGroup ([item_group]) itself.

{
  "@context": "https://schema.org",
  "@graph": [{
    "@type":"Product",
    "name": "Product variant #1",
    "inProductGroupWithID": "abc123" // = [item_group_id]: value
  }, {
    "@type":"Product",
    "name": "Product variant #2",
    "inProductGroupWithID": "abc123" // = [item_group_id]: value
  }]
}

A Product variant that belongs to a ProductGroup by specifying the ProductGroup itself.

{
  "@context": "https://schema.org",
  "@type":"Product",
  "name": "Product variant #1",
  "isVariantOf": {
    "@type": "ProductGroup",
    "productGroupID": "abc123" // = [item_group_id]: value
  }
}

A ProductGroup which has Product variants.

{
  "@context": "https://schema.org",
  "@type":"ProductGroup",
  "productGroupID": "abc123", // = [item_group_id]: value
  "hasVariant": [{
    "@type":"Product",
    "name": "Product variant #1"
  }, {
    "@type":"Product",
    "name": "Product variant #2"
  }]
}

@Prlme1
Copy link

Prlme1 commented Jul 12, 2023

dear jvandriel,

thank you very much for your comprehensive response, while I am testing the code, would you mind helping with answering a very simply question:

what if I just ignore the complicated Schema and simply override everything in the Google Merchant Center manually, Since they have the manual option for that which I just noticed.

Do you believe it will work?

@jvandriel
Copy link
Author

jvandriel commented Jul 12, 2023

Part of what we're trying doing here is to create an alternative for having to use XML feeds, so that you can either use structured data OR GMC XML feeds.

The most luxurious option for consumers of such data is if you do both. In which case you should try to make sure both methods end up offering exactly the same info. I wouldn't count on either one of them being able to overrule the other.

@Prlme1
Copy link

Prlme1 commented Jul 12, 2023

dear jvandriel,

the problem that I already have the automatic crawling feed which I tried to solve the same way as you - creating the Schema that answers all the questions. But I am failing to do it. It is too complicated for me.

I still have the automatic crawling feed and try to override everything manually.

However, I faced with another problem. Because the feed is automatic and the changes are manual I am failing to add the sizes. Because google insists for every size and color to have a separate product. But I cannot do it since its automatic feed. so shall I delete the automatic feed and do everything manually?

@jvandriel
Copy link
Author

jvandriel commented Jul 12, 2023

I'm sorry @Prlme1 but I fear I can't help you out with that as I'm not qualified to make any such statements, nor is this the right platform to be discussing that. Here we try to work on the development of schema.org itself.

If you've got any questions about how to resolve your situation I suggest you ask them over at the GMC's help center.

@Prlme1
Copy link

Prlme1 commented Jul 12, 2023

thank you very much for you help. I will keep following your Schema inventions.

@Prlme1
Copy link

Prlme1 commented Jul 12, 2023

dear jvandriel,

I understood my mistake confusing the Schema.org and the Structural Data with the internal schema of google within the Merchant Center. I promise to stick with the topic discussed here. Would you mind helping with another confusion please about the schema:

How to make the Structural Data in a such way so that Google Merchant Center reads off each variant as an individual product. Lets say I have 3 colors and 3 sizes which is in total 9 products. Shall I just add 9 different schemas to the web page so that next time google crawl it sees 9 products and adds them all to the Merchant Center? Or it should be a single code with let's say VariantOf attributes? will it be able to read off a single code as a 9 different products and adding all 9 to the merchant center?

Recall the google requirement:

https://support.google.com/merchants/answer/6324507?hl=en&ref_topic=6324338#zippy=%2Cgeneral-examples

here is there citation: "Submit a unique ID for each different product. Use the same value for item group ID [item_group_id] attribute for all variants of the same product. For example, a T-shirt comes in 9 variants: 3 sizes (small, medium, large) and 3 colors (red, blue, green). Submit each variant as a separate product (for a total of 9 separate products), and submit the same value for the item group ID attribute for each to indicate that these are variants of the same product."

Please, help me to solve this difficult puzzle. I am really struggling.

@mfhepp
Copy link
Contributor

mfhepp commented Jul 12, 2023

Just a bit of historic context: isVariantOf was initially designed so that

  • one could define product properties that are shared / inherited from a base model,
    and then
  • add or replace properties in a deterministic way.

It was initially not meant to represent rules that define possible product variants, but instead assuming that product models are materialized (i.e. one entity per each product variant).

The original axioms are documented in here:

http://wiki.goodrelations-vocabulary.org/Axioms

Namely:

http://wiki.goodrelations-vocabulary.org/Axioms#product_variants

I now tend to agree that we likely need a mechanism to specify the range of possible product variants in a rules-based fashion (like "the shirt is available in three colors and six sizes each"), although that creates problems of its own, namely

  • reliable identifiers for each variant and
  • inventory levels for each variant (any maybe prices and delivery times).

One essential question is whether we want the rules of product variant composition to be

a) under the command of the publisher (e.g. a server-side Python script that simply materializes all possible variants, or a RESTful API based on a URL pattern), or
b) whether we define a fully-fledged rule language and provide a vocabulary for representing the respective rules.

Now, as for product model vs. product: There are subtle yet practically relevant differences between product characteristics defined at the level of a product model vs. those of an actual product.

The original way of representing product characteristics in GoodRelations was organized in a hierarchical fashion, like so

Base Model properties -> Variant -> Actual Product

The exact semantics is specified here:

https://wiki.goodrelations-vocabulary.org/Axioms#product_models

Bottom-line: I think it is possible to define a simple, much constrained mechanism so that product variants for commodities like clothing can be represented by rules in markup rather than materialized, but it is slippery ground - because for availability information and ordering, you will need a unique identifier for each variant anyway.

Outlook: As search engines are increasingly able to process JSON-LD that is created by active content (e.g. JS) on the client side, it may be both more feasible and more flexible to develop a best-practice guide on how to generate the schema.org markup for product variants by Javascript components.

@jvandriel
Copy link
Author

jvandriel commented Jul 12, 2023

"a simple, much constrained mechanism so that product variants for commodities like clothing"

Is that enough though, shouldn't this be able to be achieved for non-physical products like SaaS products as well? (e.g. to be able to express the differences between different types of subscriptions)

Although I do feel that for these it would have been nice if schema.org had chosen for ProductOrService as IMO SaaS falls into a gray area in regards to whether it's a product or a service (I know, I can Multi-Type them).

Whichever it is, we wouldn't be able to achieve much these days without SaaS yet it's not a type of product/service which tends to have any (need for a) globally recognized identifier. At best the companies behind them sometimes sort of 'cheat' in their markup by providing an sku value, though 99/100 times its a marketer/SEO that came up with such values (after Google tools warning about them). Most providers/developers simply don't make any use of sku's for internal systems/purposes.

Oh, and what about mobile phone network, data plan and vpn providers (and such). Wouldn't it be of value if their product/service/subscription variants would be able to be expressed (and supported) as well? (good luck finding a ProductModel for those)

@jvandriel
Copy link
Author

@Prlme1, Google has very specific guidelines which describe how they would like you to handle product variants (at this moment in time). I suggest you read these and ask any questions you might have about them on Google's support forum.

@Tiggerito
Copy link

I re-read the relevant Google docs for Google Search and Google Merchant Centre.

TL;DR; I think the closest you can get to comply with both sets of requirements is to mark up a single product with inProductGroupWithID and have an offer per variant that includes the variant SKU or GTIN. Unfortunately, I see no way of describing the variants, and multiple offers may break the rich results, which state the variant should be on its own URL that is canonicalized out, so of no use.

At this time, I only add structured data at the product level. We’ve had several cases where structured data alone can add products to the Merchant Centre.

Merchant centre:

https://support.google.com/merchants/answer/6386198

A product page has a single product identified by inProductGroupWithID, which maps to item_group_id in the feed.

ProductModel and ProductGroup do not seem to be mentioned anymore.

https://support.google.com/merchants/answer/7331077

It can have multiple offers that are identified by SKU or GTIN that map to the feeds id. However, I see no way to define what the variant is in the offer.

So offers can be variants.

On to Google rich snippets…

https://developers.google.com/search/docs/appearance/structured-data/product#technical-guidelines

Also mentions support for inProductGroupWithID.

Only mark up one product on a product page. So using things like Product Group will probably break it. I’ve experimented with Product markup on category pages and saw that rich snippets only happened if the category only had one product.

The document implies only one offer, but does not specifically say so.

It would make sense to allow variants on the product page, where they specify the url for their true location. This could even be just a #green to trigger the page to show variant info.

It references this about giving variants their own URL:

eCommerce URL recommendations

https://developers.google.com/search/docs/specialty/ecommerce/designing-a-url-structure-for-ecommerce-sites#how-google-understands-urls-for-product-variants

It suggests that the canonical tag should be used to have the main product page as the canonical for all the variant pages. This would tell Google not to index the variant pages and not to use their structured data. However, as they would be near duplicates, Google would probably canonicalise them out anyhow.

So it seems there is no value in marking up variants on variant pages for Google search. Maybe the merchant centre will still check them.

@jvandriel
Copy link
Author

jvandriel commented Jul 13, 2023

To respond in particular to what @Tiggerito described about Google's documented desire for canonicalizing product variants to that of a single variant vs real-life situations where web sites offer a product page without having any of the variables set yet (so, variant to be determined still, pretty much like the GMC ad modal for variants identified as having the same [item_group_id]).

It's this where I feel ProductGroup (but also ProductModel if there is one) might be of use most. e.g.

This way all the variant pages can have their canonical url refer to that of the ProductGroup page while making life a whole lot easier for a very big % of the webshops out there because then they don't need to pull all kinds of tricks out of their hats to somehow create a system which allows for 1 variant to be the canonical variant (= substantial part of the work I've been involved in as an SEO specialist over the last 15 years).

Which becomes really painful when such a product is out of stock, because than the canonical has to automatically shift in a cascading manner until there's a variant that is in stock, and than has to get up the waterfall again as products are again in stock. A seriously stupid and wasteful system which I don't want to know how many billions have been spent on globally already and will be spent more of we don't make it easier for the world by simply letting them provide a ProductGroup or ProductModel - which describes it all - on the canonical url.

The first example of my recent post in this thread is actually a result of what @Tiggerito described. That site has a clean canonical url which sort of resembled what this GMC page illustrates, but due to Google Organic Search's best practices 'suggestion' for a canonicalized product variant, that business opted to spend dozens and dozens of development hours to accommodate the implementation those 'best practices'.

Yet they already had the perfect system in place - nearly out of the box - to be able to generate a page of which the ProductGroup would have been the mainEntityOfPage (and no, that particular shop also has no ProductModel info, like most shops don't while most manufacturers don't publish such data either, and if they do they most of the time don't use it as intended).

@Tiggerito unfortunately still is very correct in saying: "So it seems there is no value in marking up variants on variant pages for Google search."

While also being right in saying: "So using things like Product Group will probably break it".

I've extensively tested this over the last couple of months and so far the outcome of ProductGroup + all Product variants on a page = NO Rich Results. And since this actually negatively impacts revenue of shops they won't publish ProductGroup markup unless there are at least some signs of (coming/experimental) support.

At this moment the only sort of practical use case I've been able to find are SaaS subscription overview pages, which due to the nature of such content already aren't eligible for Google's Rich Results. But beyond that I can NOT find any candidates that are willing to take a chance with publishing ProductGroup markup due to the negative impact this has.

@Prlme1
Copy link

Prlme1 commented Jul 13, 2023

I went to the nike shop and read off the schema they have. This is how the major shops do. they put everything in "AggragateOffer" section. However, they ignore the sizes for some reason. and I still cannot understand how this appears in the Google Merchant Center, since all variants have to be a separate product:

</script>
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Product", "name": "Nike Spark Women's Shoes", "image": "https://static.nike.com/a/images/t_default/b438f82a-62a3-49a8-9ded-fd1d281761a9/spark-shoes-zPVQHZ.png", "description": "Find the Nike Spark at Nike.com.", "brand": { "@type": "Brand", "name": "Nike", "logo": "https://www.nike.com/Nike_Swoosh_Logo_Black_original.jpg" }, "offers": { "@type": "AggregateOffer", "lowPrice": "8957", "highPrice": "12795", "priceCurrency": "INR", "availability": "https://schema.org/InStock", "offerCount": 5, "offers": [ { "@type": "Offer", "url": "https://www.nike.com/in/t/spark-shoes-zPVQHZ", "price": 8957, "priceCurrency": "INR", "itemOffered": { "@type": "Product", "name": "Nike Spark Women's Shoes", "model": "14084002", "releaseDate": "2022-10-06T16:00:00.000Z", "color": "Barely Rose/Pink Oxford/Light Soft Pink/Dark Smoke Grey" }, "seller": { "@type": "Organization", "name": "Nike" }, "availability": "https://schema.org/OutOfStock" }, { "@type": "Offer", "url": "https://www.nike.com/in/t/spark-shoes-zPVQHZ", "price": 8957, "priceCurrency": "INR", "itemOffered": { "@type": "Product", "name": "Nike Spark Women's Shoes", "model": "1003839125", "releaseDate": "2023-01-30T16:00:00.000Z", "color": "Summit White/Rush Fuchsia/Ocean Bliss/Metallic Silver" }, "seller": { "@type": "Organization", "name": "Nike" }, "availability": "https://schema.org/InStock" }, { "@type": "Offer", "url": "https://www.nike.com/in/t/spark-shoes-zPVQHZ", "price": 12795, "priceCurrency": "INR", "itemOffered": { "@type": "Product", "name": "Nike Spark Women's Shoes", "model": "14018627", "releaseDate": "2022-11-22T16:00:00.000Z", "color": "Phantom/Sand Drift/White/Dark Smoke Grey" }, "seller": { "@type": "Organization", "name": "Nike" }, "availability": "https://schema.org/InStock" }, { "@type": "Offer", "url": "https://www.nike.com/in/t/spark-shoes-zPVQHZ", "price": 12795, "priceCurrency": "INR", "itemOffered": { "@type": "Product", "name": "Nike Spark Women's Shoes", "model": "14141745", "releaseDate": "2022-10-06T16:00:00.000Z", "color": "Black/Pure Platinum/White/Metallic Silver" }, "seller": { "@type": "Organization", "name": "Nike" }, "availability": "https://schema.org/InStock" }, { "@type": "Offer", "url": "https://www.nike.com/in/t/spark-shoes-zPVQHZ", "price": 12795, "priceCurrency": "INR", "itemOffered": { "@type": "Product", "name": "Nike Spark Women's Shoes", "model": "1010134718", "releaseDate": "2023-03-26T16:00:00.000Z", "color": "White/Game Royal/Picante Red/Black" }, "seller": { "@type": "Organization", "name": "Nike" }, "availability": "https://schema.org/InStock" } ] }, "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.9", "reviewCount": 9, "bestRating": "5", "worstRating": "1" } } </script>

@Tiggerito
Copy link

@Prlme1 using AggregateOffer means the page is not eligible for the merchant centre:

https://developers.google.com/search/docs/appearance/structured-data/product#aggregate-offer-properties

They assume that means you are an affiliate.

Could you provide an example URL where your example structured data is causing rich snippets. They have a strange nested offer structure which might end up being acceptable.

@Prlme1
Copy link

Prlme1 commented Jul 13, 2023

Thank you for sharing this information! Regarding your question about Nike shoes on Google, the products are displayed as goods in the image tab. However, it's uncertain how comprehensive these rich results are.

@briansackett
Copy link

Hello, It is great to see that this issue is being addressed after having made an educated guess for aggregating products with duplicate content back in 2019. I have spent countless hours trying to figure out how this simple, and very common circumstance should be treated in the eyes of google. If anyone can help in lehman terms that would be much appreciated. It is quite difficult to drill down to a source of truth.

For simplification, i will separate variation tiers by (A, B, C) and will address each tier as defined below.

-Product Category ( A )

  • Product Line (AA) | (AB)
    • Product (AAA) (AAB) (AAC) | (ABA) (ABB) (ABC)

Topics of Confusion

  • Where should the PRODUCT structured data exist? Should the product category structured data drill down to the product? Should it be on every page the product is listed?(A, AA, AAA) Is listing it multiple times a bad thing?

  • What is the the best way of aggregating structured data on the "Product Line" page?
    1. Product->Offers->AggregateOffers->Product[] ** this will error as the product line itself has no offer which is a required field.
    2. ItemList->itemListElement->Product[] **this is what we are doing and google seems to not like this
    3. ProductGroup. **if this is the best choice, why is hasVariant a 1:1 data relation? what is the proper syntax for this new method?

  • Proper Listing/Aggregating Syntax for Google
    1. Will the inverse Property on Product for aggregation (isVariantOf) register Variant to Parent if it is done on a different page (ie. ProductGroup defined on Product Line page, and reference via @id property on Product Page)?
    2. Should I be listing Products in separate JSON objects or nested within an ItemList property of the Aggregate model?

  • What page is the most important in terms of Content/Duplicate Content. This is not directly related, but is very similar in terms of what google is trying to achieve. The Product Category, Product Line and Product Pages are all relevant in terms of product drill down, but they all have nearly identical information. When a customer knows what they are looking for, they should be able to find it (ie. search via SKU to a Product specific page), but at what cost to the vendors Page Rank score? The reason I bring this up is because this "Pillar Page" of information would seemingly be the place where you would want to put all of your structured data and content in hopes of indexing and ranking highly with many product snippets associated.

Thank you for your help, the more i read the more contradictions i find from different parts of the thread, or different information online.. hoping to get something firm to stand on.

@Alireza-Naji
Copy link

Alireza-Naji commented Dec 11, 2023

hello dear @jvandriel . i would be grateful if you would take the time to review my suggestion about "varianttype" and if you provide me with your feedback. thank you for your time and consideration.

Rationale for "VariantType"

after conducting a thorough analysis of the entire conversation and the provided texts, the introduction of the VariantType stems from a need for a more robust and standardized way to represent variable features within a group of products. The primary motivations for this proposal are:

Semantic Enhancement:
The current data lacks a standardized way to represent and categorize variable features of products.
VariantType introduces a structured approach to add semantic meaning to variable features, enhancing the overall understanding of the products.

User Experience Improvement:
With products having variable features such as different colors, sizes, or materials, there is a need to provide users with a more intuitive and efficient means of navigating through these variations.
VariantType facilitates an improved user experience by categorizing and presenting products based on their variable features.

Data Modeling Flexibility:
as products evolve, new variable features may be introduced. VariantType is designed to be extendable, allowing for the incorporation of additional information and features in a flexible manner.
this flexibility ensures that the proposed solution is adaptable to future changes in product attributes.

Categorization and Recommendation:
The introduction of VariantType allows for effective categorization of products based on variable features, providing a foundation for developing recommendation systems.
Users can benefit from a more organized presentation of products, making it easier for them to find and choose the products that meet their specific requirements.

Consistency Across Products:
a standardized approach like VariantType ensures consistency in representing variable features across different products, making it easier for developers, applications, and users to understand and work with the data.

By addressing these considerations, the VariantType proposal aims to provide a solution that not only fills the current gap in data representation but also anticipates future needs and changes in the landscape of product information. The objective is to enhance both the backend structuring of data and the frontend user experience, creating a more comprehensive and user-friendly system for handling variable product features.

Proposal Explanation:

Using VariantType:
Creating a variable named VariantType that can serve as a tag for variable characteristics in related products. This VariantType can act as a criterion for categorizing and recommending associated products. For example, for products available in different colors, VariantType could be "Color."

This proposal allows you to enhance semantic structure, improve product information based on variable features, and assist users in quickly finding the products they need.

First Example:

VariantType is a variable used to model types of variable features within a group of products. This variable adds meaning to product information and helps systems and users quickly understand the differences and various features of products.

VariantType Features:

Name:
Determine a name for each VariantType, such as "Color," "Size," or "Material."

Variant Values:
Define different variable values for each VariantType. For example, for a VariantType named "Color," variable values could be "Red," "Blue," and "Green."

Associated Products:
Each VariantType can reference associated products that have variable features.

Categorization:
The ability to categorize products based on VariantType and their variable values.

Extendable Information:
Add extendable information to each VariantType to model various features that may be added in the future.

Example:
For a product available in different colors:

VariantType: Color
Variable Values:
Red
Blue
Green

Using VariantType allows for easy and improved modeling of variable product information, enabling users to quickly find the products they need.

Second Example:

VariantType is a variable used to model types of variable features within a group of products. This variable adds meaning to product information and helps systems and users quickly understand the differences and various features of products.

VariantType Features:

Name:
Determine a name for each VariantType, such as "Color," "Size," or "Material."

Variant Values:
Define different variable values for each VariantType. For example, for a VariantType named "Size," variable values could be "Small," "Medium," and "Large."

Associated Products:
Each VariantType can reference associated products that have variable features.

Categorization:
The ability to categorize products based on VariantType and their variable values.

Extendable Information:
Add extendable information to each VariantType to model various features that may be added in the future.

example:
for a product available in different sizes:

VariantType: Size
    Variable Values:
        Small
        Medium
        Large

using VariantType allows for easy and improved modeling of variable product information, enabling users to quickly find the products they need.

{
  "@type": "VariantType",
  "name": "Color",
  "variantValues": [
    {
      "@type": "PropertyValue",
      "name": "Red"
    },
    {
      "@type": "PropertyValue",
      "name": "Blue"
    },
    {
      "@type": "PropertyValue",
      "name": "Green"
    }
  ],
  "associatedProducts": [
    {
      "@type": "Product",
      "name": "Product A",
      "color": "Red"
    },
    {
      "@type": "Product",
      "name": "Product B",
      "color": "Blue"
    },
    {
      "@type": "Product",
      "name": "Product C",
      "color": "Green"
    }
  ]
}

this code illustrates the structure of VariantType, its features, and an example for a product with variable colors.

thank you

@jvandriel
Copy link
Author

jvandriel commented Dec 11, 2023

@Alireza-Naji, could you please open a new issue for your request? You're asking for something that is out of scope for this thread.

@jvandriel
Copy link
Author

@briansackett, you seem to have all kinds of questions about how you should do things for Google. I suggest you take your questions to their forum. We do not handle that here.

@github-actions github-actions bot removed the no-issue-activity Discuss has gone quiet. Auto-tagging to encourage people to re-engage with the issue (or close it!). label Oct 20, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

12 participants