Volume, BOGO and bundles
Set up quantity discounts, buy X get Y and bundle deals on a cart, and decide which one wins when more than one could apply.
What offers are
An offer is a discount on the products in the cart. There are three kinds:
- Volume — buy more of one product, pay less. "10% off when you have 3 or more."
- Buy X get Y — buy some products, get others at a discount. "Buy 2, get 1 free."
- Bundle — a discount when a set of products are all in the cart together.
Offers are worked out by the app's own automatic discount, which appears in your Shopify admin under Discounts as Sofcy Cart Rewards. When you publish a cart that has offers, the app creates or updates that discount for you. You do not create anything in Shopify yourself.
The cart drawer also shows the offer's name and the amount next to the line it discounted, for example Bulk shirts −$6.00. The drawer and the checkout use the same rule, so the offer the shopper is shown is the offer they get.
One cart line gets one offer, never two. Shopify applies a single product discount per line anyway, so the app decides the winner up front — that is what lets the drawer name the offer before checkout runs.
Add an offer
- Open the cart you want to work on. You land on the Cart builder screen.
- In the See it and style it section, choose Offers.
- Go to Add an offer and pick a Type: Volume, Buy X get Y, or Bundle.
- Type a Name. Shoppers see this in the cart, so name it the way you would describe it to them.
- Fill in only the fields your chosen type uses. The form shows the fields for all three types at once — see the table below for which is which.
- Set Discount (%). It is a whole number from 1 to 100. 100 makes it free.
- Choose Add offer. The offer appears in the numbered list higher up the screen.
- Publish the cart. Nothing reaches your storefront until you do.
If something is wrong, the screen tells you at the top and does not save the offer — for example a bundle with only one product, or a quantity break of 1.
The fields on the Add an offer form
| Field | Used by | What to put in it |
|---|---|---|
| Type | All | Volume, Buy X get Y, or Bundle. |
| Name | All | A short shopper-facing name. It must be different from your other offers on this cart, because it is how the drawer says which offer applied. |
| Product IDs (volume and bundle) | Volume, Bundle | Comma separated numbers — the number at the end of the product's admin URL. A bundle needs at least two. |
| Quantity break starts at (volume) | Volume | The quantity at which the discount kicks in. Two or more. |
| Buy these products | Buy X get Y | Product IDs the shopper has to buy. |
| Buy how many | Buy X get Y | How many they must buy. At least 1. |
| Get these products | Buy X get Y | Product IDs that get discounted. |
| Get how many | Buy X get Y | How many units they get at the discount. At least 1. |
| Discount (%) | All | A whole number, 1 to 100. For a volume offer this is the percentage for that quantity break. |
How each type is worked out
Volume
Every line in the cart whose product is in your list is checked against the quantity break. If the line reaches it, the whole quantity on that line is discounted by your percentage.
Buy X get Y
The app adds up the quantity of the "buy" products in the cart and works out how many complete sets the shopper has. Each set earns the "get" quantity at your percentage.
When the buy products and the get products are the same product, the free units are counted in as well. "Buy 2, get 1 free" on a cart of 6 gives 2 free units, not 3 — the free unit does not itself count towards the next "buy 2".
Bundle
Every product you listed must be in the cart. If one is missing, nothing is discounted. When they are all there, your percentage comes off each of those lines, at their full quantity.
Discounts are rounded down to the nearest penny or cent, so a percentage never comes out a fraction higher than you set.
The order of the list matters
The offers on the screen are numbered, and that order is a real setting rather than a display choice. The app goes down the list in order. The first offer that matches a line claims it, and every offer below is skipped for that line. It is not "whichever is biggest".
So if you set up "10% off at 3 or more" and "20% off at 6 or more" on the same shirt, and the 10% offer is higher in the list, a shopper with 6 shirts gets 10%. Put the bigger one first.
Each offer in the list has two buttons:
- Move up — moves the offer one place up the list. It is greyed out on the offer at the top.
- Delete — removes the offer.
Moving an offer up changes who it reaches, exactly as changing its percentage would. Publish and re-check after reordering.
Offers and your reward tiers
Offers and the rewards bar tiers are two different things and they can both apply to one cart. Tiers discount the order total; offers discount individual product lines. They do not compete with each other — only offers compete with other offers.
Two things are worth knowing:
- An offer on its own is enough. You do not need any reward tiers — a cart with only a volume offer still gets its discount created when you publish.
- The exclusion settings on the Rewards bar screen (gift cards, digital products, on-sale items, product IDs, product types, vendors) apply to tiers only. They do not hold offers back. A product you excluded from your rewards bar can still be discounted by an offer, so exclude it by simply not listing it in the offer.
The Can combine with checkboxes on the Rewards bar screen decide whether this app's discount stacks with your other Shopify discounts. They are not about offers versus tiers.
Limits
- A cart can carry up to 20 offers. The heading on the screen shows how many you have used.
- Offers travel inside the configuration written into every page of your storefront, so each one adds a little page weight for every shopper.
Limitations
Things a merchant reasonably expects that this screen does not do yet:
- You cannot edit an offer. There is no edit button — delete it and add it again. Names have to be unique, so delete the old one first.
- There is no "move down" button. To push an offer down, move the one below it up.
- One quantity break per volume offer. The form saves a single break. For a 3-for-10% and 6-for-20% ladder you add two separate offers, and you must put the higher quantity first or it will never fire.
- No product picker. You type product ID numbers by hand, copied from the end of the product's admin URL. There is no search or browse, and no way to pick a specific variant from this screen — offers match on the product, so every variant of a listed product is included.
- Percentages only. There is no fixed-amount ("$5 off") or free-shipping offer here. Use 100% for free.
- The screen does not warn you when one offer is blocking another. If a lower offer never fires because a higher one claimed the line first, nothing on the screen says so today. Check the order yourself.
- The preview screen will not show your offers. Its sample cart uses made-up products with no product IDs, so no offer can match them. Test on your live storefront after publishing.
- The size warning on the Rewards bar screen does not count your offers. Discount rules have a 10,000-byte ceiling from Shopify; long product lists in offers count towards it but the meter on that screen measures only tiers and exclusions, so an oversized offer list is caught at publish rather than warned about earlier.
- No reporting per offer. Nothing measures how much each offer earned or how often it fired. Sending cart events on to GA4 or Meta is also not available yet, so you cannot measure offers there either.
- No plan restriction is applied to offers today. Every plan can use this screen. That could change, and this page will say so if it does.
Offers are part of the cart's draft until you publish it, and they show up in the change list on the way. See Publishing and version history for what happens when you publish, and Rewards bar for the tier discounts that sit alongside these.