Link Search Menu Expand Document

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]
    ) {...}
}


2024 © The Hut.com Ltd.