You can run "buy one, get the second 50% off" natively in Shopify, and the cleanest way is a Buy X Get Y discount: the customer buys one item at full price, and the second qualifying item is set to 50% off. There is also a second native route, an "amount off products" discount with a minimum quantity, but it discounts every qualifying unit rather than only the second, so it is usually the wrong tool for this exact offer. Native works for a single pair, but it has real limits: it does not cleanly repeat across many pairs in a large cart, its targeting of the "second" item is coarse, and it can conflict with your other discounts because Shopify only allows one product discount per cart line.
This guide covers both native methods step by step, explains the "do not discount first N quantities" mechanic that powers the offer, shows exactly where native breaks with a worked example and a table, and lays out the Shopify Functions approach when you need the offer to repeat and stack reliably.
Can you do "buy one, get the second 50% off" in Shopify natively?
Yes. Shopify gives you two native discount types that can express some version of this offer, and it helps to be precise about what each one actually does, because they are not interchangeable.
The first is Buy X Get Y (Shopify calls it "Buy X get Y" in the admin, and BXGY in the developer API). This is the correct native tool for "second one half off," because it separates the items a customer buys at full price from the items they get at a discount. You tell it the customer buys 1 and gets 1 at 50% off, and Shopify does exactly that.
The second is Amount off products with a minimum purchase quantity. This one is tempting because you can say "buy 2, get 50% off," but read the fine print: it discounts all the qualifying units, not just the second. "Buy 2, 50% off" here means both items are half price, which is a 25% effective discount on the pair, not "one full price and one half price." That is a different offer, and mistaking one for the other is the most common way merchants get this wrong.
So the honest answer is: use Buy X Get Y for a true "second item 50% off," understand that Amount off products behaves differently, and know that both hit limits once your cart grows beyond a single pair.
IMAGE PLACEHOLDER (Image 1): Two native routes to a second-item discount
Suggested visual: A clean 16:9 diagram on a white background with two labeled paths. Left path "Buy X Get Y" shows two product cards, the first at full price with a small "you buy" tag and the second stamped "50% off" with a "you get" tag. Right path "Amount off products, min qty 2" shows two identical cards both stamped "50% off" with a caption "discounts every unit." A center label reads "same words, different math." Flat vector style, brand colors violet and gold, sans-serif labels, no photography.
Method 1: Buy X Get Y, the reliable native way
Buy X Get Y is built for exactly this shape of promotion. According to Shopify's developer documentation, a BXGY discount stores a "customer buys" set (the items and quantity a shopper must purchase) and a "customer gets" set (the items and quantity that receive the discount, at a percentage you choose). Setting the "get" percentage to 50% is what turns it into "second one half off."
Set it up in the admin
- In your Shopify admin, go to Discounts and click Create discount, then choose Buy X get Y.
- Under Customer buys, set the minimum quantity of items to 1, and choose the products or collections that qualify. If you want the deal to work on any item in a group, scope it to a collection.
- Under Customer gets, set the quantity to 1 and choose the same products or collection so the "get" item comes from the same pool.
- For the discounted value, choose Percentage and enter 50%.
- Under Maximum number of uses, decide whether the offer can apply more than once per order. This single setting is where the "does it repeat" question lives, and we will come back to it in the limits section because it is the crux of the whole article.
- Set your Combinations (whether this can stack with product, order, or shipping discounts), your active dates, and save.
The result: a customer with two qualifying items in the cart pays full price for one and half price for the other. Shopify applies the discount to the lower-priced qualifying item in the "get" set by default, so the customer keeps the more expensive item at full price. That is the standard and fair behavior for a "second item" deal, but it is also a constraint you cannot fine-tune natively, which matters if you specifically want the cheaper item full price and the pricier one discounted.
Why this is the "do not discount first N quantities" trick
Here is the mechanic the topic is named after. In Buy X Get Y, the "customer buys" quantity is the quantity you refuse to discount. When you say "buy 1, get 1 at 50%," you are telling Shopify: do not discount the first unit, then discount the next one. Set "buy 2, get 1 at 50%" and you are saying "do not discount the first two quantities, then half-price the third." The buy-quantity is the skip-first-N control, even though the admin never uses those words.
This framing is useful because it maps directly onto how third-party discount apps describe the same idea. Apps like Regios or Checkout Boost expose an explicit "skip first N quantities" or "eligible quantity above a threshold" toggle. Native Shopify does not give you that exact slider on an amount-off discount, but Buy X Get Y gives you the same outcome through the buy-quantity. If you have seen the phrase "do not discount first N quantities = 1" in a forum thread, that is a one-line description of a buy-1-get-1 BXGY offer.
Method 2: Amount off products with a minimum quantity (and why it is not the same offer)
The second native route looks close but computes differently, and it is worth understanding so you do not ship the wrong promotion.
An Amount off products discount can require a minimum quantity. Shopify's API models this as a minimum-quantity requirement, and the documentation gives the canonical example of a "Buy 3, Get 10% Off" promotion where the minimum quantity is set to 3. The key detail: once the cart meets the minimum, the percentage applies to all qualifying units, not to the units above the threshold.
So if you build "Amount off products, minimum quantity 2, 50% off," a customer buying two items gets 50% off both. That is generous, and sometimes it is what you want, but it is not "buy one get the second half off." It is "buy two, both half price." On a $40 item, the true second-item offer charges $40 + $20 = $60, while the amount-off-min-2 version charges $20 + $20 = $40. That $20 gap per pair is exactly the margin you did not intend to give away.
There is no native toggle on Amount off products that says "apply the discount only to the units beyond the minimum." That capability, the literal "do not discount the first N," is what apps add. Natively, if you want only the second unit discounted, Buy X Get Y is the tool, and Amount off products is not.
Where native breaks: the limits you will hit
Native Buy X Get Y handles a single, simple pair beautifully. The trouble starts as soon as your cart or your promotion gets more ambitious. Here are the four walls merchants run into, all of them real and worth knowing before you launch.
1. It does not cleanly repeat across many pairs
This is the big one. A customer who wants your "second one 50% off" deal rarely stops at two items. They add six. Now the question is whether the discount applies to the 2nd, 4th, and 6th items (three half-price units) or just once (one half-price unit, the rest full price).
Native Buy X Get Y controls this through a single maximum uses per order setting. If you leave it uncapped, Shopify will try to reapply the buy-get set as quantities grow, but this behavior is coarse and gets unpredictable across mixed products, variants, and collections. If you cap it, the deal fires exactly once and the 4th and 6th items pay full price, which frustrates customers who expected every pair to qualify. There is no native "recalculate cleanly per pair, forever, across any mix of eligible items" mode. Merchants on the Shopify forums repeatedly ask for exactly this repeat behavior ("buy 6 get 2, buy 9 get 3") and find native cannot express it reliably.
2. You cannot finely target which item is the "second"
Native BXGY discounts the lower-priced qualifying item in the "get" set, which is usually the sensible default. But if your promotion needs different logic, for example always discount the most expensive item, or always the item from a specific sub-group, native does not give you that control. You get Shopify's built-in targeting or nothing.
3. The 100-product ceiling on Buy X Get Y
Native Buy X Get Y limits how many products you can attach to a single discount. Once your eligible set passes roughly 100 products, the admin stops letting you add more, so a storewide "any item, second one half off" across a 400-SKU catalog cannot be built as one native discount. The usual workaround, scoping to a collection, helps only if your entire eligible catalog fits in collections you are willing to maintain by hand. We cover this ceiling in depth in the linked article below.
4. It can conflict with your other discounts
Buy X Get Y is a product-class discount. So is a volume discount, a percentage off a collection, and most "sale" pricing. According to Shopify's developer documentation, by default only one product discount applies per cart line. If a customer's item qualifies for both your "second one 50% off" deal and a separate "20% off this collection" sale, the two are both product discounts, so they will not stack on the same line. Shopify keeps the one worth more and silently drops the other.
Stacking a second product discount onto the same line is possible, but only on Shopify Plus, and only through a tag-based, two-way-match mechanism Shopify calls same-line stacking. On any non-Plus plan, treat "my BOGO plus another product discount on the same item" as off the table, and design around it. Cross-class stacking (your BOGO plus an order discount plus free shipping) works on every plan, as long as each offer is set to combine.
IMAGE PLACEHOLDER (Image 2): Where native BOGO breaks
Suggested visual: A 16:9 illustration showing a shopping cart with six identical shirts. Above it, two labeled outcomes. "Native, capped at one use" highlights only the 2nd shirt with a 50% badge and the other five at full price, marked with a small red flag. "What shoppers expect" highlights the 2nd, 4th, and 6th shirts each at 50%, marked with a green check. A caption below reads "native applies the pair once, not per pair." Flat vector style, brand colors violet and gold, no photography.
Worked example: six shirts, one "second one 50% off" offer
Let us make the repeat problem concrete. A store sells shirts at $40 each and runs "buy one, get the second 50% off." A customer adds six shirts, a $240 subtotal before any discount. Here is how the same promotion pays out three different ways.
Read that table slowly, because every row is a different promise. The capped native BXGY under-delivers: the customer expected three half-price shirts and got one, so they feel shortchanged and may abandon. The Amount off products version massively over-delivers: it half-prices all six shirts, handing away $120 when you meant to give $60. Only the repeat-aware version pays out what "buy one, get the second half off" actually means at scale: every pair gets the deal, the store gives away exactly $60, and the customer gets exactly what the banner promised.
The gap between $220, $180, and $120 on a single six-item cart is the entire reason this offer is harder than it looks. Native forces you to choose between under-delivering and over-delivering, and neither is what you advertised.
The Functions way: a BOGO that repeats and stacks correctly
The reliable fix is to compute the offer inside Shopify's own checkout pipeline with a Shopify Function, so the math runs server-side and applies the same way on the cart page, the checkout page, and accelerated checkouts like Shop Pay. A Functions-based discount can express the logic native cannot: reapply the buy-get set for every pair in the cart, target the cheapest or a specific item, cover an unlimited eligible catalog, and honor your combination rules precisely.
This is the model Stackable is built on, and it stays honest about Shopify's real rules rather than pretending the platform limits do not exist.
Run this reliably with Stackable
- Repeat logic that recalculates per pair. Turn on repeat and "buy 1, get 1 at 50% off" reapplies as the cart grows, so a six-item cart gets three half-price items automatically, not one. The same setting scales a "buy 6, get 2" promo to "buy 12, get 4."
- No 100-product ceiling. Define eligible items by tag or collection with no upper bound, so a storewide "second one half off" covers a 400-SKU catalog as a single campaign, and new products opt in automatically.
- Cheapest-item targeting you can trust. The discount marks the lowest-priced eligible item as half price and updates live as the cart changes, so the customer always keeps the pricier item at full price.
- Combination switches that match Shopify one to one. Each offer has three combine toggles, one each for product, order, and shipping discounts, so what you set is what checkout does. Same-line product-on-product stacking is still Plus-only, and the app tells you that plainly rather than hiding it.
- One total everywhere. Because the math runs in a Shopify Function, the cart preview and the final charge cannot drift apart, including on Shop Pay, Apple Pay, and Google Pay. Stackable never rewrites your product prices, so uninstalling leaves your catalog exactly as it was.
Install Stackable free and see your "second one 50% off" pay out correctly on every pair at usestackable.com/pricing.
How to set up "second one 50% off" step by step
Whether you go native or Functions-based, this sequence keeps you out of trouble.
1. Write down the exact promise
Decide precisely what "buy one, get the second 50% off" means for your store. Does it repeat on every pair, or fire once per order? Does it apply to any item, or only a collection? Which item gets discounted, the cheaper or the pricier? Answering this first tells you whether native BXGY is enough or whether you need repeat logic.
2. Pick the right native type
Use Buy X Get Y for a true second-item discount, with the buy-quantity acting as your "do not discount first N" control. Avoid Amount off products with a minimum quantity unless you genuinely want every qualifying unit discounted, because it will half-price the whole set, not just the second item.
3. Decide the repeat behavior deliberately
Set the maximum-uses-per-order value on purpose, not by accident. Capped means one half-price item per order. Uncapped native repeat is coarse across mixed carts. If you need clean per-pair repeat across a large or mixed cart, that is the signal to move to a Functions-based app.
4. Set combinations, then respect the per-line rule
In the Combinations section, choose which classes this offer stacks with. Remember that another product discount will not stack on the same cart line unless you are on Shopify Plus. If you run both a collection sale and this BOGO, decide which one you want to win, because native will keep only the higher-value one per line.
5. Test a two-item cart and a six-item cart
Build a real test cart with exactly two qualifying items and confirm one is full price and one is half price. Then build a six-item cart and read the checkout summary line by line: does it half-price one item or three? This is where you catch the repeat behavior before your customers do. Silent failures are the enemy, because a discount that quietly applies once still never throws an error.
6. Verify Shop Pay
Run the six-item test cart through Shop Pay. Native and Functions-based discounts apply identically there; anything relying on theme JavaScript is where the cart total and the charged total drift apart on accelerated checkouts.
IMAGE PLACEHOLDER (Image 3): The repeat-logic toggle
Suggested visual: A 16:9 product screenshot mockup of a campaign editor showing a Buy X Get Y offer with fields "Customer buys quantity: 1," "Customer gets quantity: 1," "Discount: 50% off," and a highlighted toggle labeled "Repeat this offer for every qualifying pair" switched on, with a plain-English summary beneath reading "A 6-item cart gets 3 items at 50% off." Clean Shopify Polaris admin styling, brand accent in violet. Reference the docs/screenshot-manifest.md slot bogo-step-2 to capture the real screen later.
The bottom line
- Buy X Get Y is the correct native tool for "second one 50% off": set customer buys 1, customer gets 1 at 50%, and the buy-quantity is your "do not discount first N" control.
- Amount off products with a minimum quantity is a different offer. It discounts every qualifying unit, so "min 2, 50% off" half-prices both items, not just the second.
- Native repeat is the weak point. A single max-uses-per-order setting cannot cleanly reapply the deal per pair across a large or mixed cart, so shoppers get under-delivered or you over-deliver.
- Native Buy X Get Y caps eligible products at roughly 100 and discounts the cheaper item by default, with no fine-grained targeting control.
- Buy X Get Y is product-class, so it will not stack with another product discount on the same cart line unless you are on Shopify Plus. It combines with order and shipping discounts on any plan.
- Always test a two-item and a six-item cart and read the checkout summary line by line, then verify Shop Pay, because a discount that applies only once still never errors.
- A Shopify Functions-based app like Stackable adds the reliable repeat logic, unlimited eligibility, and cheapest-item targeting that turn a native single-pair BOGO into a real storewide offer.
Related articles
- BOGO and Buy X Get Y, done right: repeat logic and cheapest-item-free targeting native Buy X Get Y cannot do.
- Shopify's 100-product limit on Buy X Get Y: how to run 3-for-2 across a whole catalog past the native cap.
- How discount stacking works in Shopify: why native only applies the highest, and how to combine offers across classes.
- Volume discounts and quantity breaks: count units of the same product, not the whole collection.
- Discount stacking, done right: the three per-class combine switches with a live cart simulator.
- Stackable pricing: plans, the free tier, and what each includes.



