> ## Documentation Index
> Fetch the complete documentation index at: https://developers.appstle.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Appstle Bundles API changelog

> Dated changes to the Appstle Bundles Admin API, Storefront API and JavaScript events: new fields and values, changed responses, new events, and what to do about each.

This page lists every developer-facing change to the Bundles Admin API, the Storefront API and the storefront JavaScript events, newest first. Each entry is dated the day the change reached production.

* **Additive changes** (new endpoints, new response fields, new optional parameters, new values of an existing field) don't break a client that ignores what it doesn't know. Parse JSON leniently and don't treat enum fields as closed lists.
* Entries tagged **Action required** may need a code change in your integration. Each one says who is affected and what to do.
* When an entry says **bundle rules return** a field, the field is in every bundle rule from the Admin API's `GET /api/external/bundle-rules`, `GET /api/external/bundle-rules/bab` and `GET /api/external/bundle-rules/discount`, and in every Build-a-Box configuration from the Storefront API's `GET /bundles/bb/api/build-a-box/by-token/{token}`, `GET /bundles/bb/api/build-a-box/single-product` and `GET /bundles/bb/api/build-a-box/get-bundle/{handle}` (inside `bundle`).
* The API reference is generated from the live API, so it always shows the current contract. The Admin API base URL is `https://bundles-admin.appstle.com`, and Storefront API paths start with `/bundles/bb/` or `/bundles/cp/`.

**October 29, 2026**

Child product images

## `showChildProductImages`

Bundle rules return `showChildProductImages` (boolean).

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**October 26, 2026**

Edit version

## `editVersion`

Bundle rules return `editVersion` (integer). It starts at `0` and goes up by one each time the rule is saved.

The reference also lists `expectedEditVersion` and `expectedFixedPricingProducts`. The app uses them only when it saves a rule: responses return `expectedEditVersion` as `null` and never include `expectedFixedPricingProducts`.

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**October 23, 2026**

Discount tags

## `discountTags`

Bundle rules return `discountTags` (string), the comma-separated tags the app sets on the rule's Shopify discount. `null` means the app leaves the discount's tags alone, and an empty string means it cleared them.

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**October 20, 2026**

Combo layout, countdown format

## New combo layout, countdown format and free product limit fields

Bundle rules return three new fields: `comboProductLayout` (string), `countdownTimerFormat` (string) and `limitFreeProductToConfiguredQuantity` (boolean).

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**October 15, 2026**

Bundle rules and settings on theme storefronts

## Rules and settings in `window._ABConfig` can arrive after the page loads

On some stores, the Bundles theme embed now starts each page with `window._ABConfig.bundle_rules` empty and only labels in `window._ABConfig.bundle_setting`. It fetches the rest right away. When they arrive, it fills both objects in place and dispatches `appstle-bundles:rules-loaded` on `document`.

* `window._ABConfig.whenConfigReady(callback)` runs `callback` once the settings and the page's rules are in place, or at once on a page that loaded with them. If the fetch fails, it still runs `callback`, with `bundle_rules` empty and only labels in `bundle_setting`.
* `window._ABConfig.loadAllBundleRules()` resolves with every rule once they arrive, or with an empty list if they can't load.

**Who is affected:** theme code that reads `window._ABConfig.bundle_rules` or `window._ABConfig.bundle_setting` as the page loads, including code that reads only the rules for the product on the page.

**Action required:** run that code in `window._ABConfig.whenConfigReady(callback)`. To read every rule, use `await window._ABConfig.loadAllBundleRules()`.

Reference: [Reading bundle configuration](https://developers.appstle.com/bundles/headless-overview.md#reading-bundle-configuration).

**October 14, 2026**

Bundle rules on theme storefronts, combo product choice

## `window._ABConfig.bundle_rules` can load in parts

On some stores, the Bundles theme embed no longer puts every bundle rule in `window._ABConfig.bundle_rules` when the page loads. It can leave out volume discount and Buy X Get Y rules that apply to specific products, unless the page is the product page of one of those products, or one of them is in the cart.

* `window._ABConfig.loadAllBundleRules()` returns a promise that resolves with every rule, at once when the page already has them all. If the rest can't load, it resolves with the rules the page has.
* The embed fetches the rest only when code calls `loadAllBundleRules()`, so call it rather than wait for an event. When the rest arrive, the embed fills `window._ABConfig.bundle_rules` in place and dispatches `appstle-bundles:rules-loaded` on `document`, with no `detail`.

**Who is affected:** theme code that reads volume discount or Buy X Get Y rules from `window._ABConfig.bundle_rules` as the page loads, for example to show bundle discounts on collection pages.

**Action required:** to read every rule, use `await window._ABConfig.loadAllBundleRules()`.

Reference: [Reading bundle configuration](https://developers.appstle.com/bundles/headless-overview.md#reading-bundle-configuration).

## New combo product choice and Buy X Get Y display fields

Bundle rules return two new booleans: `enableComboProductChoice` and `showBuyXGetYVariantsSeparately`.

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**October 12, 2026**

Slider cart

## Slider cart events and JavaScript API

The slider cart is the cart drawer that the **Appstle Slider Cart** app embed adds to a theme. It dispatches these `CustomEvent`s on `document`. Every `event.detail` includes `timestamp` (milliseconds since the epoch).

| Event | `event.detail` |
| - | - |
| `appstle-slider-cart:open` | `cartOpenSource` (string, when known) and, for some opens, `refetchCart` (boolean) |
| `appstle-slider-cart:close` | `timestamp` only |
| `appstle-slider-cart:cart-updated` | `cart`, each time the cart's contents change |
| `appstle-slider-cart:item-added` | `item`, once per added item |
| `appstle-slider-cart:item-removed` | `item`, once per removed item |
| `appstle-slider-cart:checkout-started` | `cart`, just before the shopper goes to checkout |

On the cart page, closing the drawer takes the shopper back to the page they came from, and no `close` event fires.

The slider cart also sets `window.appstleSliderCartApi`:

* `openCart(options)` opens the drawer. Every option is optional: `refetchCart` (boolean) re-reads the cart as the drawer opens, `source` (string) becomes the open event's `cartOpenSource`, and `focusReturnAnchor` (element) gets focus back when the drawer closes.
* `closeCart()` closes the drawer, `refreshCart()` re-reads the cart, and `getCartData()` returns the cart the drawer last read.
* `updateTieredPromotionsBar()` re-reads the cart and updates the tiered promotions bar. Call it after your own code changes the cart. It does nothing when the bar is off.
* `setCheckoutButtonClickHandler(handler)` makes the checkout button call `handler(cart)` and wait for it. Return `false` to stop the checkout, for example when your own validation fails. Pass `null` to remove the handler. `getCheckoutButtonClickHandler()` returns the current one.

To change the drawer's language without a reload, dispatch `appstle-slider-cart:locale-changed` on `document` with `detail.locale` set to the new locale, for example `fr`.

**October 6, 2026**

B2B buyers

## `excludeB2BCustomers`

Bundle rules return `excludeB2BCustomers` (boolean). It's `true` when the merchant has set the rule not to apply to buyers purchasing for a Shopify B2B company.

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**October 4, 2026**

Cart reconcile event

## `appstle-bundles:reconcile`

After a cart change, the Bundles storefront script can change the cart again to keep bundle quantities and discounts in step. It dispatches `appstle-bundles:reconcile` on `window`, so a cart drawer can wait for that before it re-reads the cart.

* `event.detail.state` is `scheduled` when a follow-up change is coming, and `done` when it has finished.
* `event.detail.id` identifies the follow-up. Cart changes made in quick succession share one `id`.

Re-read the cart on `done`. Don't wait for it forever: if it doesn't arrive, re-read the cart after a timeout.

**October 2, 2026**

Purchase options, widget eligibility

## New section purchase option and widget eligibility fields

Bundle rules return two new booleans: `enableSectionPurchaseOptions` and `showWidgetToNonEligibleCustomers`.

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**October 1, 2026**

Purchase types, discount progress bar

## New purchase type and discount progress bar fields

Bundle rules return two new booleans: `allowMixedPurchaseTypes` and `showDynamicBundleDiscountProgressBar`.

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**September 28, 2026**

Untracked stock

## `ignoreChildStockWhenUntracked`

Bundle rules return `ignoreChildStockWhenUntracked` (boolean).

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**September 11, 2026**

Build-a-Box

## Build-a-Box calls return only active bundles

* `GET /bundles/bb/api/build-a-box/by-token/{token}` returns `404` when the bundle's `status` is `DRAFT`. Before, it returned draft bundles too.
* `GET /bundles/bb/api/build-a-box/single-product` leaves out bundles whose `status` is `DRAFT`.

**Who is affected:** storefront code that loads draft Build-a-Box bundles, for example to preview a bundle before it goes live.

**Action required:** handle `404` from the by-token call, and set a bundle's `status` to `ACTIVE` before you load it on the storefront.

Reference: [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md), [Get single-product build-a-box configuration](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-single-product-build-a-box-configuration.md).

**September 10, 2026**

Out-of-stock behavior

## `outOfStockChildBehavior`

Bundle rules return `outOfStockChildBehavior` (string), which is `REMOVE_ITEM_ONLY` or `REMOVE_ENTIRE_BUNDLE`.

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**September 7, 2026**

Combo quantity

## New combo quantity fields

Bundle rules return two new fields: `comboQuantityMax` (integer) and `enableComboQuantitySelector` (boolean).

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**September 4, 2026**

Savings badge labels

## New savings badge label fields

Bundle rules return two new strings: `themeSavingsBadgeLabel` and `themeSubscriptionSavingsBadgeLabel`.

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**September 3, 2026**

Savings badge

## `showThemeProductPriceSavings`

Bundle rules return `showThemeProductPriceSavings` (boolean).

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**September 1, 2026**

Add to cart rules

## `requireCompleteSelectionForAddToCart`

Bundle rules return `requireCompleteSelectionForAddToCart` (boolean).

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**August 28, 2026**

Purchase options

## `enablePurchaseOptionsSelector`

Bundle rules return `enablePurchaseOptionsSelector` (boolean).

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**August 25, 2026**

Fixed bundle subscriptions

## New fixed bundle subscription fields

Bundle rules return two new fields: `disableFixedBundleSubscription` (boolean) and `fixedBundleSubscriptionType` (string), which is `INLINE` or `DEDICATED`.

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**August 24, 2026**

Tier selection

## `disableTierUnselect`

Bundle rules return `disableTierUnselect` (boolean).

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**August 22, 2026**

POS discounts

## `disableDiscountOnPos`

Bundle rules return `disableDiscountOnPos` (boolean).

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**August 20, 2026**

Tier selling plans

## `enableTierSellingPlan`

Bundle rules return `enableTierSellingPlan` (boolean).

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**August 19, 2026**

Markets, sticky bar, tier quantity

## New market, sticky bar and tier quantity fields

Bundle rules return five new fields:

* `allowedMarkets` (string): the Shopify market IDs the rule is limited to, separated by commas. It's empty or `null` when the rule isn't limited to any market.
* `enableStickyBar` (boolean) and `stickyBarButtonLabel` (string).
* `enableTierQuantitySelector` (boolean) and `hideThemeVariants` (boolean).

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**August 18, 2026**

Dedicated subscription layout

## New value `LAYOUT_FOUR` for the dedicated subscription layout

`dedicatedSubscriptionLayout` has a new value, `LAYOUT_FOUR`, next to `LAYOUT_ONE`, `LAYOUT_TWO` and `LAYOUT_THREE`.

**Who is affected:** clients that map `dedicatedSubscriptionLayout` to a fixed list of values.

**Action required:** accept values you don't recognize.

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**August 16, 2026**

Item selection

## New item selection fields

Bundle rules return two new fields: `requireItemSelection` (boolean) and `requireItemSelectionLabel` (string).

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**August 14, 2026**

Bundle title, excluded products

## `excludedProducts` and `hideBundleTitle`

Bundle rules return two new fields: `excludedProducts` (string) and `hideBundleTitle` (boolean).

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**August 13, 2026**

Eligibility, low-stock alerts, volume discounts

## New fields and a new `productSelectionType` value

Bundle rules return 13 new fields:

* Eligibility: `applyDiscountOnlyIfAddedFromWidget` (boolean), `eligibleCollectionData` (string), `eligibleProductSelectionType` (string) and `eligibleVariants` (string).
* Low-stock alert: `enableLowStockAlert` (boolean), `lowStockAlertBackgroundColor` (string), `lowStockAlertLabel` (string), `lowStockAlertTextColor` (string) and `lowStockThreshold` (integer).
* Volume discount variant options: `volumeDiscountLabelOptionNames` (string), `volumeDiscountSplitVariantOptions` (boolean), `volumeDiscountSwatchOptionNames` (string) and `volumeDiscountVariantOptionLayout` (string).

`productSelectionType` has a new value, `ALL_PRODUCTS`, next to `PRODUCT` and `COLLECTION`. The Admin API's `productSelectionType.equals` and `productSelectionType.notEquals` filters accept it too.

**Who is affected:** clients that map `productSelectionType` to a fixed list of values.

**Action required:** accept values you don't recognize.

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**August 11, 2026**

Bundle redirect

## New value `CART_DRAWER` for the bundle redirect

`bundleRedirect` has a new value, `CART_DRAWER`, next to `CART`, `CHECKOUT`, `CUSTOM` and `NONE`. The Admin API's `bundleRedirect.equals` and `bundleRedirect.notEquals` filters accept it too.

**Who is affected:** clients that map `bundleRedirect` to a fixed list of values.

**Action required:** accept values you don't recognize.

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**August 10, 2026**

Countdown timer, discount type

## New countdown timer and discount type fields

Bundle rules return nine new fields:

* Countdown timer: `enableCountdownTimer` (boolean), `countdownTimerMode` (string), `countdownTimerTitle` (string), `countdownTimerDurationMinutes` (integer), `countdownTimerFontSize` (integer), `countdownTimerTextColor` (string) and `countdownTimerBackgroundColor` (string).
* Discount: `buyDiscountType` (string) and `buyDiscountValue` (number). `buyDiscountType` is `PERCENTAGE`, `FIXED_AMOUNT`, `FIXED_BUNDLE_AMOUNT`, `TIERED_DISCOUNT`, `NO_DISCOUNT` or `FREE_GIFT`.

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).

**August 5, 2026**

Purchase type tiers

## `separateTiersByPurchaseType`

Bundle rules return `separateTiersByPurchaseType` (boolean).

Reference: [Get all bundle rules](https://developers.appstle.com/bundles-admin-api/bundle-rules/get-all-bundle-rules.md), [Get build-a-box configuration by token](https://developers.appstle.com/bundles-storefront-api/build-a-box/get-build-a-box-configuration-by-token.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.