
Amazon made ‘Frequently Bought Together’ famous for a reason — it works. When a shopper is looking at a camera, showing the memory card and tripod right there with a single ‘Add all to cart’ button feels helpful, not pushy. You don’t need a $10/month bundle app to do this on Shopify. With a little Liquid and vanilla JS you can build a bundle box that lives on your product page, totals the price live, and adds everything in one click. Here are 6 designs to match any store. Paste your favorite into a Custom Liquid section on the product template and start bundling.
1. Classic – Bundle Box
The timeless Amazon-style box — main product plus two add-ons, checkboxes, live total. Converts everywhere.
Preview
Frequently Bought Together
Tick the items you want — save 10% when you bundle.
Item
₹499
+
Item
₹499
Sample: Main product + 2 add-ons with live total and one-click add-all.
Liquid Code
{% comment %} LayoutKart - Frequently Bought Together (Classic Box) {% endcomment %}
{% assign bundle_discount = 0.10 %}
<style>
.lk-fbt-b1{background:#ffffff;border:1px solid #e5e7eb;border-radius:14px;padding:20px;margin:24px 0;font-family:inherit;}
.lk-fbt-b1 h3{margin:0 0 6px;font-size:18px;}
.lk-fbt-b1 .lk-sub{margin:0 0 14px;font-size:13px;opacity:.65;}
.lk-fbt-b1 .lk-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.lk-fbt-b1 .lk-p{background:#fff;border:1px solid #eee;border-radius:10px;padding:10px;
width:150px;text-align:center;}
.lk-fbt-b1 .lk-p img{width:100%;aspect-ratio:1;object-fit:cover;border-radius:6px;}
.lk-fbt-b1 .lk-p .lk-t{font-size:13px;font-weight:600;margin:6px 0 2px;min-height:32px;}
.lk-fbt-b1 .lk-p .lk-pr{font-size:13px;font-weight:700;color:#7c3aed;}
.lk-fbt-b1 .lk-plus{font-size:22px;font-weight:700;color:#7c3aed;}
.lk-fbt-b1 .lk-total{display:flex;justify-content:space-between;align-items:center;
margin-top:16px;padding-top:14px;border-top:1px dashed rgba(0,0,0,.15);flex-wrap:wrap;gap:10px;}
.lk-fbt-b1 .lk-addall{padding:12px 26px;border:none;border-radius:10px;cursor:pointer;
background:#7c3aed;color:#ffffff;font-weight:700;font-size:15px;}
.lk-fbt-b1 input[type=checkbox]{width:18px;height:18px;accent-color:#7c3aed;}
@media(max-width:600px){.lk-fbt-b1 .lk-p{width:128px;}}
</style>
<div class="lk-fbt-b1" id="lkFbtb1">
<h3>Frequently Bought Together</h3>
<p class="lk-sub">Tick the items you want — save 10% when you bundle.</p>
<div class="lk-row">
<div class="lk-p">
<img src="{{ product.featured_image | image_url: width: 300 }}" alt="{{ product.title | escape }}" loading="lazy">
<p class="lk-t"><strong>This item:</strong> {{ product.title | truncate: 34 }}</p>
<p class="lk-pr">{{ product.price | money }}</p>
<label style="font-size:12px;"><input type="checkbox" checked disabled> Included</label>
</div>
{% for p in collections['bundle-addons'].products limit: 2 %}
<span class="lk-plus">+</span>
<div class="lk-p">
<img src="{{ p.featured_image | image_url: width: 300 }}" alt="{{ p.title | escape }}" loading="lazy">
<p class="lk-t">{{ p.title | truncate: 34 }}</p>
<p class="lk-pr">{{ p.price | money }}</p>
<label style="font-size:12px;"><input type="checkbox" class="lk-fbt-checkb1"
data-price="{{ p.price }}" data-variant="{{ p.selected_or_first_available_variant.id }}" checked> Add</label>
</div>
{% endfor %}
</div>
<div class="lk-total">
<div><span style="font-size:13px;opacity:.65;">Total for <span id="lkFbtNb1">3</span> items:</span><br>
<strong id="lkFbtTotalb1" style="font-size:20px;">{{ product.price | money }}</strong></div>
<button class="lk-addall" id="lkFbtBtnb1">Add Selected to Cart</button>
</div>
</div>
<script>
(function(){
var box=document.getElementById('lkFbtb1');
var main={{ product.selected_or_first_available_variant.id }};
var mainPrice={{ product.price }};
function fmt(c){return '₹'+(c/100).toLocaleString('en-IN',{maximumFractionDigits:0});}
function recalc(){
var n=1,total=mainPrice;
box.querySelectorAll('.lk-fbt-checkb1:checked').forEach(function(cb){
n++;total+=parseInt(cb.getAttribute('data-price'),10);});
var disc=Math.round(total*0.10);
box.querySelector('#lkFbtNb1').textContent=n;
box.querySelector('#lkFbtTotalb1').textContent=fmt(total-disc)+' ';
var s=document.createElement('span');s.style.cssText='font-size:12px;color:#16a34a;font-weight:700;';
s.textContent='(10% off applied)';
box.querySelector('#lkFbtTotalb1').appendChild(s);}
box.querySelectorAll('.lk-fbt-checkb1').forEach(function(cb){cb.addEventListener('change',recalc);});
recalc();
box.querySelector('#lkFbtBtnb1').addEventListener('click',function(){
var items=[{id:main,quantity:1}];
box.querySelectorAll('.lk-fbt-checkb1:checked').forEach(function(cb){
items.push({id:parseInt(cb.getAttribute('data-variant'),10),quantity:1});});
this.textContent='Adding...';
fetch('/cart/add.js',{method:'POST',headers:{'Content-Type':'application/json'},
body:JSON.stringify({items:items})}).then(()=>location.href='/cart');});
})();
</script>2. Modern – Card Row
Roomy cards with soft shadows for contemporary DTC brands — the bundle feels curated, not cluttered.
Preview
Frequently Bought Together
Tick the items you want — save 10% when you bundle.
Item
₹499
+
Item
₹499
Sample: Main product + 2 add-ons with live total and one-click add-all.
Liquid Code
{% comment %} LayoutKart - Frequently Bought Together (Modern Cards) {% endcomment %}
{% assign bundle_discount = 0.10 %}
<style>
.lk-fbt-b2{background:#f8fafc;border:1px solid #e2e8f0;border-radius:18px;padding:20px;margin:24px 0;font-family:inherit;}
.lk-fbt-b2 h3{margin:0 0 6px;font-size:18px;}
.lk-fbt-b2 .lk-sub{margin:0 0 14px;font-size:13px;opacity:.65;}
.lk-fbt-b2 .lk-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.lk-fbt-b2 .lk-p{background:#fff;border:1px solid #eee;border-radius:10px;padding:10px;
width:150px;text-align:center;}
.lk-fbt-b2 .lk-p img{width:100%;aspect-ratio:1;object-fit:cover;border-radius:6px;}
.lk-fbt-b2 .lk-p .lk-t{font-size:13px;font-weight:600;margin:6px 0 2px;min-height:32px;}
.lk-fbt-b2 .lk-p .lk-pr{font-size:13px;font-weight:700;color:#0ea5e9;}
.lk-fbt-b2 .lk-plus{font-size:22px;font-weight:700;color:#0ea5e9;}
.lk-fbt-b2 .lk-total{display:flex;justify-content:space-between;align-items:center;
margin-top:16px;padding-top:14px;border-top:1px dashed rgba(0,0,0,.15);flex-wrap:wrap;gap:10px;}
.lk-fbt-b2 .lk-addall{padding:12px 26px;border:none;border-radius:10px;cursor:pointer;
background:#0ea5e9;color:#ffffff;font-weight:700;font-size:15px;}
.lk-fbt-b2 input[type=checkbox]{width:18px;height:18px;accent-color:#0ea5e9;}
@media(max-width:600px){.lk-fbt-b2 .lk-p{width:128px;}}
</style>
<div class="lk-fbt-b2" id="lkFbtb2">
<h3>Frequently Bought Together</h3>
<p class="lk-sub">Tick the items you want — save 10% when you bundle.</p>
<div class="lk-row">
<div class="lk-p">
<img src="{{ product.featured_image | image_url: width: 300 }}" alt="{{ product.title | escape }}" loading="lazy">
<p class="lk-t"><strong>This item:</strong> {{ product.title | truncate: 34 }}</p>
<p class="lk-pr">{{ product.price | money }}</p>
<label style="font-size:12px;"><input type="checkbox" checked disabled> Included</label>
</div>
{% for p in collections['bundle-addons'].products limit: 2 %}
<span class="lk-plus">+</span>
<div class="lk-p">
<img src="{{ p.featured_image | image_url: width: 300 }}" alt="{{ p.title | escape }}" loading="lazy">
<p class="lk-t">{{ p.title | truncate: 34 }}</p>
<p class="lk-pr">{{ p.price | money }}</p>
<label style="font-size:12px;"><input type="checkbox" class="lk-fbt-checkb2"
data-price="{{ p.price }}" data-variant="{{ p.selected_or_first_available_variant.id }}" checked> Add</label>
</div>
{% endfor %}
</div>
<div class="lk-total">
<div><span style="font-size:13px;opacity:.65;">Total for <span id="lkFbtNb2">3</span> items:</span><br>
<strong id="lkFbtTotalb2" style="font-size:20px;">{{ product.price | money }}</strong></div>
<button class="lk-addall" id="lkFbtBtnb2">Add Selected to Cart</button>
</div>
</div>
<script>
(function(){
var box=document.getElementById('lkFbtb2');
var main={{ product.selected_or_first_available_variant.id }};
var mainPrice={{ product.price }};
function fmt(c){return '₹'+(c/100).toLocaleString('en-IN',{maximumFractionDigits:0});}
function recalc(){
var n=1,total=mainPrice;
box.querySelectorAll('.lk-fbt-checkb2:checked').forEach(function(cb){
n++;total+=parseInt(cb.getAttribute('data-price'),10);});
var disc=Math.round(total*0.10);
box.querySelector('#lkFbtNb2').textContent=n;
box.querySelector('#lkFbtTotalb2').textContent=fmt(total-disc)+' ';
var s=document.createElement('span');s.style.cssText='font-size:12px;color:#16a34a;font-weight:700;';
s.textContent='(10% off applied)';
box.querySelector('#lkFbtTotalb2').appendChild(s);}
box.querySelectorAll('.lk-fbt-checkb2').forEach(function(cb){cb.addEventListener('change',recalc);});
recalc();
box.querySelector('#lkFbtBtnb2').addEventListener('click',function(){
var items=[{id:main,quantity:1}];
box.querySelectorAll('.lk-fbt-checkb2:checked').forEach(function(cb){
items.push({id:parseInt(cb.getAttribute('data-variant'),10),quantity:1});});
this.textContent='Adding...';
fetch('/cart/add.js',{method:'POST',headers:{'Content-Type':'application/json'},
body:JSON.stringify({items:items})}).then(()=>location.href='/cart');});
})();
</script>3. Minimal – Checklist
Ultra-clean checklist style for minimal brands — just the essentials, beautifully spaced.
Preview
Frequently Bought Together
Tick the items you want — save 10% when you bundle.
Item
₹499
+
Item
₹499
Sample: Main product + 2 add-ons with live total and one-click add-all.
Liquid Code
{% comment %} LayoutKart - Frequently Bought Together (Minimal List) {% endcomment %}
{% assign bundle_discount = 0.10 %}
<style>
.lk-fbt-b3{background:#ffffff;border:none;border-radius:4px;padding:20px;margin:24px 0;font-family:inherit;}
.lk-fbt-b3 h3{margin:0 0 6px;font-size:18px;}
.lk-fbt-b3 .lk-sub{margin:0 0 14px;font-size:13px;opacity:.65;}
.lk-fbt-b3 .lk-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.lk-fbt-b3 .lk-p{background:#fff;border:1px solid #eee;border-radius:10px;padding:10px;
width:150px;text-align:center;}
.lk-fbt-b3 .lk-p img{width:100%;aspect-ratio:1;object-fit:cover;border-radius:6px;}
.lk-fbt-b3 .lk-p .lk-t{font-size:13px;font-weight:600;margin:6px 0 2px;min-height:32px;}
.lk-fbt-b3 .lk-p .lk-pr{font-size:13px;font-weight:700;color:#111111;}
.lk-fbt-b3 .lk-plus{font-size:22px;font-weight:700;color:#111111;}
.lk-fbt-b3 .lk-total{display:flex;justify-content:space-between;align-items:center;
margin-top:16px;padding-top:14px;border-top:1px dashed rgba(0,0,0,.15);flex-wrap:wrap;gap:10px;}
.lk-fbt-b3 .lk-addall{padding:12px 26px;border:none;border-radius:10px;cursor:pointer;
background:#111111;color:#ffffff;font-weight:700;font-size:15px;}
.lk-fbt-b3 input[type=checkbox]{width:18px;height:18px;accent-color:#111111;}
@media(max-width:600px){.lk-fbt-b3 .lk-p{width:128px;}}
</style>
<div class="lk-fbt-b3" id="lkFbtb3">
<h3>Frequently Bought Together</h3>
<p class="lk-sub">Tick the items you want — save 10% when you bundle.</p>
<div class="lk-row">
<div class="lk-p">
<img src="{{ product.featured_image | image_url: width: 300 }}" alt="{{ product.title | escape }}" loading="lazy">
<p class="lk-t"><strong>This item:</strong> {{ product.title | truncate: 34 }}</p>
<p class="lk-pr">{{ product.price | money }}</p>
<label style="font-size:12px;"><input type="checkbox" checked disabled> Included</label>
</div>
{% for p in collections['bundle-addons'].products limit: 2 %}
<span class="lk-plus">+</span>
<div class="lk-p">
<img src="{{ p.featured_image | image_url: width: 300 }}" alt="{{ p.title | escape }}" loading="lazy">
<p class="lk-t">{{ p.title | truncate: 34 }}</p>
<p class="lk-pr">{{ p.price | money }}</p>
<label style="font-size:12px;"><input type="checkbox" class="lk-fbt-checkb3"
data-price="{{ p.price }}" data-variant="{{ p.selected_or_first_available_variant.id }}" checked> Add</label>
</div>
{% endfor %}
</div>
<div class="lk-total">
<div><span style="font-size:13px;opacity:.65;">Total for <span id="lkFbtNb3">3</span> items:</span><br>
<strong id="lkFbtTotalb3" style="font-size:20px;">{{ product.price | money }}</strong></div>
<button class="lk-addall" id="lkFbtBtnb3">Add Selected to Cart</button>
</div>
</div>
<script>
(function(){
var box=document.getElementById('lkFbtb3');
var main={{ product.selected_or_first_available_variant.id }};
var mainPrice={{ product.price }};
function fmt(c){return '₹'+(c/100).toLocaleString('en-IN',{maximumFractionDigits:0});}
function recalc(){
var n=1,total=mainPrice;
box.querySelectorAll('.lk-fbt-checkb3:checked').forEach(function(cb){
n++;total+=parseInt(cb.getAttribute('data-price'),10);});
var disc=Math.round(total*0.10);
box.querySelector('#lkFbtNb3').textContent=n;
box.querySelector('#lkFbtTotalb3').textContent=fmt(total-disc)+' ';
var s=document.createElement('span');s.style.cssText='font-size:12px;color:#16a34a;font-weight:700;';
s.textContent='(10% off applied)';
box.querySelector('#lkFbtTotalb3').appendChild(s);}
box.querySelectorAll('.lk-fbt-checkb3').forEach(function(cb){cb.addEventListener('change',recalc);});
recalc();
box.querySelector('#lkFbtBtnb3').addEventListener('click',function(){
var items=[{id:main,quantity:1}];
box.querySelectorAll('.lk-fbt-checkb3:checked').forEach(function(cb){
items.push({id:parseInt(cb.getAttribute('data-variant'),10),quantity:1});});
this.textContent='Adding...';
fetch('/cart/add.js',{method:'POST',headers:{'Content-Type':'application/json'},
body:JSON.stringify({items:items})}).then(()=>location.href='/cart');});
})();
</script>4. Bold – Discount Bundle
High-energy orange styling with a loud 10% off message — built for sale season and impulse buyers.
Preview
Frequently Bought Together
Tick the items you want — save 10% when you bundle.
Item
₹499
+
Item
₹499
Sample: Main product + 2 add-ons with live total and one-click add-all.
Liquid Code
{% comment %} LayoutKart - Frequently Bought Together (Bold Deal) {% endcomment %}
{% assign bundle_discount = 0.10 %}
<style>
.lk-fbt-b4{background:#fff7ed;border:2px dashed #ea580c;border-radius:12px;padding:20px;margin:24px 0;font-family:inherit;}
.lk-fbt-b4 h3{margin:0 0 6px;font-size:18px;}
.lk-fbt-b4 .lk-sub{margin:0 0 14px;font-size:13px;opacity:.65;}
.lk-fbt-b4 .lk-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.lk-fbt-b4 .lk-p{background:#fff;border:1px solid #eee;border-radius:10px;padding:10px;
width:150px;text-align:center;}
.lk-fbt-b4 .lk-p img{width:100%;aspect-ratio:1;object-fit:cover;border-radius:6px;}
.lk-fbt-b4 .lk-p .lk-t{font-size:13px;font-weight:600;margin:6px 0 2px;min-height:32px;}
.lk-fbt-b4 .lk-p .lk-pr{font-size:13px;font-weight:700;color:#ea580c;}
.lk-fbt-b4 .lk-plus{font-size:22px;font-weight:700;color:#ea580c;}
.lk-fbt-b4 .lk-total{display:flex;justify-content:space-between;align-items:center;
margin-top:16px;padding-top:14px;border-top:1px dashed rgba(0,0,0,.15);flex-wrap:wrap;gap:10px;}
.lk-fbt-b4 .lk-addall{padding:12px 26px;border:none;border-radius:10px;cursor:pointer;
background:#ea580c;color:#ffffff;font-weight:700;font-size:15px;}
.lk-fbt-b4 input[type=checkbox]{width:18px;height:18px;accent-color:#ea580c;}
@media(max-width:600px){.lk-fbt-b4 .lk-p{width:128px;}}
</style>
<div class="lk-fbt-b4" id="lkFbtb4">
<h3>Frequently Bought Together</h3>
<p class="lk-sub">Tick the items you want — save 10% when you bundle.</p>
<div class="lk-row">
<div class="lk-p">
<img src="{{ product.featured_image | image_url: width: 300 }}" alt="{{ product.title | escape }}" loading="lazy">
<p class="lk-t"><strong>This item:</strong> {{ product.title | truncate: 34 }}</p>
<p class="lk-pr">{{ product.price | money }}</p>
<label style="font-size:12px;"><input type="checkbox" checked disabled> Included</label>
</div>
{% for p in collections['bundle-addons'].products limit: 2 %}
<span class="lk-plus">+</span>
<div class="lk-p">
<img src="{{ p.featured_image | image_url: width: 300 }}" alt="{{ p.title | escape }}" loading="lazy">
<p class="lk-t">{{ p.title | truncate: 34 }}</p>
<p class="lk-pr">{{ p.price | money }}</p>
<label style="font-size:12px;"><input type="checkbox" class="lk-fbt-checkb4"
data-price="{{ p.price }}" data-variant="{{ p.selected_or_first_available_variant.id }}" checked> Add</label>
</div>
{% endfor %}
</div>
<div class="lk-total">
<div><span style="font-size:13px;opacity:.65;">Total for <span id="lkFbtNb4">3</span> items:</span><br>
<strong id="lkFbtTotalb4" style="font-size:20px;">{{ product.price | money }}</strong></div>
<button class="lk-addall" id="lkFbtBtnb4">Add Selected to Cart</button>
</div>
</div>
<script>
(function(){
var box=document.getElementById('lkFbtb4');
var main={{ product.selected_or_first_available_variant.id }};
var mainPrice={{ product.price }};
function fmt(c){return '₹'+(c/100).toLocaleString('en-IN',{maximumFractionDigits:0});}
function recalc(){
var n=1,total=mainPrice;
box.querySelectorAll('.lk-fbt-checkb4:checked').forEach(function(cb){
n++;total+=parseInt(cb.getAttribute('data-price'),10);});
var disc=Math.round(total*0.10);
box.querySelector('#lkFbtNb4').textContent=n;
box.querySelector('#lkFbtTotalb4').textContent=fmt(total-disc)+' ';
var s=document.createElement('span');s.style.cssText='font-size:12px;color:#16a34a;font-weight:700;';
s.textContent='(10% off applied)';
box.querySelector('#lkFbtTotalb4').appendChild(s);}
box.querySelectorAll('.lk-fbt-checkb4').forEach(function(cb){cb.addEventListener('change',recalc);});
recalc();
box.querySelector('#lkFbtBtnb4').addEventListener('click',function(){
var items=[{id:main,quantity:1}];
box.querySelectorAll('.lk-fbt-checkb4:checked').forEach(function(cb){
items.push({id:parseInt(cb.getAttribute('data-variant'),10),quantity:1});});
this.textContent='Adding...';
fetch('/cart/add.js',{method:'POST',headers:{'Content-Type':'application/json'},
body:JSON.stringify({items:items})}).then(()=>location.href='/cart');});
})();
</script>5. Strip – Image Strip
Horizontal image strip for visual stores — shoppers see the whole bundle at a glance.
Preview
Frequently Bought Together
Tick the items you want — save 10% when you bundle.
Item
₹499
+
Item
₹499
Sample: Main product + 2 add-ons with live total and one-click add-all.
Liquid Code
{% comment %} LayoutKart - Frequently Bought Together (Image Strip) {% endcomment %}
{% assign bundle_discount = 0.10 %}
<style>
.lk-fbt-b5{background:#fdf4ff;border:1px solid #e9d5ff;border-radius:16px;padding:20px;margin:24px 0;font-family:inherit;}
.lk-fbt-b5 h3{margin:0 0 6px;font-size:18px;}
.lk-fbt-b5 .lk-sub{margin:0 0 14px;font-size:13px;opacity:.65;}
.lk-fbt-b5 .lk-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.lk-fbt-b5 .lk-p{background:#fff;border:1px solid #eee;border-radius:10px;padding:10px;
width:150px;text-align:center;}
.lk-fbt-b5 .lk-p img{width:100%;aspect-ratio:1;object-fit:cover;border-radius:6px;}
.lk-fbt-b5 .lk-p .lk-t{font-size:13px;font-weight:600;margin:6px 0 2px;min-height:32px;}
.lk-fbt-b5 .lk-p .lk-pr{font-size:13px;font-weight:700;color:#a855f7;}
.lk-fbt-b5 .lk-plus{font-size:22px;font-weight:700;color:#a855f7;}
.lk-fbt-b5 .lk-total{display:flex;justify-content:space-between;align-items:center;
margin-top:16px;padding-top:14px;border-top:1px dashed rgba(0,0,0,.15);flex-wrap:wrap;gap:10px;}
.lk-fbt-b5 .lk-addall{padding:12px 26px;border:none;border-radius:10px;cursor:pointer;
background:#a855f7;color:#ffffff;font-weight:700;font-size:15px;}
.lk-fbt-b5 input[type=checkbox]{width:18px;height:18px;accent-color:#a855f7;}
@media(max-width:600px){.lk-fbt-b5 .lk-p{width:128px;}}
</style>
<div class="lk-fbt-b5" id="lkFbtb5">
<h3>Frequently Bought Together</h3>
<p class="lk-sub">Tick the items you want — save 10% when you bundle.</p>
<div class="lk-row">
<div class="lk-p">
<img src="{{ product.featured_image | image_url: width: 300 }}" alt="{{ product.title | escape }}" loading="lazy">
<p class="lk-t"><strong>This item:</strong> {{ product.title | truncate: 34 }}</p>
<p class="lk-pr">{{ product.price | money }}</p>
<label style="font-size:12px;"><input type="checkbox" checked disabled> Included</label>
</div>
{% for p in collections['bundle-addons'].products limit: 2 %}
<span class="lk-plus">+</span>
<div class="lk-p">
<img src="{{ p.featured_image | image_url: width: 300 }}" alt="{{ p.title | escape }}" loading="lazy">
<p class="lk-t">{{ p.title | truncate: 34 }}</p>
<p class="lk-pr">{{ p.price | money }}</p>
<label style="font-size:12px;"><input type="checkbox" class="lk-fbt-checkb5"
data-price="{{ p.price }}" data-variant="{{ p.selected_or_first_available_variant.id }}" checked> Add</label>
</div>
{% endfor %}
</div>
<div class="lk-total">
<div><span style="font-size:13px;opacity:.65;">Total for <span id="lkFbtNb5">3</span> items:</span><br>
<strong id="lkFbtTotalb5" style="font-size:20px;">{{ product.price | money }}</strong></div>
<button class="lk-addall" id="lkFbtBtnb5">Add Selected to Cart</button>
</div>
</div>
<script>
(function(){
var box=document.getElementById('lkFbtb5');
var main={{ product.selected_or_first_available_variant.id }};
var mainPrice={{ product.price }};
function fmt(c){return '₹'+(c/100).toLocaleString('en-IN',{maximumFractionDigits:0});}
function recalc(){
var n=1,total=mainPrice;
box.querySelectorAll('.lk-fbt-checkb5:checked').forEach(function(cb){
n++;total+=parseInt(cb.getAttribute('data-price'),10);});
var disc=Math.round(total*0.10);
box.querySelector('#lkFbtNb5').textContent=n;
box.querySelector('#lkFbtTotalb5').textContent=fmt(total-disc)+' ';
var s=document.createElement('span');s.style.cssText='font-size:12px;color:#16a34a;font-weight:700;';
s.textContent='(10% off applied)';
box.querySelector('#lkFbtTotalb5').appendChild(s);}
box.querySelectorAll('.lk-fbt-checkb5').forEach(function(cb){cb.addEventListener('change',recalc);});
recalc();
box.querySelector('#lkFbtBtnb5').addEventListener('click',function(){
var items=[{id:main,quantity:1}];
box.querySelectorAll('.lk-fbt-checkb5:checked').forEach(function(cb){
items.push({id:parseInt(cb.getAttribute('data-variant'),10),quantity:1});});
this.textContent='Adding...';
fetch('/cart/add.js',{method:'POST',headers:{'Content-Type':'application/json'},
body:JSON.stringify({items:items})}).then(()=>location.href='/cart');});
})();
</script>6. Dark – Premium Dark
Dark premium box for luxury and tech stores — the bundle feels like a VIP offer.
Preview
Frequently Bought Together
Tick the items you want — save 10% when you bundle.
Item
₹499
+
Item
₹499
Sample: Main product + 2 add-ons with live total and one-click add-all.
Liquid Code
{% comment %} LayoutKart - Frequently Bought Together (Dark Premium) {% endcomment %}
{% assign bundle_discount = 0.10 %}
<style>
.lk-fbt-b6{background:#0f172a;border:1px solid #1e293b;border-radius:12px;padding:20px;margin:24px 0;font-family:inherit;}
.lk-fbt-b6 h3{margin:0 0 6px;font-size:18px;}
.lk-fbt-b6 .lk-sub{margin:0 0 14px;font-size:13px;opacity:.65;}
.lk-fbt-b6 .lk-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.lk-fbt-b6 .lk-p{background:#fff;border:1px solid #eee;border-radius:10px;padding:10px;
width:150px;text-align:center;}
.lk-fbt-b6 .lk-p img{width:100%;aspect-ratio:1;object-fit:cover;border-radius:6px;}
.lk-fbt-b6 .lk-p .lk-t{font-size:13px;font-weight:600;margin:6px 0 2px;min-height:32px;}
.lk-fbt-b6 .lk-p .lk-pr{font-size:13px;font-weight:700;color:#22d3ee;}
.lk-fbt-b6 .lk-plus{font-size:22px;font-weight:700;color:#22d3ee;}
.lk-fbt-b6 .lk-total{display:flex;justify-content:space-between;align-items:center;
margin-top:16px;padding-top:14px;border-top:1px dashed rgba(0,0,0,.15);flex-wrap:wrap;gap:10px;}
.lk-fbt-b6 .lk-addall{padding:12px 26px;border:none;border-radius:10px;cursor:pointer;
background:#22d3ee;color:#0f172a;font-weight:700;font-size:15px;}
.lk-fbt-b6 input[type=checkbox]{width:18px;height:18px;accent-color:#22d3ee;}
@media(max-width:600px){.lk-fbt-b6 .lk-p{width:128px;}}
</style>
<div class="lk-fbt-b6" id="lkFbtb6">
<h3>Frequently Bought Together</h3>
<p class="lk-sub">Tick the items you want — save 10% when you bundle.</p>
<div class="lk-row">
<div class="lk-p">
<img src="{{ product.featured_image | image_url: width: 300 }}" alt="{{ product.title | escape }}" loading="lazy">
<p class="lk-t"><strong>This item:</strong> {{ product.title | truncate: 34 }}</p>
<p class="lk-pr">{{ product.price | money }}</p>
<label style="font-size:12px;"><input type="checkbox" checked disabled> Included</label>
</div>
{% for p in collections['bundle-addons'].products limit: 2 %}
<span class="lk-plus">+</span>
<div class="lk-p">
<img src="{{ p.featured_image | image_url: width: 300 }}" alt="{{ p.title | escape }}" loading="lazy">
<p class="lk-t">{{ p.title | truncate: 34 }}</p>
<p class="lk-pr">{{ p.price | money }}</p>
<label style="font-size:12px;"><input type="checkbox" class="lk-fbt-checkb6"
data-price="{{ p.price }}" data-variant="{{ p.selected_or_first_available_variant.id }}" checked> Add</label>
</div>
{% endfor %}
</div>
<div class="lk-total">
<div><span style="font-size:13px;opacity:.65;">Total for <span id="lkFbtNb6">3</span> items:</span><br>
<strong id="lkFbtTotalb6" style="font-size:20px;">{{ product.price | money }}</strong></div>
<button class="lk-addall" id="lkFbtBtnb6">Add Selected to Cart</button>
</div>
</div>
<script>
(function(){
var box=document.getElementById('lkFbtb6');
var main={{ product.selected_or_first_available_variant.id }};
var mainPrice={{ product.price }};
function fmt(c){return '₹'+(c/100).toLocaleString('en-IN',{maximumFractionDigits:0});}
function recalc(){
var n=1,total=mainPrice;
box.querySelectorAll('.lk-fbt-checkb6:checked').forEach(function(cb){
n++;total+=parseInt(cb.getAttribute('data-price'),10);});
var disc=Math.round(total*0.10);
box.querySelector('#lkFbtNb6').textContent=n;
box.querySelector('#lkFbtTotalb6').textContent=fmt(total-disc)+' ';
var s=document.createElement('span');s.style.cssText='font-size:12px;color:#16a34a;font-weight:700;';
s.textContent='(10% off applied)';
box.querySelector('#lkFbtTotalb6').appendChild(s);}
box.querySelectorAll('.lk-fbt-checkb6').forEach(function(cb){cb.addEventListener('change',recalc);});
recalc();
box.querySelector('#lkFbtBtnb6').addEventListener('click',function(){
var items=[{id:main,quantity:1}];
box.querySelectorAll('.lk-fbt-checkb6:checked').forEach(function(cb){
items.push({id:parseInt(cb.getAttribute('data-variant'),10),quantity:1});});
this.textContent='Adding...';
fetch('/cart/add.js',{method:'POST',headers:{'Content-Type':'application/json'},
body:JSON.stringify({items:items})}).then(()=>location.href='/cart');});
})();
</script>How to Add ‘Frequently Bought Together’ Section to Shopify
No app needed — this works with a free built-in Shopify feature called the Custom Liquid section. It takes about two minutes:
- From your Shopify admin, go to Online Store → Themes.
- Click Customize next to your live theme (works with Dawn and all Online Store 2.0 themes).
- In the theme editor, use the top dropdown to navigate to your cart page (or product page for product-page effects).
- In the left sidebar, click Add section → Custom liquid.
- Delete the placeholder code, paste the code from your chosen variation above, and click Save.
- Preview your store — the effect is live instantly. Drag the section up or down to reposition it.
Tip: Always duplicate your theme first (Themes → … → Duplicate) so you have a backup before editing.
Customize the ‘Frequently Bought Together’ Section
- Bundle products: replace the collection handle
collections['bundle-addons']with your own. - Discount: change
bundle_discount(0.10 = 10% off the add-ons) or set to 0 for no discount. - Preselect: add
checkedto checkboxes you want ticked by default. - Main product: the current product is always included — the box totals everything live via JS.
More Shopify Code Sections
Keep customizing your store with these copy-paste tutorials:
- Shopify Cart Upsell Section (You May Also Like)
- Shopify Product Page Custom Offer Box
- Shopify Product Page Discount Banner
- Shopify Sticky Add to Cart Bar
- Shopify Cart Free Shipping Progress Bar (Boost AOV)
- Shopify Product Page Stock Counter
- Shopify Product Card Quick View Button
- Shopify Cart Drawer Custom Design with Liquid
- Shopify Discount Code Copy Button
Conclusion
Bundling is the laziest way to raise average order value: the customer was already buying, you just made it easier to buy more. Pick a design, point it at the right add-on collection, and consider a small bundle discount to sweeten the deal. One click, three items, happier revenue per visitor.
Want a store that already has all of this built in? Check out LayoutKart’s readymade Shopify sections and templates — premium designs, clean Liquid code, ready to install.