{"id":85,"date":"2026-06-11T14:41:15","date_gmt":"2026-06-11T14:41:15","guid":{"rendered":"https:\/\/www.lockpro.io\/blog\/?page_id=85"},"modified":"2026-06-11T14:41:15","modified_gmt":"2026-06-11T14:41:15","slug":"moq-tier-builder","status":"publish","type":"page","link":"https:\/\/www.lockpro.io\/blog\/moq-tier-builder\/","title":{"rendered":"MOQ &amp; Tier Builder"},"content":{"rendered":"\n<!-- ============================================================\n  MOQ & Volume Discount Tier Builder \u2014 Blogs by LockPro\n  Paste this ENTIRE block into a WordPress \"Custom HTML\" block.\n  Self-contained: no external scripts, no dependencies.\n  All styles are scoped under #lp-tb to avoid theme conflicts.\n============================================================ -->\n<div id=\"lp-tb\">\n  <style>\n    #lp-tb{--tb-ink:#1a2332;--tb-sub:#5b6878;--tb-line:#e3e7ee;--tb-bg:#f7f9fc;--tb-acc:#1f6f5c;--tb-acc-soft:#e6f2ee;--tb-blue:#3b5bdb;--tb-warn-bg:#fdf3e7;--tb-warn-bd:#f2d4a7;--tb-warn-ink:#8a5a17;--tb-bad:#c23b3b;\n      font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;\n      color:var(--tb-ink);max-width:680px;margin:2rem auto;border:1px solid var(--tb-line);border-radius:14px;overflow:hidden;background:#fff;box-shadow:0 1px 3px rgba(16,24,40,.06)}\n    #lp-tb *{box-sizing:border-box;margin:0;padding:0}\n    #lp-tb .tb-head{padding:20px 24px 16px;border-bottom:1px solid var(--tb-line)}\n    #lp-tb .tb-head h3{font-size:1.15rem;font-weight:700;letter-spacing:-.01em}\n    #lp-tb .tb-head p{font-size:.85rem;color:var(--tb-sub);margin-top:4px}\n    #lp-tb .tb-body{padding:20px 24px}\n    #lp-tb label{display:block;font-size:.78rem;font-weight:600;color:var(--tb-sub);text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px}\n    #lp-tb .tb-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:14px}\n    @media(max-width:560px){#lp-tb .tb-grid{grid-template-columns:1fr 1fr}}\n    #lp-tb .tb-field{position:relative}\n    #lp-tb .tb-field .tb-sym{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--tb-sub);font-size:.95rem;pointer-events:none}\n    #lp-tb input[type=number]{width:100%;padding:11px 12px;font-size:1rem;border:1px solid var(--tb-line);border-radius:8px;background:var(--tb-bg);color:var(--tb-ink);-moz-appearance:textfield}\n    #lp-tb .tb-field.has-sym input[type=number]{padding-left:28px}\n    #lp-tb input[type=number]::-webkit-outer-spin-button,#lp-tb input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none}\n    #lp-tb input[type=number]:focus{outline:2px solid var(--tb-acc);outline-offset:1px;border-color:var(--tb-acc);background:#fff}\n    \/* tier rows *\/\n    #lp-tb .tb-tiers-title{display:flex;justify-content:space-between;align-items:center;margin:22px 0 10px}\n    #lp-tb .tb-tiers-title .tb-cap{font-size:.78rem;font-weight:600;color:var(--tb-sub);text-transform:uppercase;letter-spacing:.04em}\n    #lp-tb .tb-btn{font-size:.78rem;font-weight:700;border:1px solid var(--tb-line);background:#fff;color:var(--tb-ink);padding:6px 12px;border-radius:8px;cursor:pointer}\n    #lp-tb .tb-btn:hover{background:var(--tb-bg)}\n    #lp-tb .tb-btn:focus-visible{outline:2px solid var(--tb-acc);outline-offset:1px}\n    #lp-tb .tb-tier-row{display:grid;grid-template-columns:24px 1fr 1fr 1fr 1fr 32px;gap:8px;align-items:center;padding:8px 0;border-bottom:1px dashed var(--tb-line);font-size:.85rem}\n    @media(max-width:560px){#lp-tb .tb-tier-row{grid-template-columns:20px 1fr 1fr 1fr 1fr 28px;font-size:.78rem}}\n    #lp-tb .tb-tier-row input{padding:8px;font-size:.9rem}\n    #lp-tb .tb-tier-idx{font-size:.75rem;font-weight:800;color:var(--tb-sub)}\n    #lp-tb .tb-calc{font-variant-numeric:tabular-nums;text-align:right;font-weight:600}\n    #lp-tb .tb-calc small{display:block;font-weight:400;color:var(--tb-sub);font-size:.7rem}\n    #lp-tb .tb-calc.neg{color:var(--tb-bad)}\n    #lp-tb .tb-x{border:none;background:none;color:var(--tb-sub);font-size:1rem;cursor:pointer;border-radius:6px;width:28px;height:28px;line-height:1}\n    #lp-tb .tb-x:hover{background:var(--tb-bg);color:var(--tb-bad)}\n    #lp-tb .tb-col-head{display:grid;grid-template-columns:24px 1fr 1fr 1fr 1fr 32px;gap:8px;font-size:.68rem;text-transform:uppercase;letter-spacing:.04em;color:var(--tb-sub);font-weight:700;padding-bottom:6px;border-bottom:1px solid var(--tb-line)}\n    @media(max-width:560px){#lp-tb .tb-col-head{grid-template-columns:20px 1fr 1fr 1fr 1fr 28px}}\n    #lp-tb .tb-col-head .r{text-align:right}\n    \/* staircase *\/\n    #lp-tb .tb-stairs-wrap{margin-top:22px;background:var(--tb-bg);border:1px solid var(--tb-line);border-radius:10px;padding:16px}\n    #lp-tb .tb-stairs-cap{font-size:.78rem;font-weight:600;color:var(--tb-sub);text-transform:uppercase;letter-spacing:.04em;margin-bottom:12px}\n    #lp-tb .tb-stairs{display:flex;align-items:flex-end;gap:6px;height:120px}\n    #lp-tb .tb-stair{flex:1;display:flex;flex-direction:column;justify-content:flex-end;min-width:0}\n    #lp-tb .tb-stair .bar{border-radius:6px 6px 0 0;display:flex;flex-direction:column;justify-content:flex-end;overflow:hidden;transition:height .25s ease}\n    #lp-tb .tb-stair .profit{background:var(--tb-acc)}\n    #lp-tb .tb-stair .cost{background:#9aa5b5}\n    #lp-tb .tb-stair .lbl{text-align:center;font-size:.7rem;color:var(--tb-sub);margin-top:6px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n    #lp-tb .tb-stair .price{text-align:center;font-size:.75rem;font-weight:800;margin-bottom:4px;font-variant-numeric:tabular-nums}\n    #lp-tb .tb-stairs-legend{display:flex;gap:14px;margin-top:10px;font-size:.75rem;color:var(--tb-sub)}\n    #lp-tb .tb-dot{width:10px;height:10px;border-radius:3px;display:inline-block;margin-right:5px;vertical-align:-1px}\n    @media(prefers-reduced-motion:reduce){#lp-tb .tb-stair .bar{transition:none}}\n    \/* warnings & output *\/\n    #lp-tb .tb-warn{margin-top:14px;font-size:.82rem;background:var(--tb-warn-bg);border:1px solid var(--tb-warn-bd);color:var(--tb-warn-ink);border-radius:8px;padding:10px 12px;display:none}\n    #lp-tb .tb-out{margin-top:20px}\n    #lp-tb .tb-out-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}\n    #lp-tb textarea{width:100%;height:150px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.78rem;border:1px solid var(--tb-line);border-radius:8px;padding:10px;background:var(--tb-bg);color:var(--tb-ink);resize:vertical}\n    #lp-tb .tb-copy{font-size:.78rem;font-weight:700;border:none;background:var(--tb-acc);color:#fff;padding:7px 14px;border-radius:8px;cursor:pointer}\n    #lp-tb .tb-copy:hover{background:#185a4b}\n    #lp-tb .tb-copy:focus-visible{outline:2px solid var(--tb-acc);outline-offset:2px}\n    \/* footer *\/\n    #lp-tb .tb-foot{padding:14px 24px;background:var(--tb-bg);border-top:1px solid var(--tb-line);display:flex;align-items:center;justify-content:center;gap:12px;flex-wrap:wrap}\n    #lp-tb .tb-foot a{font-size:.84rem;font-weight:700;color:#fff;background:var(--tb-acc);padding:9px 16px;border-radius:8px;text-decoration:none;white-space:nowrap}\n    #lp-tb .tb-foot a:hover{background:#185a4b}\n    #lp-tb .tb-foot a:first-child{background:var(--tb-blue)}\n    #lp-tb .tb-foot a:first-child:hover{background:#2f49b3}\n  <\/style>\n\n  <div class=\"tb-head\">\n    <h3>MOQ &amp; Volume Discount Tier Builder<\/h3>\n    <p>Set your cost, base wholesale price, and minimum order quantity \u2014 then build discount tiers and see your profit at every level.<\/p>\n  <\/div>\n\n  <div class=\"tb-body\">\n    <div class=\"tb-grid\">\n      <div>\n        <label for=\"tb-cost\">Cost per unit<\/label>\n        <div class=\"tb-field has-sym\"><span class=\"tb-sym\">$<\/span>\n          <input type=\"number\" id=\"tb-cost\" inputmode=\"decimal\" min=\"0\" step=\"0.01\" value=\"10\">\n        <\/div>\n      <\/div>\n      <div>\n        <label for=\"tb-base\">Base wholesale price<\/label>\n        <div class=\"tb-field has-sym\"><span class=\"tb-sym\">$<\/span>\n          <input type=\"number\" id=\"tb-base\" inputmode=\"decimal\" min=\"0\" step=\"0.01\" value=\"20\">\n        <\/div>\n      <\/div>\n      <div>\n        <label for=\"tb-moq\">MOQ (units)<\/label>\n        <div class=\"tb-field\">\n          <input type=\"number\" id=\"tb-moq\" inputmode=\"numeric\" min=\"1\" step=\"1\" value=\"12\">\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"tb-tiers-title\">\n      <span class=\"tb-cap\">Discount tiers<\/span>\n      <button type=\"button\" class=\"tb-btn\" id=\"tb-add\">+ Add tier<\/button>\n    <\/div>\n    <div class=\"tb-col-head\">\n      <span><\/span><span>From qty<\/span><span>Discount %<\/span><span class=\"r\">Price\/unit<\/span><span class=\"r\">Profit\/unit<\/span><span><\/span>\n    <\/div>\n    <div id=\"tb-rows\"><\/div>\n\n    <div class=\"tb-stairs-wrap\">\n      <div class=\"tb-stairs-cap\">Your price staircase (cost vs profit per unit)<\/div>\n      <div class=\"tb-stairs\" id=\"tb-stairs\" role=\"img\" aria-label=\"Bar chart of price per unit at each quantity tier, split into cost and profit\"><\/div>\n      <div class=\"tb-stairs-legend\">\n        <span><i class=\"tb-dot\" style=\"background:#9aa5b5\"><\/i>Cost<\/span>\n        <span><i class=\"tb-dot\" style=\"background:var(--tb-acc)\"><\/i>Your profit<\/span>\n      <\/div>\n    <\/div>\n\n    <div class=\"tb-warn\" id=\"tb-warn\" role=\"alert\"><\/div>\n\n    <div class=\"tb-out\">\n      <div class=\"tb-out-head\">\n        <span class=\"tb-cap\" style=\"font-size:.78rem;font-weight:600;color:var(--tb-sub);text-transform:uppercase;letter-spacing:.04em\">Copy-paste tier sheet<\/span>\n        <button type=\"button\" class=\"tb-copy\" id=\"tb-copy\">Copy<\/button>\n      <\/div>\n      <textarea id=\"tb-output\" readonly aria-label=\"Generated tier sheet, ready to copy\"><\/textarea>\n    <\/div>\n  <\/div>\n\n  <div class=\"tb-foot\">\n    <a href=\"https:\/\/apps.shopify.com\/wholesale-discount-pro-b2b-pricing?utm_source=blog&#038;utm_medium=tool&#038;utm_campaign=tier-builder\" rel=\"noopener\" target=\"_blank\">Try Wholesale Pro free<\/a>\n    <a href=\"https:\/\/apps.shopify.com\/lockpro-b2b-access-control?utm_source=blog&#038;utm_medium=tool&#038;utm_campaign=tier-builder\" rel=\"noopener\" target=\"_blank\">Try LockPro free<\/a>\n  <\/div>\n\n  <script>\n  (function(){\n    var $=function(id){return document.getElementById(id)};\n    var elCost=$('tb-cost'),elBase=$('tb-base'),elMoq=$('tb-moq'),rowsEl=$('tb-rows');\n    var fmt=function(n){return '$'+(isFinite(n)?Math.max(n,-9999999):0).toLocaleString('en-US',{minimumFractionDigits:2,maximumFractionDigits:2})};\n    var tiers=[{qty:12,disc:0},{qty:48,disc:8},{qty:144,disc:15}];\n    var MAXT=6;\n\n    function rowHtml(i,t){\n      return '<div class=\"tb-tier-row\" data-i=\"'+i+'\">'\n        +'<span class=\"tb-tier-idx\">'+(i+1)+'<\/span>'\n        +'<input type=\"number\" min=\"1\" step=\"1\" inputmode=\"numeric\" value=\"'+t.qty+'\" data-f=\"qty\" aria-label=\"Tier '+(i+1)+' starting quantity\">'\n        +'<input type=\"number\" min=\"0\" max=\"95\" step=\"0.5\" inputmode=\"decimal\" value=\"'+t.disc+'\" data-f=\"disc\" aria-label=\"Tier '+(i+1)+' discount percent\">'\n        +'<span class=\"tb-calc\" data-c=\"price\"><\/span>'\n        +'<span class=\"tb-calc\" data-c=\"profit\"><\/span>'\n        +'<button type=\"button\" class=\"tb-x\" aria-label=\"Remove tier '+(i+1)+'\">\\u00d7<\/button>'\n        +'<\/div>';\n    }\n\n    function render(){\n      var html='';\n      for(var i=0;i<tiers.length;i++){html+=rowHtml(i,tiers[i])}\n      rowsEl.innerHTML=html;\n      calc();\n    }\n\n    function calc(){\n      var cost=parseFloat(elCost.value)||0;\n      var base=parseFloat(elBase.value)||0;\n      var moq=parseInt(elMoq.value,10)||1;\n      if(tiers.length){tiers[0].qty=moq; var firstQty=rowsEl.querySelector('[data-i=\"0\"] [data-f=\"qty\"]'); if(firstQty&#038;&#038;document.activeElement!==firstQty){firstQty.value=moq}}\n\n      var warns=[];\n      var rows=rowsEl.querySelectorAll('.tb-tier-row');\n      var stairsHtml='';\n      var maxPrice=base>0?base:1;\n      var sheet='VOLUME PRICING \\u2014 generated with the LockPro Tier Builder\\n';\n      sheet+='Base wholesale price: '+fmt(base)+'  |  MOQ: '+moq+' units\\n';\n      sheet+='--------------------------------------------\\n';\n\n      for(var i=0;i<tiers.length;i++){\n        var t=tiers[i];\n        var price=base*(1-t.disc\/100);\n        var profit=price-cost;\n        var row=rows[i];\n        if(row){\n          var pEl=row.querySelector('[data-c=\"price\"]'),prEl=row.querySelector('[data-c=\"profit\"]');\n          pEl.textContent=fmt(price);\n          prEl.innerHTML=fmt(profit)+'<small>'+(price>0?Math.round(profit\/price*100):0)+'% margin<\/small>';\n          prEl.className='tb-calc'+(profit<0?' neg':'');\n        }\n        \/\/ range label\n        var next=tiers[i+1]?tiers[i+1].qty-1:null;\n        var range=next&#038;&#038;next>=t.qty?(t.qty+'\\u2013'+next):(t.qty+'+');\n        \/\/ staircase bars (height proportional to price; split cost\/profit)\n        var hPct=Math.max(price\/maxPrice*100,4);\n        var costPct=price>0?Math.min(cost\/price*100,100):100;\n        stairsHtml+='<div class=\"tb-stair\">'\n          +'<div class=\"price\">'+fmt(price)+'<\/div>'\n          +'<div class=\"bar\" style=\"height:'+hPct+'%\">'\n          +'<div class=\"profit\" style=\"height:'+Math.max(100-costPct,0)+'%\"><\/div>'\n          +'<div class=\"cost\" style=\"height:'+Math.min(costPct,100)+'%\"><\/div>'\n          +'<\/div><div class=\"lbl\">'+range+' units<\/div><\/div>';\n        sheet+=range+' units:  '+fmt(price)+' \/ unit'+(t.disc>0?'  ('+t.disc+'% off)':'  (base price)')+'\\n';\n        \/\/ validations\n        if(profit<0){warns.push('Tier '+(i+1)+' ('+range+' units) sells below your cost \\u2014 you lose '+fmt(Math.abs(profit))+' per unit.')}\n        if(i>0&&t.qty<=tiers[i-1].qty){warns.push('Tier '+(i+1)+' quantity should be higher than tier '+i+'.')}\n        if(i>0&&t.disc<tiers[i-1].disc){warns.push('Tier '+(i+1)+' has a smaller discount than tier '+i+' \\u2014 buyers expect bigger orders to cost less per unit.')}\n      }\n      $('tb-stairs').innerHTML=stairsHtml;\n      $('tb-output').value=sheet;\n      var w=$('tb-warn');\n      w.style.display=warns.length?'block':'none';\n      w.textContent=warns.join(' ');\n    }\n\n    rowsEl.addEventListener('input',function(e){\n      var row=e.target.closest('.tb-tier-row');if(!row)return;\n      var i=parseInt(row.getAttribute('data-i'),10),f=e.target.getAttribute('data-f');\n      if(f==='qty'){tiers[i].qty=parseInt(e.target.value,10)||1;if(i===0){elMoq.value=tiers[0].qty}}\n      if(f==='disc'){tiers[i].disc=Math.min(Math.max(parseFloat(e.target.value)||0,0),95)}\n      calc();\n    });\n    rowsEl.addEventListener('click',function(e){\n      if(!e.target.classList.contains('tb-x'))return;\n      var row=e.target.closest('.tb-tier-row');\n      var i=parseInt(row.getAttribute('data-i'),10);\n      if(tiers.length<=1)return;\n      tiers.splice(i,1);render();\n    });\n    $('tb-add').addEventListener('click',function(){\n      if(tiers.length>=MAXT)return;\n      var last=tiers[tiers.length-1];\n      tiers.push({qty:last.qty*2,disc:Math.min(last.disc+5,95)});\n      render();\n    });\n    $('tb-copy').addEventListener('click',function(){\n      var ta=$('tb-output');ta.select();\n      var btn=this,done=function(){btn.textContent='Copied!';setTimeout(function(){btn.textContent='Copy'},1600)};\n      if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(ta.value).then(done,function(){document.execCommand('copy');done()})}\n      else{document.execCommand('copy');done()}\n    });\n    [elCost,elBase,elMoq].forEach(function(el){el.addEventListener('input',calc)});\n    render();\n  })();\n  <\/script>\n<\/div>\n<!-- ================= end MOQ & Tier Builder ================= -->\n\n","protected":false},"excerpt":{"rendered":"<p>MOQ &amp; Volume Discount Tier Builder Set your cost, base wholesale price, and minimum order quantity \u2014 then build discount tiers and see your profit at every level. Cost per unit $ Base wholesale price $ MOQ (units) Discount tiers + Add tier From qtyDiscount %Price\/unitProfit\/unit Your price staircase (cost vs profit per unit) Cost&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-85","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.lockpro.io\/blog\/wp-json\/wp\/v2\/pages\/85","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lockpro.io\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lockpro.io\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lockpro.io\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lockpro.io\/blog\/wp-json\/wp\/v2\/comments?post=85"}],"version-history":[{"count":2,"href":"https:\/\/www.lockpro.io\/blog\/wp-json\/wp\/v2\/pages\/85\/revisions"}],"predecessor-version":[{"id":101,"href":"https:\/\/www.lockpro.io\/blog\/wp-json\/wp\/v2\/pages\/85\/revisions\/101"}],"wp:attachment":[{"href":"https:\/\/www.lockpro.io\/blog\/wp-json\/wp\/v2\/media?parent=85"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}