How to set up Discounts for specific quantities in shopify Store?

Hi,
I need help setting up tiered/volume pricing for specific products on my Shopify store.
Here is my requirement:
1 item for $12(regular price)
6+ items: $11 each
24+ items: $9 each
What is the best way to achieve this behaviour in Shopify?
Is there a way to handle this using built-in Shopify features, or would you recommend using a App/custom liquid code to display the pricing table directly on the product page?
I would really appreciate any guidance for setting this up cleanly!

Thanks in advance for your help!

Hello @olivianewuser123

You can get most of the way natively: Discounts > Create discount > Amount off products, pick the product and set “Minimum quantity of items” to 6 with $1 off each, then a second one at 24 with $3 off each. Only one product discount applies per cart line so they won’t stack, but do test a 24 qty cart to confirm the right tier wins.

The catch is native discounts only kick in at cart/checkout, so nothing shows on the product page, and with volume pricing the visible 1/6/24 table is usually what does the selling. That part needs an app or custom liquid. A volume/bundle app like Sleek Bundles handles both the tiers and the on-page table without touching your theme (that one’s ours, so take it with a grain of salt).

Hope that helps

The tiered price is free with Shopify’s built-in discounts.

The visible 1 / 6 / 24 table on the product page needs one small Custom Liquid section (or a volume app).

I built and tested on a Dawn store.

Right now a product shows one price for any quantity:

Part 1 - the tiered price (free, built in)

Go to Discounts > Create discount > Amount off products.

First discount:

  • Discount value: Fixed amount, 1.00 off, and leave “Only apply discount once per order” unchecked (so it comes off each item).
  • Applies to: your product.

  • Minimum purchase requirements: Minimum quantity of items = 6. Save.

Second discount: make it the same way, with 3.00 off and Minimum quantity of items = 24. Save.

You now have two automatic discounts:

How it behaves:

  • 1 to 5 items: $12 each
  • 6 to 23 items: $11 each
  • 24 or more: $9 each

Shopify applies the best tier for the quantity in the cart on its own - they do not stack. This only shows in the cart and at checkout:

To cover many products at once, pick a collection under “Applies to” instead of a single product.

Part 2 - show the price table on the product page

The discounts above are invisible until the cart. To show the 1 / 6 / 24 table on the product page, add one Custom Liquid section.

Online Store > Themes > Customize > open your product template > Add section > Custom Liquid.

Paste this, then edit only the top two lines to your own quantities and prices. Save.

{%- comment -%}
  Volume pricing table  -  paste into a Custom Liquid section on the product template.
  Edit the two lines below to match your discounts. Keep the counts equal.
    tier_qty    = the "buy this many or more" break points (lowest first)
    tier_price  = the per-item price at each break point
{%- endcomment -%}
{%- assign tier_qty   = '1,6,24' -%}
{%- assign tier_price = '12,11,9' -%}

{%- assign qtys   = tier_qty   | split: ',' -%}
{%- assign prices = tier_price | split: ',' -%}

<div class="vptable" data-qtys="{{ tier_qty }}" data-prices="{{ tier_price }}">
  <p class="vptable__title">Buy more, save more</p>
  <table class="vptable__grid">
    <thead>
      <tr><th>Quantity</th><th>Price each</th><th>You save</th></tr>
    </thead>
    <tbody>
      {%- for q in qtys -%}
        {%- assign i = forloop.index0 -%}
        {%- assign unit = prices[i] | plus: 0 -%}
        {%- assign base = prices[0] | plus: 0 -%}
        {%- assign saved = base | minus: unit -%}
        {%- assign nextq = qtys[forloop.index] -%}
        <tr class="vptable__row" data-min="{{ q }}">
          <td>
            {%- if forloop.last -%}{{ q }}+
            {%- elsif forloop.first and nextq -%}{{ q }}-{{ nextq | minus: 1 }}
            {%- elsif nextq -%}{{ q }}-{{ nextq | minus: 1 }}
            {%- else -%}{{ q }}+{%- endif -%}
          </td>
          <td>{{ unit | times: 100 | money }}</td>
          <td>{%- if saved > 0 -%}{{ saved | times: 100 | money }} each{%- else -%}-{%- endif -%}</td>
        </tr>
      {%- endfor -%}
    </tbody>
  </table>
  <p class="vptable__note">Discount applies automatically in the cart.</p>
</div>

<style>
  .vptable{margin:1.5rem 0;font-size:1.4rem}
  .vptable__title{font-weight:600;margin:0 0 .6rem}
  .vptable__grid{width:100%;border-collapse:collapse}
  .vptable__grid th,.vptable__grid td{padding:.7rem 1rem;text-align:left;border-bottom:1px solid rgba(0,0,0,.12)}
  .vptable__grid th{font-size:1.2rem;text-transform:uppercase;letter-spacing:.04em;opacity:.7}
  .vptable__row{cursor:pointer;transition:background .15s}
  .vptable__row:hover{background:rgba(0,0,0,.04)}
  .vptable__row.is-active{background:rgba(0,0,0,.07);font-weight:600}
  .vptable__note{margin:.7rem 0 0;font-size:1.2rem;opacity:.7}
</style>

<script>
(function(){
  function init(box){
    if(box.dataset.vpReady) return; box.dataset.vpReady='1';
    var mins=box.dataset.qtys.split(',').map(Number);
    var rows=[].slice.call(box.querySelectorAll('.vptable__row'));
    var qtyInput=document.querySelector('form[action*="/cart/add"] input[name="quantity"]')
                 ||document.querySelector('input[name="quantity"]');

    function tierIndex(q){var idx=0;for(var i=0;i<mins.length;i++){if(q>=mins[i])idx=i;}return idx;}
    function paint(){
      var q=qtyInput?parseInt(qtyInput.value,10)||1:1;
      var idx=tierIndex(q);
      rows.forEach(function(r,i){r.classList.toggle('is-active',i===idx);});
    }
    rows.forEach(function(r){
      r.addEventListener('click',function(){
        if(!qtyInput) return;
        qtyInput.value=r.dataset.min;
        qtyInput.dispatchEvent(new Event('change',{bubbles:true}));
        qtyInput.dispatchEvent(new Event('input',{bubbles:true}));
        paint();
      });
    });
    if(qtyInput){
      qtyInput.addEventListener('change',paint);
      qtyInput.addEventListener('input',paint);
    }
    paint();
  }
  function run(){document.querySelectorAll('.vptable').forEach(init);}
  if(document.readyState!=='loading')run();else document.addEventListener('DOMContentLoaded',run);
  document.addEventListener('shopify:section:load',run);
})();
</script>

The table shows on the page. The row for the current quantity is highlighted, and clicking a row sets the quantity:

Keep the numbers in Part 1 and Part 2 the same, so the page matches what the cart charges. Prices use your store’s own currency automatically (my test store shows the rupee sign).

Prefer no code? A quantity-break app shows the table and applies the tiers together: Wide Bundles, Bundler, or VolumeBoost.

Regards,
Ploqo

Ploqo’s answer is solid and covers everything technically. I’ll just add a couple practical things based on setting this up for stores.

First, when you’re setting up those two discounts in Shopify admin, make sure you don’t accidentally create them as “buy X get Y” discounts instead of “amount off products.” Easy mistake to make and easy to fix, but it’s caught a few merchants out.

Second, the code Ploqo shared works well. One thing to watch: if your theme uses AJAX add-to-cart, clicking the table row to update quantity might not trigger the cart update automatically in the same way. If you see that happen, you can just set the quantity normally and add to cart - the discount still applies at checkout. The table is mainly for visibility anyway.

Also, if you ever change your prices or discount tiers, remember to update both the discounts in admin AND the two lines in the code (tier_qty and tier_price). Easy to forget and then the table shows old prices.

What theme are you using? Some themes handle Custom Liquid sections differently, especially older ones.

Hi @olivianewuser123,

What you’re looking for is called Shopify Volume Discount with logic to set a fixed price per item across discount tiers. Unfortunately, Shopify’s built-in tools can’t do this cleanly, so you’ll need an alternative solution.

I’ve set one up. Could you please verify that it matches what you want?

P/s: I’ll use BOGOS: Free Gift Bundle Upsell app to set up the Volume Discount example above. You can use its free plan if you are interested.

How to set it up:

  1. Create Discount > Create Volume Disscount
  2. Under “Quantity logic” > Choose Count all products (Every item in the cart counts toward the discount tier, no matter the product.)

  1. Apply to your products/types/vendors/collections
  2. Set up 3 tiers and make sure you choose “Fixed price per item” to set a fixed price for your products

If you prefer to explore other volume discount apps on Shopify, I’ve found this video. You can watch it for more detailed information before deciding on any app:

Hope it helps!

Ellie

You can handle the pricing with two automatic “Amount off products” discounts: $1 off each at 6+ items and $3 off each at 24+ items. Shopify should apply the best eligible discount. Custom Liquid is only needed to display the pricing table on the product page.

Late addition since you already have a working setup from Ploqo — two things worth knowing before you call it done, because both fail silently later.

First: those two “amount off” discounts don’t combine with anything else by default. The day you run any other automatic discount or send out a discount code, Shopify applies whichever single discount is worth more and drops the other — so a customer buying 24+ with a 10% welcome code can end up paying a different per-unit price than your table promises. If you ever add another promotion, open the Combinations section on both discounts and decide deliberately what stacks.

Second: if you sell in more than one currency through Markets, fixed-amount discounts ($1 off / $3 off) convert with exchange rates, so the tidy $11 and $9 price points only stay tidy in your store currency. Percentages keep their shape across currencies; fixed amounts don’t. Worth checking one cart per currency you sell in.

When you test, use the boundaries: carts of 5, 6, 23 and 24 — and check the checkout total, not the cart page.

(Disclosure: I build a discount app, so this space is my day job — but everything above is native Shopify behaviour, no app needed.)

I’d keep the discount logic in Shopify and use Liquid only for the display. Theme code should never be the thing calculating the real checkout price.

  • Create automatic Amount off products discounts: $1 off at minimum quantity 6, and $3 off at minimum quantity 24.
  • Apply them to the exact product or variants. Using a collection can let eligible products contribute to the quantity together, which may not be what you want.
  • Test carts at quantities 5, 6, 23, and 24. Also test with other discount codes, since product discounts may not combine.
  • Add a simple pricing table on the product page, but remember it is static. Update it whenever the discounts or base price change.

If variants have different regular prices, use an app or Shopify Functions setup instead, since $1/$3 off will not create the same fixed unit price for every variant.

Lots of good options shared here. To help you decide which route to take:

Option 1: Native discounts + Custom Liquid (Ploqo’s approach)

· :white_check_mark: Free, no app cost

· :white_check_mark: Works for most basic tiered pricing needs

· :cross_mark: Requires some theme work, doesn’t auto-update if you change prices (you’d need to manually update both discounts and code)

Option 2: Volume/bundle app (Wide Bundles, Bundler, VolumeBoost, or Sleek Bundles mentioned above)

· :white_check_mark: Handles both the pricing logic and product page display

· :white_check_mark: More flexible for complex rules (different variants, specific collections)

· :cross_mark: Monthly cost

For one product with simple tiers, Option 1 works great. If you plan to scale this to many products or need more flexibility, Option 2 is worth the investment.

Also worth noting: if you have products with different base prices (e.g., $12 for one product, $20 for another), the fixed discount approach might not work cleanly you’d need to think about percentage discounts instead.

Curious how many products are you planning to apply this to? And do they all have the same base price, or do they vary?

Hey [email removed]olivianewuser123,

Marry from Discounty here.

Ploqo’s native route works cleanly if every variant on that product starts at $12. Where it breaks is what clickfromai flagged: $1 and $3 off are amount-off arithmetic, so variants with different regular prices land on different per-unit numbers rather than a flat $11 and $9.

A Quantity discount tier in Discounty can set a New price instead of a percentage or an amount off, so $11 at 6 and $9 at 24 is what each item costs regardless of where it started. The tier table renders on the product page as well, so there’s no Liquid section to keep in sync when prices change.

Worth deciding either way: “Same product” counts quantity per variant, “Mix of products” counts across everything in the campaign, which is the aggregation flagged upthread.

Hi @olivianewuser123,

If you want to set up tiered pricing for specific products, you can consider using the Quantity Discount feature in Inkybay – Product Personalizer instead of building the pricing logic with custom Liquid code.

For example, you can create pricing tiers such as 1 item: $12, 6+ items: $11 each, and 24+ items: $9 each. Inkybay supports both percentage and fixed discounts, so you can configure the pricing according to your requirements and display the quantity discount information directly on the product page.

You can also apply discounts to different pricing components, such as the Base Price, Design Price, or Option Price, which can be useful if the products include customization. The setup doesn’t require coding, and you can try it with Inkybay’s 21-day free trial to see if it works for your products.