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

# Volume Discount / Bundle

> Template for selectable volume bundle offers with quantity tiers, optional discounts, shipping rewards, free gifts, and a card or table storefront widget.

Use **Volume Discount / Bundle** when a merchant wants customers to choose from quantity-based bundle offers on the storefront.

The template card says: "Create selectable bundle offers with optional gifts and shipping rewards." The example shown in AIOD is "Buy 3 items, unlock a bundle offer and free gifts".

## When to use this template

Use this template for:

* Selectable quantity bundles, such as buy `2`, `3`, or `5` items and choose the matching offer.
* Quantity breaks that can apply a percentage discount, fixed discount, shipping reward, or no price discount.
* Bundle tiers that also unlock a free gift.
* Bundle cards with badges such as **Most Popular**.
* A card-style or table-style bundle widget on the storefront.

Use [Tiered/Volume Discount](/docs/templates/tiered-volume-discount) when the promotion is primarily a tiered discount or progress bar based on cart quantity, item quantity, or subtotal. Use [Combined Multi Discounts](/docs/templates/combined-multi-discounts) when the merchant needs independent product, order, gift, or shipping discount blocks under one discount. Use [Buy X @ Fixed Price (Discount)](/docs/templates/buy-x-fixed-price-discount) when a fixed quantity must have one combined fixed price without a selectable bundle widget.

## Entry points

The template and widget cards open the same configuration form.

### Discount Templates

In Shopify admin, open **Apps** > **AIOD Discount & Gift** > **Discount Templates**.

Click **Create** on **Volume Discount / Bundle**. AIOD opens a form titled **Volume Bundle**.

### Discount Widgets

In Shopify admin, open **Apps** > **AIOD Discount & Gift** > **Discount Widgets**.

Click **Create New Widget**, then click **Volume Bundle Widget** under **Ready-Made Widgets**. This shortcut opens the same **Volume Bundle** form. It does not have separate widget-only configuration.

## Top-level controls

The **Volume Bundle** form has three tabs:

| Tab                  | What it controls                                                                                           |
| -------------------- | ---------------------------------------------------------------------------------------------------------- |
| **Offer**            | Target items, bundle tiers, rewards, gifts, title, and schedule.                                           |
| **Advance settings** | Customer eligibility, markets, purchase types, exclusions, combinations, and sales channels.               |
| **Widget design**    | Card or table layout, widget copy, pricing display, colors, typography, container spacing, and custom CSS. |

The right side of the form shows a live widget preview and a **Rule Size** indicator. The observed form showed a Shopify rule limit of `10 KB` and the note **This limit is set by Shopify**.

Use **Previous** and **Next** to move between tabs. The final **Widget design** tab has **Save**.

### Status mode

The top-right status dropdown controls who can use or see the discount.

| Status                          | Meaning                                                                                |
| ------------------------------- | -------------------------------------------------------------------------------------- |
| **Live**                        | The discount is active for customers.                                                  |
| **Testing** or **Testing mode** | The discount is visible to the merchant for testing, but it is not live for customers. |
| **Deactive**                    | The discount is turned off.                                                            |

While creating a new **Volume Bundle**, the observed dropdown showed **Live** and **Testing mode**.

## Offer tab

Use **Offer** to choose the qualifying products, create bundle tiers, configure rewards, and schedule the discount.

### Applies to

The **Applies to:** section chooses which items participate in the volume discount.

| Target                   | Conditional control                                           |
| ------------------------ | ------------------------------------------------------------- |
| **All products**         | No picker. This was selected by default in the observed form. |
| **Specific products**    | Shows **Browse** and an item-selection area.                  |
| **Specific collections** | Shows **Browse** and an item-selection area.                  |
| **Specific variants**    | Shows **Browse** and an item-selection area.                  |

Before a selection is made, the picker says: **No items selected. Click "Browse" to choose.**

### Set up your volume discount offers

Each **Offer** block represents one selectable quantity tier.

Controls in every offer:

* **Quantity** numeric input.
* **Customer gets** dropdown.
* A reward field that depends on **Customer gets**.
* **Show badge**.
* **Add free gift**.
* **Remove offer** for removing the tier.

Click **Add offer** to add another tier.

The observed draft contained two example offers:

| Offer       | Observed values                                                                                                                                         |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Offer 1** | **Quantity** `1`, **Shipping off**, **Reward %** `100`, badge off, and no free gift.                                                                    |
| **Offer 2** | **Quantity** `2`, **Percentage off**, **Reward %** `10`, badge on with **Badge text** `Most Popular`, and a free-gift block with **Gift quantity** `1`. |

Treat these as observed draft values, not required settings.

### Customer gets

The **Customer gets** dropdown has these reward types:

| Reward type          | Fields shown                                                                                |
| -------------------- | ------------------------------------------------------------------------------------------- |
| **Percentage off**   | **Reward** with a `%` suffix.                                                               |
| **Fixed amount off** | **Reward** with a `$` prefix in the observed store currency.                                |
| **Shipping off**     | **Reward** with a `%` suffix. Use `100` for a full shipping discount.                       |
| **No discount**      | No numeric reward input. Use this when the tier only needs another benefit, such as a gift. |

### Badge

Enable **Show badge** to reveal **Badge text**.

The observed badge placeholder and value were `Most Popular`.

### Free gift

Click **Add free gift** inside an offer to add a gift reward to that tier.

The free-gift block includes:

* **Search products**.
* **Browse**.
* An item-selection area that initially says no items are selected.
* **Gift quantity** numeric input. The observed value was `1`.
* **Remove**.

An offer can combine its selected **Customer gets** reward with the free gift. Choose **No discount** when the gift should be the only reward.

### Reward behavior

Choose how AIOD handles multiple unlocked offers.

| Option                         | Behavior                                                                                 |
| ------------------------------ | ---------------------------------------------------------------------------------------- |
| **Only highest unlocked tier** | Only the last or maximum reached tier discount is applied. This was selected by default. |
| **Stack all unlocked tiers**   | All unlocked tier discounts are applied.                                                 |

### Title

The **Title** section has a text input with placeholder `Enter discount title`.

AIOD says this title is shown to customers in cart and checkout.

### Schedule

Choose when the bundle runs.

| Option               | Behavior                                                                |
| -------------------- | ----------------------------------------------------------------------- |
| **Run continuously** | Runs without an end schedule. This was selected by default.             |
| **Set a schedule**   | Reveals **Start date**, **Start time**, **End date**, and **End time**. |

In the observed draft, the scheduled mode prefilled the current date and time as the start and the following day at the same time as the end.

## Advance settings tab

Use **Advance settings** for eligibility, markets, purchase types, exclusions, combinations, and channels.

### Customer eligibility

Options:

* **All customers**. This was selected by default.
* **Specific customers**.

Selecting **Specific customers** reveals a condition builder.

| Condition                        | Operators or fields                                                                                               |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| **Customer tags**                | **matches any of**, **matches all of**, or **does not match any of**. The input placeholder is `eg- VIP, Gold`.   |
| **Customer past orders**         | **equals or greater than**, **equals or less than**, or **equals**. The number placeholder is `eg- 2`.            |
| **Customer email**               | **is any of** or **is not any of**. The input placeholder is `eg- test@example.com`; use **Add** to add an email. |
| **Customer should be logged in** | Requires the customer to be logged in.                                                                            |

For tag conditions, AIOD also shows **Apply discount in cart/website without validation & later validate customer eligibility on checkout**.

Click **Add condition** to add another customer rule.

### Markets

Options:

* **All markets**. This was selected by default.
* **All markets except specific selected countries**.
* **Specific selected countries**.

The two selected-country modes reveal **Countries** and **Browse**.

### Purchase Type eligibility

Options:

* **Both**. This was selected by default.
* **Subscription**.
* **One time purchase**.

When **Both** or **Subscription** is selected, AIOD shows **Limit number of subscription cycles**. Leave it blank to allow all subscription cycles. The field is hidden for **One time purchase**.

### Discount exclusions

Enable **Exclude already discounted items from discount (whose compare at price > selling price)** to ignore items that already have a lower selling price than their compare-at price.

This checkbox was off by default in the observed form.

### How should this discount combine with other discounts?

Read [**This discount can be combined with**](/docs/app/common-template-settings#this-discount-can-be-combined-with) for information about this.

### Sales channel

Choose where the discount can apply:

* **Online store**. Checked by default in the observed form.
* **POS**. Checked by default in the observed form.

When **POS** is checked, AIOD shows an **All locations** control for POS location targeting. The location control is hidden when **POS** is unchecked.

## Widget design tab

Use **Widget design** to configure the customer-facing bundle selector. Start with **Widget layout**.

### Widget layout

Options:

* **Card view**. Selected by default in the observed form.
* **Table view**.

The selected layout changes the available content, color, and typography controls.

### Card view

#### Widget content

Controls:

* **Show title icon**. Off by default.
* **Header title**. Default: `Choose Your Offer`.
* **Subtitle**. Supports adding a link to selected text.
* Per-offer buttons such as **Offer 1** and **Offer 2**.
* **Offer text** for the selected offer. Default: `Buy {{qty}} item`.
* **Reward label** for the selected offer. Default: `{{reward_label}}`.
* **View Available Variables**.
* **Gift section title**. Default: `Free gift with your order`.
* **Locked gift text**. Default: `Locked`.
* **CTA button text**. Default: `Add to cart`.

The **Available Volume Bundle Variables** dialog lists:

| Variable           | Meaning                                                    |
| ------------------ | ---------------------------------------------------------- |
| `{{qty}}`          | The quantity required for the offer tier.                  |
| `{{reward_label}}` | The reward summary, such as `Save 10%` or `Free delivery`. |

#### Pricing and variants

**Pricing** controls:

* **Show prices per item**. Off by default.
* **Hide compare-at price**. Off by default.
* **Show currency prefix**. On by default.

**Variants** includes **Let customers choose different variants for each item**, which was on by default.

**Default selection** chooses which offer is selected when the widget loads. **Offer 2** was selected in the observed two-offer draft.

#### Color theme

AIOD shows five color-theme preset buttons followed by manual controls.

**Offer cards**:

| Control                 | Observed default |
| ----------------------- | ---------------- |
| **Default background**  | `#FFFEF7`        |
| **Default border**      | `#E6E8B2`        |
| **Selected background** | `#FFFFFF`        |
| **Selected border**     | `#B4BC05`        |
| **Corner radius**       | `8px`            |
| **Card padding**        | `8px`            |

**Badge & reward pill**:

| Control               | Observed default |
| --------------------- | ---------------- |
| **Badge background**  | `#B4BC05`        |
| **Badge text**        | `#FFFFFF`        |
| **Reward background** | `#EAEDA9`        |
| **Reward text**       | `#303030`        |

**Button**:

| Control        | Observed default |
| -------------- | ---------------- |
| **Background** | `#303030`        |
| **Border**     | `#303030`        |
| **Text color** | `#FFFFFF`        |
| **Text size**  | `11px`           |

**Gift section**:

| Control               | Observed default                         |
| --------------------- | ---------------------------------------- |
| **Locked background** | `#FFFEF7`                                |
| **Locked border**     | `#E6E8B2`                                |
| **Unlocked border**   | `#B4BC05`                                |
| **Icon color**        | `#272727`                                |
| **Show locked icon**  | On. A **Locked icon** picker is visible. |

#### Typography

The following size and color controls were visible:

| Text             | Observed size | Observed color |
| ---------------- | ------------- | -------------- |
| **Header title** | `13px`        | `#303030`      |
| **Subtitle**     | `13px`        | `#303030`      |
| **Offer text**   | `13px`        | `#303030`      |
| **Gift title**   | `11px`        | `#303030`      |
| **Locked text**  | `11px`        | `#303030`      |

### Table view

Table view replaces the card-specific controls with table-specific settings.

#### Widget content and pricing

Controls:

* **Show title icon**.
* **Header title**. Default: `Choose Your Offer`.
* **Subtitle**.
* Per-offer buttons such as **Offer 1** and **Offer 2**.
* **Quantity text**. Default: `Buy {{qty}} item`.
* **View Available Variables**.
* **Gift section title**. Default: `Free gift with your order`.
* **Locked gift text**. Default: `Locked`.
* **Show prices per item**.
* **Hide compare-at price**.
* **Show currency prefix**. On by default.

The card-view **Reward label**, **CTA button text**, **Variants**, and **Default selection** controls were not visible in the observed table view.

#### Table colors and spacing

| Section          | Control               | Observed default |
| ---------------- | --------------------- | ---------------- |
| **Table**        | **Table border**      | `#E6E8B2`        |
| **Table**        | **Corner radius**     | `8px`            |
| **Header row**   | **Background**        | `#F3F3F3`        |
| **Header row**   | **Cell padding**      | `6px`            |
| **Data rows**    | **Background**        | `#FFFFFF`        |
| **Data rows**    | **Cell padding**      | `8px`            |
| **Gift section** | **Locked background** | `#FFFEF7`        |
| **Gift section** | **Locked border**     | `#E6E8B2`        |
| **Gift section** | **Unlocked border**   | `#B4BC05`        |
| **Gift section** | **Icon color**        | `#272727`        |
| **Gift section** | **Show locked icon**  | On.              |

Table typography includes:

| Text                | Observed size | Observed color |
| ------------------- | ------------- | -------------- |
| **Header title**    | `13px`        | `#303030`      |
| **Subtitle**        | `13px`        | `#303030`      |
| **Header row text** | `13px`        | `#303030`      |
| **Data row text**   | `13px`        | `#303030`      |

### Widget container

Both layouts show the same outer-container controls:

| Control                       | Observed default |
| ----------------------------- | ---------------- |
| **Background color**          | `#FFFFFF`        |
| **Show border around widget** | Off.             |
| **Corner radius**             | `8px`            |
| **Container padding**         | `12px`           |
| **Vertical margin**           | `8px`            |

AIOD says **Vertical margin** adds equal spacing above and below the widget.

### Custom CSS

Use **Custom CSS** for additional widget styling.

The placeholder is:

```css theme={null}
.aiod-volume-widget {
  /* Add your custom styles here */
}
```

## Save

Click **Save** on the **Widget design** tab after reviewing the preview. If Shopify admin shows an **Unsaved changes** bar, its **Save** and **Discard** buttons apply to the current draft changes.
