This page provides information about the 8.21.1 release of the Infosys Equinox Commerce platform. It includes updates for Promotion, CSR Admin, Merchandiser Admin, Inventory Admin, Quote, and Invoice features, as well as open-source vulnerability fixes. For storefront changes, see Frontend Accelerator Release Notes.

09 January 2026 (8.21.1)

The following new features or enhancements have been added to the Infosys Equinox Commerce platform.

Promotion Enhancements

Summed-Up Buy X Get Y Discounts in BOGO Rules

Discounts on Get Y items are applied when the combined value of eligible Buy X items—including both normal products and special products —meets the configured threshold.

For example, a promotion can be configured as: “Spend $300 on eligible Buy X items (normal + bundle products combined) → Get Y item at a discount.

Previously, only 100% discounts (free gifts) were supported. With this enhancement, you can define and apply a percentage discount on Get Y items when the threshold is met.

This capability uses the new action class in the Promotion’s Rule Engine collection property: "className": "com.skava.promotion.ecomm.action.BuyXGetYSummedUpOffer".

Summed-Up Cart Value for GWP (BOGO GWP)

Gift With Purchase (GWP) promotions in BOGO can now be triggered based on the subtotal value of Buy X products, calculated across both normal and special products. When the qualifying cart value threshold is met, one or more gift items can be awarded.

For example, if the combined value of eligible Buy X products (normal + bundle) exceeds $300, the customer receives the configured gift item(s).

This capability uses the new action class in the Promotion’s Rule Engine collection property: "className": "com.skava.promotion.ecomm.action.GiftWithPurchaseSummedUpOffer".

‘AND’ Operator Support for Multiple SKU Conditions in BOGO Offers

The ‘AND’ logic for multiple SKU conditions has been added for BOGO promotions. Previously, a promotion would trigger if any single SKU condition was met. Now, it triggers only when all SKU conditions combined with the AND operator are satisfied.

This update applies to all BOGO types, including Buy X Get Y, Buy X and Y, Gift With Purchase, and bundle variations.

CSR Admin

Cart and BOGO GWP Free Gift Selection

Support has been added for CSR Admins to select free gift SKUs for Cart GWP and BOGO GWP promotions during order creation.

  • A new SELECT GIFT button and Select Gift Items drawer have been introduced in the Order Details section to enforce the maximum allowed gift count or quantity.
  • Selected free gifts are displayed in the cart after all paid items, with options to modify selections and clear error messages when limits are exceeded.

Component-Level Returns for Bundles/Fixed Kit Products

Support has been added to disable component-level returns for bundle and fixed kit products within the CSR Replace/Return flow.

Configuration Details:
In the store property ordersExtension, configure the extension property disableBundleComponentReturn as follows:

  • true: Only the header-level bundle checkbox is shown.
  • false: CSRs can select individual sub-products for replace or return. (Default behavior)

Restriction on Subscription’s Future Date/ Month Tabs

In the Subscription tab of Customers has been updated to restrict changes on future month/date tabs. Customer subscription product information can now be updated only in the Show All tab. On future tabs, actions such as Frequency, Quantity, Remove, Skip, and Scan Card are disabled to prevent unintended changes.

Removed Account and Customer Attributes in Left Menus

The CSR Admin left navigation has been updated for B2C, B2B, and B2B2C stores to remove the Account Attributes and Customer Attributes menus. The navigation structure is now aligned with each store type:

  • B2C: Quick Search, Orders → Create Guest Order, Customers → Create Customer
  • B2B: Quick Search, Accounts → Add New Account
  • B2B2C: Quick Search, Orders → Create Guest Order, Accounts → Add New Account

Customer Phone Number Management with Country Code

Added a Country Code dropdown before the phone number when updating customer address or adding a billing address during payment.

Configuration Details:

The country code is now configurable through the store property phonenumberCountryCode, which accepts a list of all supported country codes. Once configured, these values will appear in the Country Code dropdown within the Add New Address and Add Billing Address drawers.

Merchandiser Admin

Integration with Bynder Digital Asset Management (DAM)

Enabled integration with the Bynder DAM platform to streamline asset management, allowing users to access, manage, and utilize digital assets (such as images, videos, and documents) directly within the application.

Configuration Details:
 
To enable or disable Bynder integration in the store, configure the store property catalogExtension as follows:
{
"enableUploadFromBynder": true,
}
Bynder Integration on Product Detail Page:
  • When Bynder integration is enabled, a dropdown appears under Image and Digital Assets to choose the upload method.
  • Selecting Select from Bynder opens a pop-up displaying assets from the Bynder platform.
  • Users can select assets to link to the product or SKU.
  • After confirmation, the selected images or videos are associated with the product.

Navigation and Product Search Configuration

Control Left Navigation

You can now disable features in the left navigation (for example, hide Price List) or add new menu items by using configurable links. Use the new store property merchandiserNavigationExtension with the following JSON format:

{
"disableFeature": [
    "priceList"
  ],
  "links": [
    {
      "key": "reports",
      "label": "Reports",
      "link": "admin/v2/merchandiser/en",
      "parentLink": "Merchandiser > Pricing",
      "basePage": "/extensions/reports",
      "pageTitle": "Customized Order Report",
      "isVisible": true,
      "embeddedUrl": "https://local..com:5000/admin/v2/nuskinextensions/en/orders/reports"
    }
  ]
}

Configure Product Search

Support has been added to configure Product Search behavior through the store property productsExtension. You can:

  • Define default and additional columns.
  • Enable filter, sort, and search options for each column.

All configurations are managed through JSON:

{
  "dataTable": {
    "defaultColumns": [
      {
        "name": "id",
        "label": "Product ID",
        "type": "number"
      },
      {
        "name": "productName",
        "label": "Product Name",
        "type": "string"
      },
      {
        "name": "productType",
        "label": "Product Type",
        "type": "enum",
        "path": "producttype",
        "enableFilter": true,
        "enableSort": true,
        "enableSearch": true,
        "filterSelectOptions": [
          { "label": "Bundle", "value": "bundle" },
          { "label": "Fixed Bundle", "value": "fixedpricebundle" },
          { "label": "Kit", "value": "kit" },
          { "label": "Fixed Kit", "value": "fixedkit" },
          { "label": "Collection", "value": "collection" }
        ]
      },
      {
        "name": "status",
        "label": "Status",
        "type": "enummultiselect"
      },
      {
        "name": "brand",
        "label": "Brand",
        "type": "string"
      },
      {
        "name": "skuId",
        "label": "SKU ID",
        "type": "string"
      },
      {
        "name": "skuName",
        "label": "SKU Name",
        "type": "string"
      },
      {
        "name": "createdBy",
        "label": "Created By",
        "type": "enum",
        "path": "producttype",
        "enableFilter": true,
        "enableSort": true,
        "enableSearch": true,
        "filterSelectOptions": [
          { "label": "Bundle", "value": "bundle" },
          { "label": "Fixed Bundle", "value": "fixedpricebundle" },
          { "label": "Kit", "value": "kit" },
          { "label": "Fixed Kit", "value": "fixedkit" },
          { "label": "Collection", "value": "collection" }
        ]
      }
    ],
    "additionalColumns": [
      {
        "name": "updatedBy",
        "label": "Updated By",
        "type": "number"
      },
      {
        "name": "price",
        "label": "Price",
        "type": "enum",
        "path": "producttype",
        "enableFilter": true,
        "enableSort": true,
        "enableSearch": true,
        "filterSelectOptions": [
          { "label": "Bundle", "value": "bundle" },
          { "label": "Fixed Bundle", "value": "fixedpricebundle" },
          { "label": "Kit", "value": "kit" },
          { "label": "Fixed Kit", "value": "fixedkit" },
          { "label": "Collection", "value": "collection" }
        ]
      }
    ]
  }
}

Configurable Price Actions and Grid Enhancements

Added pricesExtension support to the Merchandiser Admin Prices page to tailor actions and grid configuration per store.

  • Allow hiding Import, Export, and Add SKU action buttons.
  • Allow adding new global action buttons with configurable behavior, such as “Resend Price Update,” with success and failure notifications.
  • Enable configuration of default columns in the Prices grid, such as SKU ID, status, updated by, start/end date, quantity, and price fields.
  • Allow adding custom fields to the Add New Price drawer, such as Original Price.

Configure the pricesExtension store property for the required price list to apply these changes:

{
  "disableImport": true,
  "disableExport": false,
  "disableAddSku": true,
  "actions": [
    {
      "event": "global",
      "type": "resendPriceUpdate",
      "label": "Resend Price Update",
      "onSuccess": {
        "component": "Notification",
        "message": "Price update resent successfully."
      },
      "onFailure": {
        "component": "Notification",
        "message": "Failed to resend price update."
      }
    }
  ],
  "dataTable": {
    "defaultColumns": [
      { "type": "string", "name": "skuId", "label": "SKU ID" },
      { "type": "string", "name": "status", "label": "Status" },
      { "type": "string", "name": "updatedBy", "label": "Updated By" },
      { "type": "date", "name": "startTime", "label": "Start Date" },
      { "type": "date", "name": "endTime", "label": "End Date" },
      { "type": "number", "name": "minqty", "label": "Min.Qty" },
      { "type": "number", "name": "maxqty", "label": "Max.Qty" },
      { "type": "number", "name": "transactionalPrice", "label": "Transaction Price" },
      { "type": "number", "name": "bundlePrice", "label": "Bundle Price" },
      { "type": "number", "name": "subscriptionPercentage", "label": "Subscription %" }
    ]
  },
  "addNewPriceAdditionalFields": [
    { "type": "number", "name": "originalPrice", "label": "Original Price" }
  ]
}

Configurable Category Actions and Grid Enhancements

Added a configurable categoriesExtension for the Merchandiser Admin Categories page.

  • Show or hide the Import, Export, and Create Category buttons through configuration.
  • Configure grid columns for categories, such as Name, Semantic ID, Visible, and Status.
  • Configure fields in the Create Category drawer, such as Category ID, Category Name, Parent Category, and Description.
  • Support custom bulk actions, including a Refresh Products action that triggers a MERCH_ADMIN reindex and displays success or error messages.
"hideImport": false,
  "hideExport": false,
  "hideCreateCategory": false,
  "displayCategoryColumns": [
    {
      "label": "Name",
      "key": "name",
      "node": "",
      "type": "tree",
      "size": 6
    },
    {
      "label": "Semantic ID",
      "key": "semantic-id",
      "node": "",
      "type": "chip",
      "size": 4
    },
    {
      "label": "Visible",
      "key": "visible",
      "node": "",
      "type": "chip",
      "size": 1
    },
    {
      "label": "Status",
      "key": "status",
      "node": "",
      "type": "chip",
      "size": 1
    }
  ],
  "hideFieldsForCreateCategory": [
    "categoryName",
    "categoryId",
    "parentCategory",
    "description"
  ],
  "actions": [
    {
      "type": "bulkAction",
      "label": "Refresh Products",
      "method": "POST",
      "event": "global",
      "apiUrl": "https://eq-stg-qaapi.eqcmrc.com/admin/services/feeds/reindexer",
      "requestModel": {
        "queryParams": {
          "storeId": "$.storeId",
          "businessId": "$.businessId",
          "collectionId": "$.collectionId",
          "indexerType": "MERCH_ADMIN"
        },
        "postBody": {}
      },
      "onSuccess": {
        "showToastMessage": "Product Data refresh started"
      },
      "onFailure": {
        "showToastMessage": "Error while refreshing products"
      }
    }
  ]
}

Inventory Actions and Grid Configuration Enhancements

Introduced the store property InventoryExtension to control inventory features in Merchandiser Admin.

  • Allow hiding Import, Export, Create Bin, and Add SKU buttons on Bin Lists and Stock by SKU pages.
  • Introduced configurable custom action buttons (for example, bulk actions such as “Refresh Products”) with support for HTTP method, API URL, request model, and success/failure toast messages.
  • Enabled configuration of visible grid columns using displayBinColumns and displaySkuColumns.
  • Allow hiding specific fields in Create Bin and Add SKU drawers using hideFromBinListForm and hideFromSkuListForm.

Configure the InventoryExtension store property with the JSON value given below:

{
  "disableImport": false,
  "disableExport": false,
  "disableCreateBin": false,
  "disableAddSku": false,
  "displayBinColumns": [
    {
      "accessorKey": "name",
      "header": "Bin Name",
      "id": "name"
    }
  ],
  "displaySkuColumns": [
    {
      "accessorKey": "atpQty",
      "header": "ATP Qty",
      "id": "atpQty"
    }
  ],
  "hideFromBinListForm": [
    "binId",
    "binDescription"
  ],
  "hideFromSkuListForm": [
    "atpQty",
    "preOrderQty"
  ],
  "actions": [
    {
      "type": "bulkAction",
      "label": "Refresh Products",
      "method": "POST",
      "event": "global",
      "apiUrl": "https://eq-stg-qaapi.eqcmrc.com/admin/services/feeds/reindexer",
      "requestModel": {
        "queryParams": {
          "storeId": "$.storeId",
          "businessId": "$.businessId",
          "collectionId": "$.collectionId",
          "indexerType": "MERCH_ADMIN"
        },
        "postBody": {}
      },
      "onSuccess": {
        "showToastMessage": "Product Data refresh started"
      },
      "onFailure": {
        "showToastMessage": "Error while refreshing products"
      }
    }
  ]
}
Explanation: The value true hide the specific action button(s) and the value false shows the action button(s). For example, to show the action buttons:
Configure Purpose
"disablelmport": false,
To show the Import button.
"disableExport": false,
To show the Export button.
"disableCreateBin":false,
To show the Create Bin button.
"disableAddSku": false,
 
{
      "type": "bulkAction",
      "label": "Refresh Products",
      "method": "POST",
To add the options under Actions menu; for example, Refresh Products.
"displayBinColumns": [
    {
      "accessorKey": "name",
      "header": "Bin Name",
      "id": "name"
    }
  ],

To display specific columns in the grid, configure the displayBinColumns property. For example, if you add only the Bin Name column in the configuration, only that column will appear in the grid. If displayBinColumns is not configured, all columns will appear by default.

Settings Admin

Multi‑Locale Editing for Product and Category Attributes

This enhancement enables locale‑specific editing across product and category attributes, associated data models, and attribute values.

  • Translate ON: Displays a two‑column layout with the default locale and the selected locale for efficient comparison and translation.
  • Translate OFF: Displays only default locale fields for simplified editing.

Technology Maintenance and Upgrades

Open-Source Library Vulnerability Fixes

The following table summarizes the open-source library vulnerability fixes in this release:
Category Prisma Snyk
Unique vulnerabilities patched 136 15
Total vulnerabilities closed 1,047 310
Severity breakdown:
Critical 96 0
High 368 141
Medium 399 169
Low 184 0

Revision History
2026-01-09 | JP – Added Release 8.21.1 content.