Shopify Tiered Pricing: How to Set Up Quantity Breaks
Sell the same product cheaper by the case. Set up tiered pricing on Shopify with free automatic discounts, then show a live 1 / 6 / 24 price table on the product page. Tested, with screenshots.
By AjayCodeWiz · August 25, 2026 · 9 min read
The problem
A merchant asked this on the Shopify Community. They wanted the same product to get cheaper as people buy more of it:
- 1 item at $12 each
- 6 or more at $11 each
- 24 or more at $9 each
They also asked the right follow-up question. Should they do this with a built-in Shopify feature, or do they need an app or custom code to show the price table on the product page?
This is what "tiered pricing" means. It is also called quantity breaks, volume pricing, or bulk pricing. The price per unit steps down at set quantities. It is one of the most common asks from stores that sell to shops, offices, or anyone who buys in bulk.
The short version: you can do the whole thing on Shopify for free, in two parts. Part one is the price itself, which uses Shopify's own discounts. Part two is the table shoppers see on the page, which is one small piece of code. I set both up on a test store and tested them end to end.
A plain Shopify product page showing one price for any quantity, before tiered pricing is added
Why Shopify does not show it out of the box
Here is the part the quick forum answers skip.
Shopify has a discount engine built in. It can lower the price when someone buys a certain quantity. But that engine only runs in the cart and at checkout. It never touches the product page.
So if you only set up the discount, your product page still shows one price. The lower price appears after the shopper adds enough to the cart. For volume pricing that is a problem, because the visible price table is usually what makes the sale. People need to see "buy 6, save a dollar each" before they add anything.
That split is why every real answer to this question has two parts. The discount handles the money. A little bit of code handles what shoppers see.
The short answer
- Create two automatic discounts, one for the 6-plus tier and one for the 24-plus tier.
- Add one Custom Liquid section to your product page and paste in a small table.
- Keep the numbers in both places the same, so the page matches what the cart charges.
Now the detail.
Part 1: the tiered price, free and built in
In your Shopify admin, go to Discounts, then Create discount, then Amount off products.
Set up the first tier:
- Discount value: choose Fixed amount and enter 1.00 off.
- Leave "Only apply discount once per order" unchecked. This is the important box. Unchecked means the dollar comes off every item, not just one.
- Applies to: pick your product.
The Shopify Amount off products discount form, set to $1 off each item and applied to one product
Then scroll down to Minimum purchase requirements and choose Minimum quantity of items. Enter 6. Save.
The minimum purchase requirement set to a minimum quantity of 6 items
That is your 6-plus tier done. At 6 or more, each item drops by $1, so $12 becomes $11.
Now make the second tier exactly the same way. Amount off products, Fixed amount 3.00 off, applied to the same product, minimum quantity of items 24. Save.
You now have two automatic discounts sitting in your Discounts list.
The Shopify discounts list showing two active automatic discounts, one per pricing tier
Here is how they behave together, which is the thing people worry about:
- 1 to 5 items: $12 each
- 6 to 23 items: $11 each
- 24 or more: $9 each
The two discounts do not stack. Shopify looks at the quantity in the cart and applies the single best tier on its own. I tested a cart with 24 units, and only the $3-off tier applied, giving $9 each. You do not have to build any logic for that. Shopify picks the winner.
A Shopify cart with 24 units, showing the price dropped to $9 each by the automatic discount
One tip that saves a lot of clicking. If you sell many products at the same tiers, do not build a pair of discounts for each one. Under "Applies to", pick a collection instead of a single product. Put all the bulk-priced items in that collection, and the two discounts cover the whole group.
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 right on the product page, you add one Custom Liquid section. A Custom Liquid section is just a box in the theme editor where you can paste your own code. Every free Shopify theme has one, including Dawn and the newer Horizon.
Go to Online Store, then Themes, then Customize. Open your product template. Click Add section and choose Custom Liquid.
Adding a Custom Liquid section to the Shopify product template in the theme editor
Paste this into the box. Then edit only the top two lines to match your own quantities and prices, and 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 two lines at the top are the only thing you touch:
tier_qtyis the list of quantities where the price changes, lowest first.tier_priceis the price per item at each of those quantities.
Keep the two lists the same length. The prices show in your store's own currency automatically, so you do not set a currency symbol.
Once it is saved, the table appears on the product page. The row that matches the current quantity is highlighted, and clicking a row sets the quantity for you.
A live tiered price table on a Shopify product page, with the current quantity row highlighted
Change the quantity and the highlight follows it, so shoppers always see which tier they are in.
The price table highlighting a different tier as the product quantity changes
The one rule to remember: keep the numbers in Part 1 and Part 2 the same. The table is just a display. The real discount is the one in Part 1. If the table says $9 but you forgot to create the 24 discount, the page will promise a price the cart does not give.
Shopify volume discount, quantity discount, and tiered pricing: same thing
People search for this in a lot of different ways, and they all mean the same setup:
- Tiered pricing: the price per unit steps down at set quantities.
- Volume discount or volume pricing: same idea, framed as "buy more, pay less per unit".
- Quantity discount or quantity breaks: same idea, framed around the quantity thresholds.
- Bulk pricing: the everyday word for it.
None of these is a separate Shopify feature. They are all the two-part setup above: an automatic Amount off products discount for the price, plus a small on-page table for the display.
Does Shopify have bulk pricing built in?
Partly. The discount side is fully built in and free, and that is what actually charges the lower price. What Shopify does not give you out of the box is the price table on the product page. That is the gap the Custom Liquid section fills.
There is one exception worth knowing. Shopify Plus stores selling wholesale through B2B catalogs do get real volume pricing that shows on the storefront. For a normal store selling to the public, the two-part method here is the way.
What to check if it did not work
- The discount comes off only one item. You left "Only apply discount once per order" checked. Uncheck it so the amount comes off each item.
- The price does not drop at all. Check that the discount is Active, and that your product is the one selected under "Applies to". If you targeted a collection, make sure the product is in it.
- The table shows on the page but the price never changes in the cart. That means the table is there but the matching discount is missing. The table does not create the discount. You still need both parts.
- The wrong tier wins. Double check the minimum quantity numbers. The 6 discount should be quantity 6, the 24 discount should be quantity 24. Shopify always applies the best tier for the quantity in the cart.
The no-code alternative
If you would rather not paste any code, a quantity-break app does both parts for you. It shows the table on the page and applies the tiers in the cart, from one place. Well-known options include Wide Bundles, Bundler, and VolumeBoost. They are the simplest route if you want the table and the discount managed together, and most have a free tier to start.
The trade-off is the usual one. An app is faster to set up and easier to manage, but it adds another app to your store. The native method here is free and has nothing extra running, but you manage the discounts and the table yourself.
The short version
- Tiered pricing on Shopify is two parts: the price and the display.
- The price is free. Two automatic Amount off products discounts, one per tier, with a minimum quantity on each. Shopify applies the best tier on its own.
- The display is one Custom Liquid section with a small table, so shoppers see the deal before they add to cart.
- Keep the numbers in both parts the same, and test a real cart at each tier.
I set this up on a Dawn test store and confirmed all three tiers: 1 at $12, 6 at $11 each, and 24 at $9 each.
Spending too long on manual Shopify busywork?
PinFlow turns your Shopify catalog into Pinterest pins and posts them on a schedule, automatically. Same idea as the rule above, let the system handle the repetitive part.
Get PinFlow on the Shopify App StoreMore Shopify fixes
More community-sourced Shopify guides, tested on a live store.
Shopify Admin
Shopify Bundle Apps: How to Pick the Right One
Shopify Bundles makes a separate product with its own inventory. Here is how bundle apps really differ, the free native option that keeps your real stock, and the one question to ask any vendor. Tested, with screenshots.
Shopify Admin
How to Import Reviews to Shopify for Free
You can import a supplier or manufacturer's existing product reviews into Shopify for free, label them honestly, and keep them apart from your own. Here is the exact route, the AliExpress case, and the Google-stars trap most guides skip. Free, no scraping.
Shopify Admin
How to Make a Product Pickup Only on Shopify
Some products should only be picked up in store, never shipped. Shopify has no product-level 'no shipping' checkbox, but a custom shipping profile with no rates does the same job. Here is the exact setup, what checkout looks like, and the catch with mixed carts. Tested with screenshots.