# Release Notes ## 2023-02-16 - Added ExternalOrderData field for orders from external sources ## 2022-12-27 - Added new endpoint, to look-up a customer by mobile phone number ## 2022-12-06 - Added field `type` to `Discount`. ## 2022-11-15 - New feature: Excluding/including pages from sitemap and meta tags. Added field `allowWebIndexing` to `Page` and `Category` ## 2022-11-02 - Added field `hasMemberPrice` to `Product`. - Added field `memberPrice` to `Product`. ## 2022-09-27 - Fixed issue with `externalHashId` login. ## 2022-09-19 - Customer can now `login` with `externalHashId`. ## 2022-06-30 - New feature: Product price history. Added fields `history.previousPrice` to `Product` and `ProductVariant`. ## 2022-05-17 - Added a `updateCustomerGroup` mutation that, given a `customerGroupAccessCode`, will update a customer with the customer group for that access code. ## 2022-05-16 - Added `dynamicFiltering` field to `category` query along with new types: `CategoryDynamicFilter` and `ListStringValue`. ## 2022-05-04 - Added `externalAttributes` parameter to both `SignUp` and `UpdateCustomer` mutations. ## 2022-03-29 - Fixed issue where `cartItem.customerComments` special characters unnecessarily HTML encoded. ## 2022-03-23 - Fixed issue where `signUp` mutation error response differs ## 2022-03-14 - Added new `content` query that given list of content IDs returns a list of objects containting succesful matches of ContentGraphType and another list of not found IDs. ## 2022-03-02 - Bugfix: Expired products with variants should no longer be buyable. ## 2022-02-21 - Added field `hasFamilyMembers` to `Product`. - Added field `externalId` to `Discount` & field `externalDiscountId` to `Category`. - Added field `orderPurchaseLocation` to `Order` response type. ## 2022-01-03 - Added argument validation for invalid `first` and `offset` values to `Category.products`, previously this would result in an unhandled error, now you get a BadRequest along with a description instead. ## 2021-12-23 - Fixed an issue where product configurations would not allow negative prices. ## 2021-12-02 - Fixed an issue where the previously introduced field `Product.primaryRoute.breadcrumbs` would sometimes not return all crumbs. ## 2021-11-16 - Added `hasVariantsWithDifferingPrices` to the `Product` type that is true if the product has variants with differing prices, false if not (and false if there are no variants at all). ## 2021-11-09 - Added a `updateCustomerPriceList` mutation that, given a `priceListAccessCode`, will update a customer with the price list for that access code. ## 2021-11-02 - `signUp` mutation has a new field `priceListAccessCode` that, if provided, will create a customer with the price list for that access code. - Fixed an issue where `page.externalUrl` did not show its localized value. ## 2021-10-29 - `page.subPages` now accepts an `includeHidden` flag as argument that is set to `true` as default. This will exclude hidden sub-pages when fetching by ID if set to `false`. ## 2021-10-28 - Improved the performance of the `customerComments` field on `Product`, it no longer resolves via a separate backend API call. ## 2021-10-27 - Added `breadcrumbs` to `Route` that contain breadcrumb texts starting with the root parent, ending in the current route. - Improved the performance of the `quantitySuffix` field on `Product`, it no longer resolves via a separate backend API call. - Improved the performance of the `head` field on `Product`, it no longer resolves via a separate backend API call. ## 2021-10-13 - Added a `debug` field to `Route` that can be used for troubleshooting routes. N.B. it's not meant for production code use! ## 2021-10-12 - Fixed an issue where `channel.settings.countrySettings.businessCustomerFields` would not output data for the `organizationNumber` field. ## 2021-10-06 - Voyado should now work on channels that require authentication. ## 2021-09-30 - `externalId` should now be available on `Store`. ## 2021-08-23 - Added `hasExternalUrl` and `externalUrl` to the `Page` type where `externalUrl` is a `Link` type that contains `link` and `target`. ## 2021-07-08 - `product`'s comments added to cart will now be HTML encoded to prevent XSS injections - Added ´activeDateSpan´ to `category` and `priceDateSpan` to `product`and it's variants to display time intervals of discounted prices and campaigns. - Added `externalId` to `category`. ## 2021-07-06 - Added `parent` and `subPages` to the `Page` type. ## 2021-07-01 - The cart should now display discounts on upsell products. ## 2021-06-29 - BREAKING CHANGE: The `category` query now allows the `id` parameter as a string or as a int. - `externalCustomerLookup` will now return a `COUNTRY_NOT_VALID` status when the customer account may not be activated on the channel as it's missing the customer country. A new `externalCustomerLookup.customer.countryCode` field has been added to show which country the external customer has. ## 2021-06-16 - Fixed an issue where a campaign product badge would be duplicated when the badge was connected to multiple campaigns. ## 2021-06-10 - Fixed an issue where badges would sometimes not show on products. ## 2021-05-27 - Added an optional `includeInactive` argument to `productVariant.warehouseStock` which will include warehouseStock for inactive stores in the result. Defaults to false, i.e. warehouse stock for inactive stores are not included. ## 2021-05-20 - Added an optional `includeInactive` argument to `product.warehouseStock` which will include warehouseStock for inactive stores in the result. Defaults to false, i.e. warehouse stock for inactive stores are not included. ## 2021-05-18 - Fixed an issue in cart where a discount would sometimes be applied to products discounted on the pricelist despite the discount being specified as excluding these. ## 2021-04-13 - Fixed an issue where stores would not sort by Swedish letters (åäö) correctly. - `product.warehouseStock` should now be sorted by `product.warehouseStock.location.name`. ## 2021-03-12 - `FacebookConversionsApi`s `accessToken` & `pixelId` is now be available on `ChannelSettings` `Tracking`. ## 2021-03-05 - Fixed an issue where member prices wouldn't always be calculated correctly. ## 2021-03-01 - Fixed an issue where `ContentItemProperty.value` wouldn't resolve Categories that were hidden or had display type API. ## 2021-02-25 - Value of the boolean type will now be parsed correctly in `category.data`, `page.data` & `startpage.data` ## 2021-02-24 - Fixed an issue where `searchAutoComplete.categories` wouldn't give you any results unless you had provied three or more characters in the `term` argument. This should now give you results from one character and up. - Stores should now be presented in alphabetic order by `name`. - Added new fields `category.data` and `page.data`. Both serve content from the Content Editor and function exactly like the already existing `startpage.data` field. ## 2021-02-16 - Logged on customers should now have applicable customer group based discounts applied to product prices. ## 2021-02-09 - Improved performance when fetching recommended products. ## 2021-02-08 - Performance should be improved on queries for products that calculate member prices. ## 2021-01-29 - Fixed an issue where packages would sometimes have incorrect prices. ## 2021-01-21 - Added new field `Product.familyMembers` that contains all other products in the same family as the product. ## 2021-01-14 - `product.upsell` has now been implemented and should now produce results. - `product.hasUpsell` has been added. - Fixed an issue where `product.badges` would include badges for campaigns that had `Exclude discounted products` set to true, even when the product had a discount on the price list. ## 2021-01-04 - Fixed an issue where `product.campaigns` would include campaigns that had `Exclude discounted products` set to true, even when the product had a discount on the price list. ## 2020-12-22 - Fixed an issue where the `name` and `description` fields on `cart.aggregatedDiscounts` were not using their localized values. ## 2020-12-16 - Changed `stockStatus.id` to be globally unique. The old value, which is not globally unique, can now be found in the newly added `stockStatus.stockStatusId` field. - Fixed an issue where you would sometimes get `ProductNotFound` errors when querying `products` on either `articleNumbers`, `ids` or `barcodes` with duplicate values. ## 2020-11-20 - Inactive campaign categories should now be returned when the `preview` header is set to true. ## 2020-10-23 - Refactored exception handling the API, instead of getting: `"error": "Unexpected end of JSON input"` you'll instead now get a mildly more informative: `"errors": [ { "message": "", "extensions": { "code": "UnhandledException", "codes": [ "UnhandledException" ] } } ]` ## 2020-10-14 - To fix an issue with currency formatting, we've changed the value of `currency.format.culture` to always be that of the channel culture. - Due to the above fix, the `currency.format.culture` has been deprecated. Instead use a culture that makes sense contextually when formatting a currency. ## 2020-10-01 - Fixed an issue where the cart would show the wrong price for the same product added more than once with differing customer comments. ## 2020-09-09 - You should no longer get an error when sending in duplicate filter ids in different format standards (`100:somefilter`, `somefilter`). List filter values will be merged. In the case of numeric and boolean filters, all repeating filters with the same id will be ignored. - Fixed an issue where encrypted `emailAddress` and `pid` on SignUp-mutation didn't get decrypted. ## 2020-09-03 - Fixed an issue where `startPage.primaryRoute` would sometimes return null. ## 2020-09-01 - Fixed an issue where a product would have a `stockStatus.buyable` of true, even though all its variants had their `buyable` status set to false. ## 2020-08-17 - `preOrder.fromDate` and `preOrder.toDate` should now be null when a product doesn't have pre-order. ## 2020-08-11 - Added `isActivatedByDiscountCode` and `discountCode` to `CustomerLoyaltyDiscount`. ## 2020-06-25 - Redeemed discounts should no longer affect the calculated member price. - Changed the behaviour of `customerLoyalty.discounts` to exclude redeemed discounts from the result by default. - Added an optional `includeRedeemed` argument to `customerLoyalty.discounts` which will include redeemed discounts in the result. Defaults to false, i.e. redeemed discounts are not included. ## 2020-06-23 - Added an optional `includeInactive` argument to `stores` which will include inactive stores in the result. Defaults to false, i.e. inactive stores are not included. - The "authorization" header token is now channel specific; if you log on to one channel and attempt to use the same token in another channel you should get a `InvalidToken` error. ## 2020-06-18 - `product.campaigns` may now be visible even when the root campaign is of the display type "API". ## 2020-06-16 - Fixed an issue where related products and product recommendations wouldn't have calculated member prices. - Fixed an issue where `cartItem.product` wouldn't have calculated member prices. ## 2020-06-12 - Querying for `stores` should no longer return inactive stores. ## 2020-06-11 - Fixed an issue where a product package with a zero price could result in an error. ## 2020-06-04 - `googleUserId` should now be available on `Customer`. ## 2020-05-28 - Added an optional `limit` argument to `product.images` which will limit the number of returned images. Defaults to null, which will return all images. ## 2020-05-26 - Fixed an issue where the a product with variants could sometimes be added to cart despite it having no buyable variants. ## 2020-05-20 - Fixed an issue where the calculated member price on a product would be wrong if the product already had a reduced price. ## 2020-05-12 - Resolved an issue where some where some product variants wouldn't be hidden if they were set to stock status "ExactNumber", the stock level had reached zero, and the admin setting that stipulates that these should be hidden was true. - Resolved an issue where fetching `product` or `products` by an article number containing '/' wouldn't always work. ## 2020-05-05 - `externalAttributes` should now be available on `Customer`. ## 2020-04-30 - Fixed an issue where comments on a cart item would sometimes be stored incorrectly, this in turn impacted checkout and what was saved to the order. ## 2020-04-20 - Cart should now return previous prices (on total and items) as the price after reduced prices. For example: Product has an original price of 200, this price is reduced to 100, this product also has a discount of 10%. Previous to this fix, `previousPrice` would be shown as 200, and current `price` would be shown as 180. Only taking into account the discount of 10%. After the fix, `previousPrice` will be shown as 100 and the current price will be 90. Taking into account the reduced price and the discount. ## 2020-04-17 - Fixed an issue where `organizationId` on `customer` would always return null. - Deprecated `organizationId` on `customer` and added `organizationNumber`, in order to match the name used on signup and update. ## 2020-04-07 - Fixed an issue that would sometimes occur when requesting `store` on `customer`. ## 2020-03-30 - You should no longer get an EmptyRoute error when fetching a route that has been redirected to a URL that does not exist. Instead, you should now get the route object back. If you try to fetch `object` on said route, you will get the EmptyRoute error. However, route should remain intact, returing `object` as null. ## 2020-03-04 - Route lookups on `/`, i.e. the start page, should now included alternate routes. ## 2020-03-02 - Fixed an issue that would sometimes occur on an order without a connected country. ## 2020-02-28 - Added an optional `orderId` input argument to the `order` query that can handle both internal and external orders. - Deprecated the `id` input argument to the `order` query, please use the above mentioned `orderId` argument instead. - Fixed an issue where category primary routes would sometimes not get the correct localisation. - Added a new bool field `hasOrderDetails` to `OrderHeader`. When this is false, a call to `order` for that order will result in a failure. ## 2020-02-19 - Fixed an issue where you couldn't fetch an `Order` that had a `OrderItem` without a associated product. ## 2020-02-07 - A new field `DynamicContent` has been added to `customer`. - The `subscribeToNewsletter` mutation now supports JetShop, Mailchimp, Rule and Voyado-subscriptions. - `warehouseStock.location` on `product` should now show locations even when they're inactive (the inactive state is meant to signify that the location is not available for collect at store). ## 2020-01-08 - A `CustomField` of `CustomListField` type should no longer be returned when the list contains no elements. - `updateCustomerProductListItem` and `removeFromCustomerProductList` mutations now accepts variant's `articleNumber` as input ## 2019-12-13 - `page.head` should now be set even if the page is not visible in the channel. ## 2019-12-11 - Fixed an issue where `ProductNotFound` would be returned from `products` when matching on a variant article number. - Cart discount calculations should now support discount codes. - ExternalCheckoutUrl should no longer contain a country argument when the customer is authenticated. - Bugfix: `customer.OrderHeader` should no longer result in an error when OrderId is empty. ## 2019-12-10 - Fixed an issue where a product barcode lookup wouldn't look for a barcode match on variants. - Improved the error result on the `products` query to be more descriptive. - Improved the error result on the `addMultipleToCart` mutation to be more descriptive. - Added `alias` to `AlternateRoute`; which, when set, may be used in place of `culture` when rendering alternate links. ## 2019-12-04 - `order` and `customer.orderHeaders` should now be capable of fetching orders from external systems (when available and activated in the back end). - The `__healthcheck` route should now disregard if a channel requires authentication. - Added `useArticleNumberAsId` to the `GoogleAnalytics` type. ## 2019-11-27 - Fixed an issue where dynamic categories would sometimes not show certain types of filters. ## 2019-11-21 - Added an optional `barcode` input argument to `product`. - Added an optional `barcodes` input argument to `products`. - Fixed an issue where sometimes an erroneous connection string for a shop would be cached. ## 2019-11-13 - Added a 15 minute memory cache to `FreeShippingLimit`. - Now sending `Access-Control-Max-Age`, set to 24 hours, on pre-flight requests. ## 2019-11-08 - Fixed an issue where `order.items.variantOptionNames` would somtimes be null, it should now always be an empty list in these cases. ## 2019-11-05 - Fixed an issue where getting certain types of orders would fail. - Improved the error messages for the `updateCart`, `addToCart` and `addToCustomerProductList` mutations. - Cart discount calculations should now support discounts tied to a customer group. ## 2019-10-28 - Made a performance improvement on fetching `primaryRoute.parents` on `product`. Previously parents would always be fetched in the backend query, even when not used, now they'll be left out unless asked for. ## 2019-10-24 - Fixed an issue where some variant options would show even though the variant itself was hidden. ## 2019-10-23 - You should now be able to add a `InputComment` on a cart item for any product. - Added a `updateCart` mutation. ## 2019-10-10 - `Route.alternateRoutes` should now be empty if the shop only has one channel and one language. - Querying for `channel`, `channels` and the introspection query should now be allowed even when a channel requires authentication. ## 2019-10-08 - Added `Channel.requiresAuth` to signify that a customer must be logged on to view the channel. - Added support for a setting that, when enabled, will ensure that a product variant is hidden if its stock status is "ExactNumber" and the stock level reaches zero. - Added a `removeMultipleFromCart` mutation. ## 2019-10-01 - There is now a short cache on requests to get one or all `Page` object. - Url encoded 301 redirects should now be handled correctly. - Fixed an issue where fetching `Page.primaryRoute` on an inactive page for that channel would result in an error, it should now instead result a null route. ## 2019-09-10 - It should now be possible to add pre-order products to the cart. - Fixed an issue where newly created customers would sometimes not get the right culture set. - Fixed an issue where `ListFilterItem.resultCount` would sometimes not have the right value. ## 2019-08-30 - The `Category.subcategories` list should no longer contain any null values. - `MultiListFilterList` has had its `id` field un-deprecated and should now be unique within the channel. ## 2019-08-20 - The "Custom" sort order on `Category.products` should no longer be returned when it's the only sort order active. - `Category.products` filter input with the wrong category id-prefix should no longer affect the filtered product result. - Fixed an issue where `Category.products.totalResults` wouldn't always update correctly. ## 2019-08-15 - Resolving a dynamic category should now be done using fallback cultures. Previosuly it would only use the given culture. ## 2019-08-13 - A new `id` field has been added to `ListFilterItem` that should be unique for that category. ## 2019-08-05 - Fields on `Store` should no longer be html-encoded. ## 2019-07-18 - `CustomerField.id` should now be globally unqiue. - `CustomerField.name` has been added. ## 2019-07-17 - SortOrder and QuantitySuffix translations should now be using the value provided in Admin when available. ## 2019-07-09 - `Login` mutation now accepts either email, pid, externalId or memberNumber. ## 2019-06-27 - `Country.id` should now be globally unique as it's now a concatenation of country code and channel id. ## 2019-06-26 - Added `defaultPrice` and `defaultPreviousPrice` to `Product` and `ProductVariant` both. ## 2019-06-18 - `CartItem` and `OrderItem` now both has a `variantOptionNames` field. ## 2019-06-05 - Meta descriptions on `Category` should no longer be truncated to 100 chars (unless there's no meta description specified, in which case we source it from the content field and truncate it). - BREAKING CHANGE: various fields on `Customer` have been altered to align with the `updateCustomer` and `signUp` mutations. ## 2019-05-29 - Search results now contain `categories` as well as `products`. - SearchAutoComplete results now contain `categories` as well as `products`. ## 2019-05-20 - Added `quantitySuffix` on `Product` ## 2019-05-09 - BREAKING CHANGE: Replaced `Customer.orders` with `Customer.orderHeaders`. - Bugfix: Product badges controlled by campaigns should now work correctly. - Added fields `previousTotal` and `previousUnitPrice` to CartItem. ## 2019-04-29 - Shortened the timeout for fetching `Product.recommendedProducts`, a timeout will now result in an empty list. ## 2019-04-11 - Product badges with transparent images should now have its image url set to null. - Dynamic categories should now be supported. These categories don't use a fixed product list, instead they depend on filters to determine which products to include. - `Category.isDynamic` has been added to indicate that a catgory has a dynamic collection of products. ## 2019-04-04 - Added `imageUrl` to `Channel`, this can be used to build image urls if needed. - Bugfix: Redirects to start page should now return start page instead of empty route. ## 2019-04-02 - Bugfix: Campaign categories should now longer show if they're inactive. - `Cart.aggregatedDiscounts` has now been implemented. - `CartItem.discounts` has now been implemented. ## 2019-03-25 - `Currency.id` should now be set to the alphabetic code of the currency instead of a number. ## 2019-03-21 - `Product.categories` should no longer contain hidden categories. ## 2019-03-19 - All SignUp-& Update fields now match with their respective Customerfields ## 2019-03-11 - Cart calculation switched to be identical to the calculation used in Checkout. ## 2019-03-05 - Categories with hidden parents should now also be hidden - You should now be able to fetch inactive pages by id ## 2019-02-28 - Ensuring that `Filter.id` is unique per category to facilitate Apollo client side caching. ## 2019-02-26 - Bugfix: `Category.mainHeader` should now correctly fall back to using the category name if no main header exists. ## 2019-02-25 - BREAKING CHANGE: A lot of fields that were previously non-nullable are now nullable. > We have previously been applying non-null to fields too generously, especially on lists. In accordance to the graphql specification, if a non-null field is somehow resolved to null (through error or otherwise) the entire object containing this field will also be set as null. This behavior will then escalate until the next nullable field. We have now changed some fields from being non-nullable to be nullable. This is to better reflect what fields are critical to the encapsulating object. For example, a Product needs to have an article number, so this is set to non-null. Meanwhile, a product is very likely to have a list of images, but if this fails to resolve there is no reason to break the entire Product. In some cases we will have non-critical non-null String fields, these will be defaulted to empty string. ## 2019-02-21 - A `Bestseller` sort order is now available for `products`. - `StockStatus.text` should now adhere to the "mask exact amount" settings. ## 2019-02-20 - Added a `products` query that takes a collection of either article numbers or productIds. ## 2019-02-11 - Bugfix: The `images` collection on `Product` should no longer contain any duplicate entries. ## 2019-02-06 - Added `shuffledToplist` to `recommendedProducts` on `Product`. ## 2019-01-31 - BREAKING CHANGE: The `privateCustomerFields`, `businessCustomerFields`, `privateCustomerConsents` and `businessCustomerConsents` fields on `CountrySettings` are now nullable. ## 2019-01-29 - You should now be able to fetch `Product` by ID in addition to article number. ## 2019-01-24 - `nostoAccountId` should now be available on `ChannelSettings`. - `gtinEan` should now be available on `Product`. ## 2019-01-17 - The `Categories` and `Pages` queries should no longer return categories/pages with display type `API`. ## 2019-01-16 - customer -> orders -> items now has optional "first", "offset" argument. ## 2019-01-16 - Added field `hasVariants` to `Product`. ## 2019-01-07 - The fields `privateCustomerConsents` and `businessCustomerConsents` on `CountrySettings` should now be populated (they were previously mocked). ## 2018-12-19 - field `id` on `Page`, `Product`, `Category` and `StartPage` should now be of the same type `int!`. (Yesterday's change to `ID!` wasn't working quite the way we intended, sorry about that!). ## 2018-12-18 - Added `url` field to `ProductImage`. - Deprecated `sizes` field on `ProductImage`, use `url` in conjunction with the image resizing service instead. - field `id` on `Page`, `Product`, `Category` and `StartPage` should now be of the same type `ID!`. - field `name` on `Page`, `Product`, `Category` and `StartPage` should now be of the same type `String!`. - Bugfix: Products with variants should now correctly inherit previous price from it's cheapest variant. - Added `images` to `ProductVariant`. - Added `includeVariantImages` argument to `images` on `Product` that defaults to true. Set this to false if you prefer to manually collate the `Product` images with the images found on the `ProductVariant`. - Bugfix: `subcategories` on `Category` should no longer include hidden categories. ## 2018-12-13 - Improved performance when fetching categories with subcategories and/or parents. - Added field `hasSubcategories` to `Category`, this can be used to determine if a category has subcategories without fetching the subcategories. ## 2018-12-07 - categories -> products -> filters now has an optional "ids" argument. - `subscribeToStockNotifications` query now has more granular validation errors; `InvalidEmail` and `InvalidArticleNumber`. - categories query input validation will now occur on "root" and "levels" returning InvalidRootArgument and InvalidLevelsArgument respectively. Will only occur if you attempt to overflow an integer though, so shouldn't affect anyone. - Bugfix: `object` field on `Route` should no longer return null when the route exists but the product is hidden. Instead it should return `EmptyRoute`. Thus more accurately resulting in a 404 page rather than the error page.