> For the complete documentation index, see [llms.txt](https://help.pagefly.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.pagefly.io/cart-drawer/components/bundle-offers.md).

# Bundle offers

Bundle Offers suggests a discounted bundle of products inside the cart drawer — for example, "Add all 3 for 15% off." It has two parts: the component you place in the drawer, and the actual bundle definitions, which live on a separate **Bundles** page.

Like Reward Ladder, this applies a real discount at checkout — read this whole page before you publish, not just the inspector's warning banners.

### Bundle Offers is experimental

The first time you try to add Bundle Offers to a drawer, you'll see a confirmation:

> **Enable Experimental mode?** "Bundle Offers" is experimental. When you publish, it creates a real Shopify discount that applies at checkout. Turn on Experimental mode to add it. You can turn it off anytime in the Settings tab.

Click **Enable and add** to continue. You can turn Experimental mode back off later from the drawer's **Settings** tab — doing so removes access to any experimental components, including Bundle Offers. If you turn off Experimental mode while a bundle is still in a published drawer, treat it the same as removing the component (see **Turning it off** below) — republish afterward to be sure the discount actually stops.

### Grant permissions

Like Reward Ladder, Bundle Offers needs additional Shopify permissions before it can apply a discount at checkout. The inspector shows the same **"Permissions needed"** banner with a **Review permissions** button.

<figure><img src="/files/Iojig2lINenlsxb2x0E7" alt=""><figcaption><p>Bundle Offers inspector, with the real-discount and permissions notices</p></figcaption></figure>

Until permissions are granted, the required Shopify access scopes are:

* `read_cart_transforms` / `write_cart_transforms` — lets PageFly rewrite the cart at checkout so the bundle shows as one discounted line, instead of separate full-price items.
* `read_discounts` / `write_discounts` — lets PageFly register the actual discount that gets applied.

Both pairs are required together. Granting only the cart-transform scopes (or only the discount scopes) still leaves the bundle non-functional at checkout, even though it will preview correctly in the builder.

### Set the bundle source

In the inspector, **Bundle source** is set to **Manual (merchant-curated)** — currently the only option. If you haven't created any bundles yet, you'll see "No bundles for this source yet." Click **Manage manual bundles** to go to the Bundles page.

### Create a bundle

On the Bundles page, click **Create your first bundle** (or **New bundle** if you already have others). Define which products belong in the bundle and the discount it offers.

<figure><img src="/files/EytHGaYTJy5SJQG3HD4H" alt=""><figcaption><p>Bundles page — showing a permissions error before scopes are granted</p></figcaption></figure>

{% hint style="info" %}
**Unverified:** Reward Ladder's Configure dialog has a "Combine with other discounts" toggle and a per-tier optional discount-code field (see [Reward Ladder](/cart-drawer/components/reward-ladder.md#discount-behavior-settings-in-configure)) — both change whether a discount applies automatically or stacks with other discounts. This page hasn't confirmed whether the bundle-creation form has equivalent settings, since the permissions error above blocked access to that form during review. Check the bundle-creation form directly for a combine/stacking option before assuming a bundle discount will or won't stack with other active discounts.
{% endhint %}

{% hint style="warning" %}
**If you see a "Re-authorization required" error** listing `write_cart_transforms`, `read_cart_transforms`, `write_discounts`, `read_discounts` — this means the bundle can't read or write Shopify's discount/cart-transform data yet. Go back to the drawer's Bundle Offers inspector and click **Review permissions** to grant the missing scopes, then return to the Bundles page.
{% endhint %}

Once you have at least one bundle, use **Sync to Shopify** on the Bundles page if changes don't appear to take effect immediately — bundle data and the live Shopify discount are two separate records that need to be kept in sync explicitly, they don't update automatically the instant you edit a bundle.

### Style the bundle card

Back in the drawer's Bundle Offers inspector:

* **Layout framing** — Row (default), List, Steps (regimen), Carousel, Image-lead, or Card-stack.
* **Elements** — style price & savings, the add button, and feedback messaging independently.
* **Style overrides per state** — set different styling for empty, loading, and error states.

### Turning it off

A bundle's discount stays active at checkout for as long as the drawer that contains the Bundle Offers component is published — not just while the component is visible in the drawer, and not just while the individual bundle is "enabled" on the Bundles page. To fully stop a specific bundle from discounting at checkout:

* **Remove the Bundle Offers component from the drawer and republish**, if you want to stop all bundles at once but keep the rest of the drawer live. Both publish and unpublish re-check whether the component is still present and end the discount the moment it isn't — this is a reliable, verified path.
* **Delete or disable the individual bundle on the Bundles page**, then use **Sync to Shopify**, if you only want to stop one bundle while keeping others active.
* **Unpublish the drawer entirely** via **Unpublish Smart Cart** if you want to stop everything the drawer does, not just Bundle Offers. See [Publish and manage your drawer](/cart-drawer/publish-and-manage-your-drawer.md).

{% hint style="danger" %}
**Turning off only the theme app embed does NOT stop the discount.** The embed toggle only controls whether the drawer is *visible* on your storefront — it has no effect on the underlying cart-transform/discount, which keeps applying at checkout regardless of the embed state.
{% endhint %}

You can independently confirm a bundle discount has stopped in **Shopify Admin → Discounts** — look for an automatic discount named **"PageFly Smart Cart Bundles"**. Its status will show **Expired** once removed or unpublished (PageFly ends the discount rather than deleting it, so the entry stays visible in your discount list for your records).

### Publish

Bundle discounts only apply at checkout after you publish the drawer. See [Publish and manage your drawer](/cart-drawer/publish-and-manage-your-drawer.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://help.pagefly.io/cart-drawer/components/bundle-offers.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
