Product
On our platform, product pages are made up of product content, reviews and recommendations. These can all be accessed easily through the product query.
Relationships
When it comes to products, we have the concept of a Product, and a Product Variant. On other platforms, these are sometimes referred to as Master/Child or Parent/Child.
A Product Variant is something that can actually be purchased and many products only have a single variant. For products that have multiple variants, there are variant options that are grouped by the variant key e.g. flavour or size.
What is shown on a product page (and therefore has a distinct URL) and in search/list results is a Product, not a variant. In our tooling, we do have the concept of Linked SKUs where 2 Products can be linked together so they appear together as variants but also have distinct URLs and will appear distinctly in searches and lists.
Content can be set on either the product or product variant, depending on whether this content should be shared across all variants or update when changing variants on site.
Content
Product content is any content that can be added to a product that isn’t mandatory data like a price, a title, a url and a name. Product content can be in one of these predefined types found here.
As previously stated, this can be set on the Product or the Product Variant so is best to query this for both objects to choose which to show.
URLs and Strict flag
When using the product query, a strict flag can be supplied. This flag determines whether the server should handle any redirects based on the product. These could be because you have entered a variant SKU, so we will actually return the master for you. Or if there is a redirect in place for discontinued products for example.
If this is set to true, we will return null if a variant SKU is supplied.
URLs are currently defined in our product stack and are used to service the website as well as performance marketing integrations like Google Shopping, hence why they are provided in the data.
Images
Currently, images are returned in 3 possible sizes. In future, this will be changed to return a single image URL where the exact size is customisable based on URL parameters.
PAPs - Promotion Aware Products
As well as a promotion being aware of the products it applies to, on our platform the inverse is also true. This means that for a product, if a promotion (or multiple) apply to it, the product is aware of this and promotion related information can be surfaced alongside the product.
This includes information like:
- Offer Title
- Offer Message
- Offer Link - A link to other products in this promotion
- Link Text
These are all customised and set up through our Content Management System that allow this information to be displayed beside a product.
When multiple promotions apply to a single product, the offer that provides the best value to the customer is the one that has its information displayed.
This is seen in the marketedSpecialOffer
object below.
Subscriptions
The legacy flags isSubscription
and isAutoRenewSubscription
can be used to determine whether a product is a subscription product and if it is recurring or fixed term subscription. This functionality is being replaced by Subscription Contracts, where subscription options are associated with product variants rather than having a different variant for each option.
Buy Now Pay Later Providers
Some payment providers offer the customer the option to purchase products in installments. We call these providers buy now pay later providers.
This option depends on various factors, such as country, currency and the total price of the product variant and all providers have different qualifying criteria.
To see what buy now pay later providers are avaiable for a product variant, and what installment breakdown they offer, you can use buyNowPayLaterProviders
field on the product variant.
Example
query ProductPage {
product(sku: 10530421, strict: false) {
title
marketedSpecialOffer {
title {
content {
type
content
}
}
description {
content {
type
content
}
}
landingPageLink {
text
url
}
}
images {
thumbnail
largeProduct
zoom
}
url
options {
key
choices {
optionKey
key
colour
title
}
}
content {
key
value {
... on ProductContentStringValue {
stringValue: value
}
... on ProductContentStringListValue {
stringListValue: value
}
... on ProductContentIntValue {
intValue: value
}
... on ProductContentIntListValue {
intListValue: value
}
... on ProductContentRichContentValue {
richContentValue: value {
content {
type
content
}
}
}
... on ProductContentRichContentListValue {
richContentListValue: value {
content {
type
content
}
}
}
}
}
reviews {
total
averageScore
maxScore
count1Score
count2Score
count3Score
count4Score
count5Score
reviews {
reviews {
id
title
authorName
verifiedPurchase
posted
elements {
... on RatingReviewElement {
key
maxScore
score
}
... on TextReviewElement {
key
value
}
}
}
total
hasMore
}
}
fbt: recommendations(type: FREQUENTLY_BOUGHT_TOGETHER) {
sku
url
title
images {
thumbnail
}
defaultVariant(options: { currency: GBP, shippingDestination: GB }) {
price(currency: GBP, shippingDestination: GB) {
price {
currency
amount
displayValue
}
rrp {
currency
amount
displayValue
}
}
}
}
personalised: recommendations(type: PERSONALISED) {
sku
url
title
images {
thumbnail
}
defaultVariant(options: { currency: GBP, shippingDestination: GB }) {
price(currency: GBP, shippingDestination: GB) {
price {
currency
amount
displayValue
}
rrp {
currency
amount
displayValue
}
}
}
}
variants {
sku
title
images {
thumbnail
largeProduct
zoom
}
choices {
optionKey
key
colour
title
}
isSubscription
isAutoRenewSubscription
buyNowPayLaterProviders(
settings: { currency: GBP, shippingDestination: GB }
) {
providerName
displayName
numberOfInstalments
instalmentAmount {
currency
amount
displayValue
scalarValue
}
landingPageLink
}
}
platform
sizeGuide {
content {
type
content
}
}
defaultVariant(options: { currency: GBP, shippingDestination: GB }) {
sku
choices {
optionKey
key
colour
title
}
title
inStock
availabilityMessage
price(currency: GBP, shippingDestination: GB) {
price {
currency
amount
displayValue
}
rrp {
currency
amount
displayValue
}
}
content {
key
value {
... on ProductContentStringValue {
stringValue: value
}
... on ProductContentStringListValue {
stringListValue: value
}
... on ProductContentIntValue {
intValue: value
}
... on ProductContentIntListValue {
intListValue: value
}
... on ProductContentRichContentValue {
richContentValue: value {
content {
type
content
}
}
}
... on ProductContentRichContentListValue {
richContentListValue: value {
content {
type
content
}
}
}
}
}
}
cheapestVariant(currency: GBP, shippingDestination: GB) {
price(currency: GBP, shippingDestination: GB) {
price {
currency
amount
displayValue
}
rrp {
currency
amount
displayValue
}
}
earnableLoyaltyPoints(settings: { currency: GBP, shippingDestination: GB })
}
brand {
name
page {
path
}
imageUrl
}
}
}
Querying for multiple products and product variants.
In addition to the above query, you can now obtain information for multiple products / product variants in bulk. This is achieved through the following queries:
query Products {
products(
skus: [SKUs], # A List of comma separated SKUs
skipRedirects: Boolean
) {...}
}
query ProductVariants {
productVariants(
skus: [SKU]
) {...}
}