Link Search Menu Expand Document

Click & Collect / Omnichannel

Click and collect is a feature that can be enabled for Omnichannel based sites that have physical stores. This adds the ability to choose a fulfilment type, select a store as well as get stock information on a per store basis.

Stores

Stores can be queried in 1 of 3 ways. All Stores, By ID, or Nearest Stores. For the nearest stores query, first we need to get the location the customer cares about, then this can be used to query for the nearest stores. Stores are also aware of other nearby stores.

query AllStores {
  stores {
    id
    displayName
    urlTag
    phoneNumber
    openingTimes {
      day
      openingTime
      closingTime
    }
    address {
      addresseeName
      companyName
      addressLine2
      addressLine3
      addressLine4
      addressLine5
      state
      postalCode
      country
      phoneNumber
      clickAndCollect
    }
  }
}

query StoreById {
  store(id: 88) {
    id
    displayName
    urlTag
    phoneNumber
    openingTimes {
      day
      openingTime
      closingTime
    }
    address {
      addresseeName
      companyName
      addressLine2
      addressLine3
      addressLine4
      addressLine5
      state
      postalCode
      country
      phoneNumber
      clickAndCollect
    }
    nearbyStores {
      id
      displayName
      urlTag
      phoneNumber
      openingTimes {
        day
        openingTime
        closingTime
      }
      address {
        addresseeName
        companyName
        addressLine2
        addressLine3
        addressLine4
        addressLine5
        state
        postalCode
        country
        phoneNumber
        clickAndCollect
      }
    }
  }
}

query NearestStores {
  searchLocations(query: "Salford Quays") {
    displayName
    longitude
    latitude
    postcode
  }
  nearbyStores(longitude: -2.28995, latitude: 53.4767) {
    id
    displayName
    urlTag
    phoneNumber
    openingTimes {
      day
      openingTime
      closingTime
    }
    address {
      addresseeName
      companyName
      addressLine2
      addressLine3
      addressLine4
      addressLine5
      state
      postalCode
      country
      phoneNumber
      clickAndCollect
    }
  }
}

Querying a store for a product

When you want to find out if a product is available in your local store, this is very similar to the nearest stores query. The response is slightly different as you now also get the distance and stock quantity of that store. Against the product variant, we also expose the fulfilment methods that are supported for a given product. More information about these can be found in the schema.

query ClickAndCollect {
  product(sku: 12826915, strict:false) {
    variants {
      title
      eligibleForFulfilmentMethods
      clickAndCollectStores(longitude: -2.28995, latitude: 53.4767) {
        store {
          displayName
        }
        distanceMiles
        stock
      }
    }
  }
}

Adding a product to basket

For sites that support omnichannel, so have more than 1 type of fulfilment method (other than the usual home delivery of purely online sites), when adding a product to basket, more information is now required.

A fulfilment method, and optional store id are now required (depending on if the fulfilment method utilises a store).

mutation AddToBasket {
  addProductToBasket(
    basketId: null
    sku: 10797927
    quantity: 8
    fulfilmentInput: { # new field in the input
      method: COLLECT_IN_STORE
      storeId: 88
    }
    settings: { currency: GBP, shippingDestination: GB }
  ) {
    id
    items {
      product {
        title
      }
      chargePricePerUnit {
        currency
        amount
        displayValue
      }
      quantity
      appliedOffers {
        totalBasketDiscount {
          currency
          amount
          displayValue
        }
        removeable
        message
        info
      }
      freeGift
    }
    appliedOffers {
      totalBasketDiscount {
        currency
        amount
        displayValue
      }
      removeable
      message
      info
    }
    messages {
      type
      message
    }
    selectYourSample {
      id
      title
      message
      currentAmountSpent {
        currency
        amount
        displayValue
      }
      tiers {
        id
        thresholdAmountSpent {
          currency
          amount
          displayValue
        }
        products {
          sku
          title
          images {
            thumbnail
          }
        }
        selectedProducts {
          sku
        }
        maxSelectedProducts
      }
    }
  }
}

Basket

As we now have more information about the product when adding it to basket, this data is also exposed against the basket item as shown below. Store and store stock will only be exposed if the fulfilment type involves a store.

query ViewBasket {
  basket(
    id: "2298e807-50ee-4120-abfa-3c0f0ef78fca:1611587680727",
    settings: {
      currency:GBP
      shippingDestination: GB
  	}
    acknowledgeMerge: true
  ) {
    id
    items {
      product {
        title
      }
      chargePricePerUnit { # item price after offers have applied
        currency
        amount
        displayValue
      }
      totalChargePrice { # line price after offers have applied
        currency
        amount
        displayValue
      }
      quantity
      fulfilmentMethod # new field
      store { # new field
        id
        displayName
      }
      storeStock # new field
    }
    messages {
      type
      message
    }
    eligibleForCheckout # new field
  }
}

Another change to the basket to support the mixed fulfilment methods is around errors and messaging. We now expose new error types as well as show item level messaging for line level issues. These errors can also block the ability for a customer to checkout and require the customer to fix these issues if they exist.

The basket level messages now support 2 new types:

  • MIXED_FULFILMENT_METHODS - this signifies the site does not support warehouse and store based fulfilment in the same order so must be corrected
  • ITEMS_HAVE_ERRORS - this signifies that that one of the individual items has an error that must be fixed

For the new basket item messages under basket.items.messages, these have a message and a type. The 3 supported types and descriptions can be found below and in the schema.

NOT_ENOUGH_STOCK

This flag will appear if there is not enough stock for the product and fulfilment option the customer has chosen. These issues can be fixed by changing the requested stock.

If there is absolutely no stock, FULFILMENT_ISSUE is returned instead.

PRODUCT_ISSUE

This flag will appear if the product is no longer eligible for the selected fulfilment option, e.g. this product may no longer be available for home delivery, or click and collect or the product is marked as not purchasable online anymore. These problems can be fixed by changing the fulfilment type - note the product may no longer be available for any fulfilment type.

FULFILMENT_ISSUE

This flag will appear if the selected fulfilment type is no longer available. This can be where the store is closed or does not have click and collect available and is related the the fulfilment type itself rather than the product. These problems can be fixed by changing something about the fulfilment type e.g. changing store.


2024 © The Hut.com Ltd.