Diwali Sale is LIVE - special prices end in
⚡ Launch-ready Shopify themes — Instant licensed download · 300+ stores built with LayoutKart themes

Shopify ‘Frequently Bought Together’ Section

shopify-frequently-bought-together

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

Total: ₹1,347 (10% off applied)Add Selected to Cart

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

Total: ₹1,347 (10% off applied)Add Selected to Cart

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

Total: ₹1,347 (10% off applied)Add Selected to Cart

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

Total: ₹1,347 (10% off applied)Add Selected to Cart

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

Total: ₹1,347 (10% off applied)Add Selected to Cart

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

Total: ₹1,347 (10% off applied)Add Selected to Cart

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:

  1. From your Shopify admin, go to Online Store → Themes.
  2. Click Customize next to your live theme (works with Dawn and all Online Store 2.0 themes).
  3. In the theme editor, use the top dropdown to navigate to your cart page (or product page for product-page effects).
  4. In the left sidebar, click Add section → Custom liquid.
  5. Delete the placeholder code, paste the code from your chosen variation above, and click Save.
  6. 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 checked to 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:

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.

Scroll to Top