{"id":11210,"date":"2026-06-22T16:35:34","date_gmt":"2026-06-22T08:35:34","guid":{"rendered":"https:\/\/eber.co\/?page_id=11210"},"modified":"2026-07-06T17:25:26","modified_gmt":"2026-07-06T09:25:26","slug":"referral-calculator","status":"publish","type":"page","link":"https:\/\/eber.co\/tools\/referral-calculator\/","title":{"rendered":"Referral Program ROI Calculator \u2014 Free Tool"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"11210\" class=\"elementor elementor-11210\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9f12c72 e-con-full e-flex e-con e-parent\" data-id=\"9f12c72\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9244049 elementor-widget elementor-widget-html\" data-id=\"9244049\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Montserrat:wght@400;500;600;700;800&family=Inter:wght@400;500&display=swap\" rel=\"stylesheet\">\n<style>\n#eber-calc,#eber-calc *,#eber-calc *::before,#eber-calc *::after{box-sizing:border-box}\n#eber-calc{position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;width:100vw;max-width:100vw;overflow-x:hidden}\n:root{\n  --c-dark:#0294A5;--c-btn:#00C4B3;--c-btn-h:#009E8F;--c-mid:#5A8A84;\n  --c-faint:#9CA3AF;--c-bg:#E9F8F7;--c-border:rgba(0,196,179,0.2);\n  --c-wh:#ffffff;--c-red:#DC2626;\n  --r:10px;--rl:14px;--rp:999px;\n  --sh:0 1px 3px rgba(2,148,165,.08),0 4px 16px rgba(2,148,165,.06);\n  --sh-card:0 1px 3px rgba(0,0,0,.04),0 4px 16px rgba(0,0,0,.07);\n}\n#eber-calc{font-family:'Montserrat',sans-serif;color:var(--c-mid);-webkit-font-smoothing:antialiased;display:block;font-size:14px}\n\n\/* HERO *\/\n.hero{background:#fff;background-image:linear-gradient(rgba(0,196,179,.07) 1px,transparent 1px),linear-gradient(90deg,rgba(0,196,179,.07) 1px,transparent 1px);background-size:60px 60px;padding:5rem 2rem 4rem;text-align:center;position:relative;overflow:hidden;width:100%;margin-left:0;margin-right:0}\n.hero::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 70% 60% at 50% 0%,rgba(0,196,179,.12),transparent 70%);pointer-events:none}\n.hpill{display:inline-flex;align-items:center;gap:.5rem;background:#E9F8F7;border:1px solid rgba(0,196,179,.3);border-radius:var(--rp);padding:.35rem 1rem;font-size:.75rem;font-weight:700;color:var(--c-dark);letter-spacing:.06em;text-transform:uppercase;margin-bottom:1.5rem;position:relative;font-family:'Montserrat',sans-serif}\n.hpill-dot{width:7px;height:7px;background:var(--c-btn);border-radius:50%;animation:bk 2s infinite}\n@keyframes bk{0%,100%{opacity:1}50%{opacity:.3}}\n.hero h1{font-size:clamp(2.25rem,5vw,3.75rem);font-weight:700;letter-spacing:-.03em;line-height:1.1;color:var(--c-dark);margin-bottom:1.25rem;position:relative;font-family:'Montserrat',sans-serif}\n.hero h1 b{color:var(--c-btn);font-weight:700}\n.hero p{font-size:1.0625rem;color:var(--c-mid);max-width:560px;margin:0 auto;line-height:1.75;position:relative}\n\n\/* TRUST BAR *\/\n.trust-bar{background:var(--c-bg);border-top:1px solid var(--c-border);border-bottom:1px solid var(--c-border);padding:1.25rem 2rem;display:flex;align-items:center;justify-content:center;gap:2.5rem;flex-wrap:wrap;width:100%;margin-left:0;margin-right:0}\n.trust-item{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;font-weight:700;color:var(--c-dark);font-family:'Montserrat',sans-serif}\n.trust-item svg{width:16px;height:16px;flex-shrink:0}\n\n\/* CALC *\/\n.cw{background:#f7fbfb;padding:2.5rem 2rem 3.5rem;width:100%;margin-left:0;margin-right:0}\n.ci{max-width:900px;margin:0 auto}\n.card{background:var(--c-wh);border:1px solid var(--c-border);border-radius:var(--rl);padding:1.5rem 1.75rem;margin-bottom:.875rem;box-shadow:var(--sh-card);transition:opacity .35s ease,box-shadow .35s ease,border-color .35s ease}\n.card.step-inactive{opacity:.38;pointer-events:none;filter:grayscale(.15)}\n.card.step-active{border-color:var(--c-btn);box-shadow:0 0 0 3px rgba(0,196,179,.12),var(--sh-card)}\n.result-panel{transition:opacity .35s ease}\n.result-panel.step-inactive{opacity:.38}\n.result-panel.step-active{opacity:1}\n.card.step-completed{opacity:.75;border-color:var(--c-border);box-shadow:var(--sh-card)}\n.card.step-completed:hover{opacity:1;cursor:pointer}\n.card-label{font-size:1.0625rem;font-weight:800;color:var(--c-dark);margin-bottom:1.25rem;display:flex;align-items:center;gap:.75rem;font-family:'Montserrat',sans-serif;letter-spacing:-.01em;line-height:1.2}\n.card-label .step-num{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%;background:var(--c-btn);color:#fff;font-size:.75rem;font-weight:800;flex-shrink:0}\n.card-label .step-title{flex:1}\n.card-label .step-sub{display:block;font-size:.8125rem;font-weight:500;color:var(--c-mid);margin-top:.2rem;letter-spacing:0}\n.step-next-btn{display:inline-flex;align-items:center;gap:.5rem;margin-top:1.25rem;background:var(--c-btn);color:#fff;border:none;border-radius:var(--rp);padding:.625rem 1.25rem;font-family:'Montserrat',sans-serif;font-size:.875rem;font-weight:700;cursor:pointer;transition:background .15s,transform .1s}\n.step-next-btn:hover{background:var(--c-btn-h);transform:translateY(-1px)}\n.step-next-btn svg{width:14px;height:14px;transition:transform .15s}\n.step-next-btn:hover svg{transform:translateX(3px)}\n.step-done-badge{display:none;align-items:center;gap:.375rem;font-size:.75rem;font-weight:700;color:var(--c-btn);margin-top:1rem}\n.step-done-badge .done-icon{width:18px;height:18px;background:var(--c-btn);border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}\n.step-done-badge .done-icon svg{width:10px;height:10px;color:#fff}\n.card.step-completed .step-next-btn{display:none}\n.card.step-completed .step-done-badge{display:flex}\n.card.step-active .step-done-badge{display:none}\n\n\/* SETUP ROW *\/\n.setup-row{display:flex;flex-wrap:wrap;gap:1.25rem;align-items:flex-start}\n.setup-group{display:flex;flex-direction:column;gap:.5rem}\n.setup-group-label{font-size:.6875rem;font-weight:700;color:var(--c-dark);text-transform:uppercase;letter-spacing:.08em;font-family:'Montserrat',sans-serif}\n.cur-select,.ind-select{height:2.5rem;border:1.5px solid var(--c-border);border-radius:.5rem;padding:0 2rem 0 .75rem;font-family:'Montserrat',sans-serif;font-size:.8125rem;font-weight:600;color:var(--c-dark);background:var(--c-wh);outline:none;cursor:pointer;transition:border-color .15s,box-shadow .15s;appearance:none;background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%230294A5' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'\/%3E%3C\/svg%3E\");background-repeat:no-repeat;background-position:right .625rem center}\n.cur-select{min-width:14rem}\n.ind-select{min-width:12rem}\n.cur-select:focus,.ind-select:focus{border-color:var(--c-btn);box-shadow:0 0 0 3px rgba(0,196,179,.12)}\n.tog{display:inline-flex;background:var(--c-bg);border:1.5px solid var(--c-border);border-radius:var(--rp);padding:3px;gap:3px}\n.tbtn{padding:.375rem .9375rem;border-radius:var(--rp);border:none;font-family:'Montserrat',sans-serif;font-size:.75rem;font-weight:600;cursor:pointer;color:var(--c-dark);background:transparent;transition:all .15s}\n.tbtn.active{background:var(--c-btn);color:#fff}\n\n\/* TRIGGER PICKER *\/\n.trigger-grid{display:grid;grid-template-columns:1fr 1fr;gap:.625rem;margin-top:.5rem}\n@media(max-width:580px){.trigger-grid{grid-template-columns:1fr}}\n.trigger-btn{display:flex;flex-direction:column;gap:.25rem;padding:.875rem 1rem;border:1.5px solid var(--c-border);border-radius:var(--r);background:var(--c-wh);text-align:left;cursor:pointer;transition:all .15s;font-family:'Montserrat',sans-serif}\n.trigger-btn:hover{border-color:var(--c-btn);background:var(--c-bg)}\n.trigger-btn.active{border-color:var(--c-btn);background:var(--c-bg)}\n.trigger-btn.active .tb-title{color:var(--c-dark)}\n.tb-title{font-size:.8125rem;font-weight:700;color:var(--c-dark);font-family:'Montserrat',sans-serif}\n.tb-desc{font-size:.6875rem;color:var(--c-faint);line-height:1.4}\n.trigger-btn.active{border-color:var(--c-btn);background:var(--c-bg);box-shadow:0 0 0 3px rgba(0,196,179,.1)}\n\n\/* MILESTONE GATE *\/\n.milestone-toggle-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;padding-top:1rem;border-top:1px solid var(--c-border);margin-top:1rem}\n.milestone-toggle-label{font-size:.8125rem;font-weight:700;color:var(--c-dark)}\n.milestone-toggle-label span{display:block;font-size:.6875rem;font-weight:500;color:var(--c-faint);margin-top:.2rem}\n.milestone-input-row{display:none;align-items:center;gap:.75rem;margin-top:.875rem;padding:.875rem 1rem;background:var(--c-bg);border-radius:var(--r);border:1px solid var(--c-border)}\n.milestone-input-row.show{display:flex;flex-wrap:wrap}\n.mi-label{font-size:.75rem;font-weight:600;color:var(--c-dark);white-space:nowrap}\n.mi-input{width:80px;height:2.25rem;border:1.5px solid var(--c-border);border-radius:.5rem;padding:0 .625rem;font-family:'Montserrat',sans-serif;font-size:.875rem;font-weight:700;color:var(--c-dark);background:var(--c-wh);outline:none;text-align:center;transition:border-color .15s}\n.mi-input:focus{border-color:var(--c-btn);box-shadow:0 0 0 3px rgba(0,196,179,.12)}\n.mi-note{font-size:.6875rem;color:var(--c-faint);line-height:1.4}\n\n\/* SLIDERS *\/\n.sq-grid{display:grid;grid-template-columns:1fr 1fr;gap:1rem}\n@media(max-width:580px){.sq-grid{grid-template-columns:1fr}}\n.sq{background:var(--c-wh);border-radius:var(--r);padding:0;border:none}\n.sq-top{display:flex;align-items:center;justify-content:space-between;gap:.5rem;margin-bottom:.375rem}\n.sq-lbl{font-size:.8125rem;font-weight:700;color:var(--c-dark);line-height:1.3;font-family:'Montserrat',sans-serif}\n.sq-val{font-family:'Montserrat',sans-serif;font-size:.8125rem;font-weight:700;color:var(--c-dark);background:var(--c-bg);padding:.1875rem .625rem;border-radius:6px;white-space:nowrap;flex-shrink:0;min-width:3.375rem;text-align:center;border:1px solid var(--c-border)}\n.sq-val-input{font-family:'Montserrat',sans-serif;font-size:.8125rem;font-weight:700;color:var(--c-dark);background:var(--c-bg);padding:.25rem .5rem;border-radius:6px;width:72px;text-align:center;border:1px solid var(--c-border);outline:none;-moz-appearance:textfield;appearance:textfield}\n.sq-val-input::-webkit-inner-spin-button,.sq-val-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}\n.sq-val-input:focus{border-color:var(--c-btn);box-shadow:0 0 0 3px rgba(0,196,179,.12)}\n.sq-hint{font-size:.6875rem;color:var(--c-mid);margin-top:.375rem;line-height:1.4}\n\/* Tooltip *\/\n.tooltip-wrap{position:relative;display:inline-flex;align-items:center;margin-left:.375rem;vertical-align:middle}\n.tooltip-icon{color:var(--c-faint);font-size:.6875rem;font-weight:600;cursor:default;line-height:1;flex-shrink:0;transition:color .15s;user-select:none}\n.tooltip-icon:hover{color:var(--c-mid)}\n.tooltip-bubble{display:none;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%);background:var(--c-dark);color:#fff;font-size:.6875rem;font-weight:500;line-height:1.5;padding:.5rem .75rem;border-radius:.5rem;white-space:nowrap;max-width:220px;white-space:normal;width:220px;z-index:100;pointer-events:none;font-family:Montserrat,sans-serif}\n.tooltip-bubble::after{content:'';position:absolute;top:100%;left:50%;transform:translateX(-50%);border:5px solid transparent;border-top-color:var(--c-dark)}\n.tooltip-wrap:hover .tooltip-bubble{display:block}\n\/* Step 3 reward section \u2014 cleaner *\/\n.reward-section-label{font-size:.6875rem;font-weight:700;text-transform:uppercase;letter-spacing:.09em;color:var(--c-dark);margin-bottom:.75rem;margin-top:1.25rem;padding-top:1.25rem;border-top:1px solid var(--c-border);display:flex;align-items:center;gap:.5rem}\n\/* Form centred header *\/\n.form-header{text-align:center;margin-bottom:1.75rem}\n.form-header h3{font-family:Montserrat,sans-serif;font-size:clamp(2rem,4vw,3rem);font-weight:800;color:var(--c-dark);letter-spacing:-.03em;margin-bottom:.5rem;line-height:1.05}\n.form-header p{font-size:.875rem;color:var(--c-mid);line-height:1.6}\n\/* Milestone desc hidden until on *\/\n.milestone-desc{font-size:.6875rem;color:var(--c-faint);margin-top:.25rem;display:none}\n.milestone-desc.show{display:block}\ninput[type=range]{-webkit-appearance:none;appearance:none;width:100%;height:5px;background:#D0EEEC;border-radius:3px;outline:none;cursor:pointer;margin:.5rem 0 .25rem}\ninput[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:20px;height:20px;border-radius:50%;background:var(--c-dark);border:3px solid var(--c-wh);box-shadow:0 0 0 2px var(--c-dark);cursor:pointer;transition:transform .15s}\ninput[type=range]::-webkit-slider-thumb:hover{transform:scale(1.1)}\ninput[type=range]::-moz-range-thumb{width:20px;height:20px;border-radius:50%;background:var(--c-dark);border:3px solid var(--c-wh);box-shadow:0 0 0 2px var(--c-dark)}\n.sq-ends{display:flex;justify-content:space-between;font-size:.625rem;color:var(--c-faint);margin-top:.125rem;font-weight:600}\n\n\/* REWARD SETTINGS *\/\n.reward-row{display:flex;flex-wrap:wrap;gap:1rem;margin-top:1rem;padding-top:1rem;border-top:1px solid var(--c-border)}\n.reward-group{display:flex;flex-direction:column;gap:.375rem;flex:1;min-width:160px}\n.reward-group-label{font-size:.6875rem;font-weight:700;color:var(--c-dark);text-transform:uppercase;letter-spacing:.07em}\n.rtype-row{display:flex;gap:.5rem}\n.rtbtn{padding:.3125rem .875rem;border:1.5px solid var(--c-border);border-radius:var(--rp);background:var(--c-wh);font-size:.75rem;font-weight:700;color:var(--c-dark);cursor:pointer;transition:all .15s;font-family:'Montserrat',sans-serif}\n.rtbtn.active{border-color:var(--c-btn);background:var(--c-btn);color:#fff}\n.reward-input-wrap{display:flex;align-items:center;gap:.5rem}\n.reward-input{width:90px;height:2.25rem;border:1.5px solid var(--c-border);border-radius:.5rem;padding:0 .625rem;font-family:'Montserrat',sans-serif;font-size:.875rem;font-weight:700;color:var(--c-dark);background:var(--c-wh);outline:none;transition:border-color .15s}\n.reward-input:focus{border-color:var(--c-btn);box-shadow:0 0 0 3px rgba(0,196,179,.12)}\n.reward-input-label{font-size:.6875rem;color:var(--c-faint)}\n\n\/* RESULTS \u2014 single panel *\/\n.result-panel{background:var(--c-bg);border:1px solid var(--c-border);border-radius:var(--rl);padding:1.5rem;margin-top:.25rem;box-shadow:var(--sh-card)}\n.result-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1rem;flex-wrap:wrap}\n.result-title{font-size:.6875rem;font-weight:700;text-transform:uppercase;letter-spacing:.09em;color:var(--c-dark);font-family:'Montserrat',sans-serif}\n.result-trigger-badge{font-size:.6875rem;font-weight:700;background:var(--c-btn);color:#fff;padding:.25rem .75rem;border-radius:var(--rp);font-family:'Montserrat',sans-serif}\n.result-milestone-badge{font-size:.6875rem;font-weight:700;background:var(--c-dark);color:#fff;padding:.25rem .75rem;border-radius:var(--rp);font-family:'Montserrat',sans-serif;display:none}\n.result-metric-big{background:var(--c-wh);border-radius:var(--r);padding:1.125rem 1.25rem;margin-bottom:1rem;border:1px solid var(--c-border);box-shadow:0 1px 4px rgba(2,148,165,.06)}\n.result-metric-big .rml{font-size:.625rem;font-weight:700;text-transform:uppercase;letter-spacing:.09em;color:var(--c-dark);margin-bottom:.375rem;font-family:'Montserrat',sans-serif}\n.result-metric-big .rmv{font-family:'Montserrat',sans-serif;font-size:2.25rem;font-weight:800;letter-spacing:-.025em;line-height:1;color:var(--c-dark)}\n.result-metric-big .rms{font-size:.75rem;color:var(--c-mid);margin-top:.3125rem}\n.result-rows{display:grid;grid-template-columns:1fr 1fr;gap:.5rem;margin-bottom:1rem}\n@media(max-width:520px){.result-rows{grid-template-columns:1fr}}\n.rr{background:var(--c-wh);border-radius:var(--r);padding:.75rem 1rem;border:1px solid var(--c-border)}\n.rr-lbl{font-size:.6875rem;color:var(--c-mid);margin-bottom:.25rem}\n.rr-val{font-size:.9375rem;font-weight:800;color:var(--c-dark);font-family:'Montserrat',sans-serif}\n.result-insight{font-size:.75rem;color:var(--c-mid);line-height:1.55;padding:.75rem 1rem;background:var(--c-wh);border-radius:var(--r);border:1px solid var(--c-border);margin-bottom:1rem}\n.result-warn{font-size:.75rem;color:#92400E;line-height:1.55;padding:.75rem 1rem;background:#FFFBEB;border-radius:var(--r);border:1px solid #FCD34D;margin-bottom:1rem;display:none}\n\n\/* FORM *\/\n.form-section{margin-top:.875rem;background:var(--c-wh);border:1px solid var(--c-border);border-radius:var(--rl);padding:1.75rem;box-shadow:var(--sh-card)}\n.form-section h3{font-family:'Montserrat',sans-serif;font-size:1.25rem;font-weight:700;color:var(--c-dark);margin-bottom:.375rem}\n.form-section .form-sub{font-size:.8125rem;color:var(--c-mid);margin-bottom:1.375rem;line-height:1.65}\n.frow{display:grid;grid-template-columns:1fr 1fr;gap:.75rem}\n@media(max-width:520px){.frow{grid-template-columns:1fr}}\n.fg{margin-bottom:.75rem}\n.fg label{display:block;font-size:.75rem;font-weight:700;color:var(--c-dark);margin-bottom:.3125rem;font-family:'Montserrat',sans-serif}\n.fg input,.fg select{width:100%;border:1.5px solid var(--c-border);border-radius:.5rem;padding:0 .8125rem;font-family:'Montserrat',sans-serif;font-size:.875rem;color:var(--c-dark);background:var(--c-wh);outline:none;height:2.75rem;transition:border-color .15s,box-shadow .15s}\n.fg input:focus,.fg select:focus{border-color:var(--c-btn);box-shadow:0 0 0 3px rgba(0,196,179,.12)}\n.fg input::placeholder{color:#A8CECE}\n.err-msg{display:none;background:#FEF2F2;border:1px solid #FECACA;border-radius:.5rem;padding:.625rem .875rem;font-size:.75rem;color:var(--c-red);margin-bottom:.75rem}\n.submit-btn{width:100%;height:3.125rem;background:var(--c-btn);color:#fff;border:none;border-radius:var(--rp);font-family:'Montserrat',sans-serif;font-size:.9375rem;font-weight:800;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:.5625rem;transition:background .15s,transform .1s;margin-top:.375rem}\n.submit-btn:hover{background:var(--c-btn-h);transform:translateY(-1px)}\n.submit-btn svg{width:15px;height:15px}\n.form-note{text-align:center;font-size:.6875rem;color:var(--c-faint);margin-top:.625rem;display:flex;align-items:center;justify-content:center;gap:.3125rem}\n.form-note svg{width:11px;height:11px}\n\n\/* GEN + SUCCESS *\/\n.gen-wrap{display:none;text-align:center;padding:2.25rem 1.25rem}\n.gen-icon{width:3.375rem;height:3.375rem;margin:0 auto .875rem;background:var(--c-bg);border:1px solid var(--c-border);border-radius:50%;display:flex;align-items:center;justify-content:center}\n.gen-icon svg{width:24px;height:24px;color:var(--c-dark)}\n.gen-wrap h3{font-family:'Montserrat',sans-serif;font-size:1.0625rem;font-weight:700;color:var(--c-dark);margin-bottom:.375rem}\n.gen-wrap p{font-size:.8125rem;color:var(--c-mid);margin-bottom:1.125rem;line-height:1.5}\n.pbar{height:5px;background:#D0EEEC;border-radius:3px;max-width:15rem;margin:0 auto;overflow:hidden}\n.pfill{height:100%;background:var(--c-dark);border-radius:3px;width:0%;transition:width .4s ease}\n.gen-steps{display:flex;flex-direction:column;gap:.5rem;max-width:15rem;margin:.875rem auto 0;text-align:left}\n.gstep{display:flex;align-items:center;gap:.5rem;font-size:.75rem;color:var(--c-faint);font-weight:500}\n.gstep.active{color:var(--c-dark);font-weight:700}\n.gstep.done{color:var(--c-btn)}\n.gdot{width:15px;height:15px;border-radius:50%;border:1.5px solid var(--c-border);flex-shrink:0;transition:all .3s}\n.gstep.active .gdot{border-color:var(--c-dark);animation:spin 1.5s linear infinite}\n.gstep.done .gdot{background:var(--c-btn);border-color:var(--c-btn)}\n@keyframes spin{0%{box-shadow:0 0 0 2px rgba(2,148,165,.25)}50%{box-shadow:0 0 0 4px rgba(2,148,165,.08)}100%{box-shadow:0 0 0 2px rgba(2,148,165,.25)}}\n.success-wrap{display:none;text-align:center;padding:2.25rem 1.25rem}\n.success-icon{width:3.375rem;height:3.375rem;margin:0 auto .875rem;background:var(--c-bg);border:1px solid var(--c-border);border-radius:50%;display:flex;align-items:center;justify-content:center}\n.success-icon svg{width:24px;height:24px;color:var(--c-btn)}\n.success-wrap h3{font-family:'Montserrat',sans-serif;font-size:1.1875rem;font-weight:700;color:var(--c-dark);margin-bottom:.5rem}\n.success-wrap p{font-size:.8125rem;color:var(--c-mid);line-height:1.65;margin-bottom:.875rem}\n.success-note{display:inline-block;font-size:.6875rem;color:var(--c-dark);background:var(--c-bg);border:1px solid var(--c-border);border-radius:var(--r);padding:.5625rem .875rem}\n\n\/* EXPLAINER *\/\n.exp{padding:3.25rem 2rem;background:var(--c-wh);border-top:1px solid var(--c-border);width:100%;margin-left:0;margin-right:0}\n.exp-inner{max-width:900px;margin:0 auto}\n.sec-tag{font-size:.6875rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--c-btn);display:block;margin-bottom:.5rem;font-family:'Montserrat',sans-serif}\n.exp h2{font-family:'Montserrat',sans-serif;font-size:clamp(1.25rem,3vw,1.75rem);font-weight:700;color:var(--c-dark);margin-bottom:1.5rem;line-height:1.3}\n.how-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:.875rem;margin-bottom:2rem}\n.how-card{border-radius:var(--rl);padding:1.25rem;border:1px solid var(--c-border);background:var(--c-wh);box-shadow:var(--sh-card)}\n.how-card-num{font-size:1.5rem;font-weight:800;color:var(--c-btn);font-family:'Montserrat',sans-serif;margin-bottom:.5rem;line-height:1}\n.how-card h4{font-family:'Montserrat',sans-serif;font-size:.875rem;font-weight:700;color:var(--c-dark);margin-bottom:.375rem}\n.how-card p{font-size:.75rem;color:var(--c-mid);line-height:1.6}\n.trigger-table{width:100%;border-collapse:collapse;margin-bottom:2rem;font-size:.8125rem}\n.trigger-table th{text-align:left;font-size:.625rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--c-btn);padding:.625rem .875rem;background:var(--c-bg);border-bottom:1px solid var(--c-border)}\n.trigger-table td{padding:.75rem .875rem;border-bottom:1px solid rgba(0,196,179,.08);color:var(--c-mid);vertical-align:top}\n.trigger-table td:first-child{font-weight:700;color:var(--c-dark);white-space:nowrap}\n.trigger-table tr:last-child td{border-bottom:none}\n.faq-wrap{background:var(--c-bg);border-radius:var(--rl);padding:1.25rem 1.5rem;border:1px solid var(--c-border)}\n.faq-row{padding:1rem 0;border-bottom:1px solid var(--c-border);display:flex;gap:1rem;align-items:flex-start}\n.faq-row:last-child{border-bottom:none;padding-bottom:0}\n.faq-row:first-child{padding-top:0}\n.faq-q{font-size:.8125rem;font-weight:700;color:var(--c-dark);min-width:12.5rem;flex-shrink:0;font-family:'Montserrat',sans-serif}\n@media(max-width:520px){.faq-q{min-width:unset}}\n.faq-a{font-size:.8125rem;color:var(--c-mid);line-height:1.6}\n\n@media(max-width:768px){\n  .hero{padding:3.5rem 1.25rem 3rem}\n  .trust-bar{gap:1.25rem}\n  .cw{padding:1.75rem 1.25rem 2.5rem}\n  .exp{padding:2.5rem 1.25rem}\n  .form-section{padding:1.25rem}\n  .result-rows{grid-template-columns:1fr 1fr}\n}\n@media(max-width:480px){.result-rows{grid-template-columns:1fr}}\n@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}\n<\/style>\n\n<div id=\"eber-calc\">\n\n<section class=\"hero\">\n  <div class=\"hpill\"><span class=\"hpill-dot\"><\/span>Referral Revenue Estimator<\/div>\n  <h1>Your regulars are your<br><b>best sales channel.<\/b><\/h1>\n  <p>See what your referral program could earn in 12 months.<\/p>\n  <button onclick=\"startCalculator()\" style=\"margin-top:2rem;display:inline-flex;align-items:center;gap:.625rem;background:var(--c-btn);color:#fff;border:none;border-radius:var(--rp);padding:.875rem 2rem;font-family:Montserrat,sans-serif;font-size:1rem;font-weight:800;cursor:pointer;transition:background .15s,transform .1s;position:relative\" onmouseover=\"this.style.background='var(--c-btn-h)';this.style.transform='translateY(-2px)'\" onmouseout=\"this.style.background='var(--c-btn)';this.style.transform='none'\">\n    Calculate mine\n    <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg>\n  <\/button>\n<\/section>\n\n<div class=\"trust-bar\">\n  <div class=\"trust-item\">\n    <svg width=\"16\" height=\"16\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"#00C4B3\" stroke-width=\"2.2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\/><\/svg>\n    500+ brands on Eber\n  <\/div>\n  <div class=\"trust-item\">\n    <svg width=\"16\" height=\"16\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"#00C4B3\" stroke-width=\"2.2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13 7h8m0 0v8m0-8l-8 8-4-4-6 6\"\/><\/svg>\n    Avg 34% retention lift\n  <\/div>\n  <div class=\"trust-item\">\n    <svg width=\"16\" height=\"16\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"#00C4B3\" stroke-width=\"2.2\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\/><\/svg>\n    Launch in a week\n  <\/div>\n<\/div>\n\n<section class=\"cw\" id=\"calculator\">\n  <div class=\"ci\">\n\n    <!-- STEP 1: BUSINESS SETUP -->\n    <div class=\"card\" id=\"setup-card\">\n      <div class=\"card-label\"><span class=\"step-num\">1<\/span><span class=\"step-title\">Tell us about your business.<span class=\"step-sub\">Auto-filled for your industry.<\/span><\/span><\/div>\n      <div class=\"setup-row\">\n        <div class=\"setup-group\">\n          <div class=\"setup-group-label\">Currency<\/div>\n          <select class=\"cur-select\" id=\"cur-select\" onchange=\"setCurSelect(this)\">\n            <option value=\"MYR\">RM \u2014 Malaysian Ringgit<\/option>\n            <option value=\"SGD\">S$ \u2014 Singapore Dollar<\/option>\n            <option value=\"HKD\">HK$ \u2014 Hong Kong Dollar<\/option>\n            <option value=\"IDR\">Rp \u2014 Indonesian Rupiah<\/option>\n            <option value=\"PHP\">&#8369; \u2014 Philippine Peso<\/option>\n            <option value=\"THB\">&#3647; \u2014 Thai Baht<\/option>\n          <\/select>\n        <\/div>\n        <div class=\"setup-group\">\n          <div class=\"setup-group-label\">Business type<\/div>\n          <select class=\"ind-select\" id=\"ind-select\" onchange=\"setIndSelect(this)\">\n            <option value=\"fnb\">Cafe \/ Restaurant<\/option>\n            <option value=\"retail\">Retail<\/option>\n            <option value=\"beauty\">Beauty \/ Wellness<\/option>\n            <option value=\"hotel\">Hotel \/ Hospitality<\/option>\n            <option value=\"other\">Other<\/option>\n          <\/select>\n        <\/div>\n      <\/div>\n      <button class=\"step-next-btn\" onclick=\"activateStep(2)\">\n        Next\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg>\n      <\/button>\n      <div class=\"step-done-badge\">\n        <div class=\"done-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg><\/div>\n        Business type set\n      <\/div>\n    <\/div>\n\n    <!-- STEP 2: REWARD TRIGGER -->\n    <div class=\"card\" id=\"trigger-card\">\n      <div class=\"card-label\"><span class=\"step-num\">2<\/span><span class=\"step-title\">When should your advocate earn?<span class=\"step-sub\">One option. Pick what fits.<\/span><\/span><\/div>\n      <div class=\"trigger-grid\">\n        <button class=\"trigger-btn\" id=\"tb-signup\" onclick=\"setTrigger('signup',this)\">\n          <span class=\"tb-title\" style=\"display:flex;align-items:center;gap:.25rem\">At signup<span class=\"tooltip-wrap\"><span class=\"tooltip-icon\">?<\/span><span class=\"tooltip-bubble\">Reward fires at account creation. No spend required.<\/span><\/span><\/span>\n        <\/button>\n        <button class=\"trigger-btn active\" id=\"tb-first\" onclick=\"setTrigger('first',this)\">\n          <span class=\"tb-title\" style=\"display:flex;align-items:center;gap:.25rem\">On first purchase<span class=\"tooltip-wrap\"><span class=\"tooltip-icon\">?<\/span><span class=\"tooltip-bubble\">Reward fires once, on the referee's first transaction.<\/span><\/span><\/span>\n        <\/button>\n        <button class=\"trigger-btn\" id=\"tb-every\" onclick=\"setTrigger('every',this)\">\n          <span class=\"tb-title\" style=\"display:flex;align-items:center;gap:.25rem\">On every purchase<span class=\"tooltip-wrap\"><span class=\"tooltip-icon\">?<\/span><span class=\"tooltip-bubble\">Reward fires on every referee transaction \u2014 ongoing.<\/span><\/span><\/span>\n        <\/button>\n        <button class=\"trigger-btn\" id=\"tb-accum\" onclick=\"setTrigger('accum',this)\">\n          <span class=\"tb-title\" style=\"display:flex;align-items:center;gap:.25rem\">When total spend hits a target<span class=\"tooltip-wrap\"><span class=\"tooltip-icon\">?<\/span><span class=\"tooltip-bubble\">Reward fires when total referee spend crosses a set threshold.<\/span><\/span><\/span>\n        <\/button>\n        <button class=\"trigger-btn\" id=\"tb-receipt\" onclick=\"setTrigger('receipt',this)\">\n          <span class=\"tb-title\" style=\"display:flex;align-items:center;gap:.25rem\">On first qualifying receipt<span class=\"tooltip-wrap\"><span class=\"tooltip-icon\">?<\/span><span class=\"tooltip-bubble\">Reward fires on the first single receipt above your minimum spend.<\/span><\/span><\/span>\n        <\/button>\n      <\/div>\n\n      <!-- MILESTONE BANDS (optional) -->\n      <div class=\"milestone-toggle-row\">\n        <div class=\"milestone-toggle-label\">\n          Set milestone bands (optional)\n          <span class=\"milestone-desc\" id=\"milestone-desc\">Reward advocates differently at each referral count range \u2014 e.g. 1\u20133 refs = Reward A, 4\u20137 refs = Reward B<\/span>\n        <\/div>\n        <div class=\"tog\">\n          <button class=\"tbtn active\" id=\"ms-no\" onclick=\"setMilestone(false)\">Off<\/button>\n          <button class=\"tbtn\" id=\"ms-yes\" onclick=\"setMilestone(true)\">On<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"milestone-input-row\" id=\"milestone-input-row\">\n        <div style=\"width:100%\">\n          <div style=\"font-size:.6875rem;color:var(--c-faint);margin-bottom:.75rem\">Define your reward tiers below. Each band sets a referral count range and the points awarded. Counts are permanent and never reset.<\/div>\n          <div id=\"ms-bands-list\"><\/div>\n          <button onclick=\"addMsBand()\" style=\"margin-top:.625rem;display:inline-flex;align-items:center;gap:.375rem;background:none;border:1.5px dashed var(--c-border);border-radius:var(--r);padding:.4375rem .875rem;font-family:Montserrat,sans-serif;font-size:.75rem;font-weight:600;color:var(--c-dark);cursor:pointer\">\n            + Add tier\n          <\/button>\n        <\/div>\n      <\/div>\n      <button class=\"step-next-btn\" onclick=\"activateStep(3)\">\n        Next\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg>\n      <\/button>\n      <div class=\"step-done-badge\">\n        <div class=\"done-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg><\/div>\n        Trigger set\n      <\/div>\n    <\/div>\n\n    <!-- STEP 3: YOUR NUMBERS -->\n    <div class=\"card\" id=\"numbers-card\">\n      <div class=\"card-label\"><span class=\"step-num\">3<\/span><span class=\"step-title\">What does your business look like?<span class=\"step-sub\">Adjust to match your business.<\/span><\/span><\/div>\n      <div class=\"sq-grid\">\n        <div class=\"sq\">\n          <div class=\"sq-top\"><div class=\"sq-lbl\">Regular customers<\/div><input class=\"sq-val-input\" id=\"v-mem\" type=\"number\" value=\"500\" oninput=\"syncFromInput('v-mem','s-mem')\"><\/div>\n          <input type=\"range\" id=\"s-mem\" min=\"50\" max=\"5000\" step=\"50\" value=\"500\">\n          <div class=\"sq-ends\"><span>50<\/span><span class=\"sq-end-max\" data-default=\"5,000\">5,000<\/span><\/div>\n        <\/div>\n        <div class=\"sq\">\n          <div class=\"sq-top\"><div class=\"sq-lbl\">Avg spend per visit<\/div><input class=\"sq-val-input\" id=\"v-spend\" type=\"number\" value=\"60\" oninput=\"syncFromInput('v-spend','s-spend')\"><\/div>\n          <input type=\"range\" id=\"s-spend\" min=\"10\" max=\"600\" step=\"5\" value=\"60\">\n          <div class=\"sq-ends\"><span id=\"sp-min\">RM 10<\/span><span id=\"sp-max\" class=\"sq-end-max\" data-default=\"RM 600\">RM 600<\/span><\/div>\n        <\/div>\n        <div class=\"sq\">\n          <div class=\"sq-top\"><div class=\"sq-lbl\">Visits per month<\/div><input class=\"sq-val-input\" id=\"v-vis\" type=\"number\" value=\"2\" oninput=\"syncFromInput('v-vis','s-vis')\"><\/div>\n          <input type=\"range\" id=\"s-vis\" min=\"1\" max=\"12\" step=\"1\" value=\"2\">\n          <div class=\"sq-ends\"><span>1x<\/span><span class=\"sq-end-max\" data-default=\"12x\">12x<\/span><\/div>\n        <\/div>\n        <div class=\"sq\">\n          <div class=\"sq-top\"><div class=\"sq-lbl\">Advocates (% of regulars)<\/div><input class=\"sq-val-input\" id=\"v-refs\" type=\"number\" value=\"10\" oninput=\"syncFromInput('v-refs','s-refs')\"><\/div>\n          <input type=\"range\" id=\"s-refs\" min=\"1\" max=\"30\" step=\"1\" value=\"10\">\n          <div class=\"sq-ends\"><span>1%<\/span><span class=\"sq-end-max\" data-default=\"30%\">30%<\/span><\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"reward-section-label\">Reward structure<span class=\"tooltip-wrap\"><span class=\"tooltip-icon\">?<\/span><span class=\"tooltip-bubble\">Set how advocates earn points. Fixed gives a flat amount per referral. Per RM scales with how much the referee spends.<\/span><\/span><\/div>\n      <div class=\"reward-row\">\n        <div class=\"reward-group\">\n          <div class=\"reward-group-label\">Reward type<\/div>\n          <div class=\"rtype-row\">\n            <button class=\"rtbtn active\" id=\"rt-fixed\" onclick=\"setRType('fixed',this)\">Fixed points<\/button>\n            <button class=\"rtbtn\" id=\"rt-per\" onclick=\"setRType('per',this)\">Per <span class=\"sym-lbl\">RM<\/span><\/button>\n          <\/div>\n        <\/div>\n        <div class=\"reward-group\" id=\"rg-fixed\">\n          <div class=\"reward-group-label\">Points<\/div>\n          <div class=\"reward-input-wrap\">\n            <input type=\"number\" class=\"reward-input\" id=\"r-fixed-pts\" value=\"100\" min=\"1\" max=\"5000\" oninput=\"recalc()\">\n            <span class=\"reward-input-label\">pts flat<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"reward-group\" id=\"rg-per\" style=\"display:none\">\n          <div class=\"reward-group-label\">Points per <span class=\"sym-lbl\">RM<\/span><\/div>\n          <div class=\"reward-input-wrap\">\n            <input type=\"number\" class=\"reward-input\" id=\"r-per-pts\" value=\"5\" min=\"1\" max=\"100\" oninput=\"recalc()\">\n            <span class=\"reward-input-label\">pts \/ <span class=\"sym-lbl\">RM<\/span><\/span>\n          <\/div>\n        <\/div>\n        <div class=\"reward-group\">\n          <div class=\"reward-group-label\">Every 100 pts =<\/div>\n          <div class=\"reward-input-wrap\">\n            <span class=\"reward-input-label sym-lbl\" style=\"margin-right:.25rem\">RM<\/span>\n            <input type=\"number\" class=\"reward-input\" id=\"r-ptval\" value=\"1.00\" min=\"0.10\" max=\"10\" step=\"0.25\" oninput=\"recalc()\">\n          <\/div>\n        <\/div>\n        <div class=\"reward-group\" id=\"rg-minspend\">\n          <div class=\"reward-group-label\">Min spend<\/div>\n          <div class=\"reward-input-wrap\">\n            <input type=\"number\" class=\"reward-input\" id=\"r-minsp\" value=\"25\" min=\"0\" max=\"10000\" step=\"5\" oninput=\"recalc()\">\n            <span class=\"reward-input-label sym-lbl\">RM<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n      <button class=\"step-next-btn\" onclick=\"activateStep(4)\">\n        See my results\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg>\n      <\/button>\n    <\/div>\n\n    <!-- RESULT PANEL -->\n    <div class=\"result-panel\" id=\"result-panel\">\n      <div class=\"result-header\">\n        <div style=\"font-size:1rem;font-weight:800;color:var(--c-dark);font-family:Montserrat,sans-serif;letter-spacing:-.01em;margin-bottom:.75rem\">Your word-of-mouth, finally worth something.<\/div>\n        <div style=\"display:flex;gap:.5rem;flex-wrap:wrap\">\n          <div class=\"result-trigger-badge\" id=\"r-trigger-badge\">On first purchase<\/div>\n          <div class=\"result-milestone-badge\" id=\"r-milestone-badge\">Milestone gate: 3 referrals<\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"result-warn\" id=\"r-warn\"><\/div>\n\n      <div class=\"result-metric-big\">\n        <div class=\"rml\" id=\"r-big-label\">Revenue from referrals<\/div>\n        <div class=\"rmv\" id=\"r-big-val\">\u2014<\/div>\n        <div class=\"rms\" id=\"r-big-sub\">what your regulars could generate in 12 months<\/div>\n      <\/div>\n\n      <div class=\"result-rows\">\n        <div class=\"rr\"><div class=\"rr-lbl\" id=\"r1-lbl\">New customers by month 12<\/div><div class=\"rr-val\" id=\"r1-val\">\u2014<\/div><\/div>\n        <div class=\"rr\"><div class=\"rr-lbl\">Active advocates<\/div><div class=\"rr-val\" id=\"r2-val\">\u2014<\/div><\/div>\n        <div class=\"rr\"><div class=\"rr-lbl\">Reward payout<\/div><div class=\"rr-val\" id=\"r3-val\">\u2014<\/div><\/div>\n        <div class=\"rr\"><div class=\"rr-lbl\" id=\"r4-lbl\">Net revenue<\/div><div class=\"rr-val\" id=\"r4-val\">\u2014<\/div><\/div>\n      <\/div>\n\n      <div class=\"result-insight\" id=\"r-insight\">Adjust the settings above to see your projection.<\/div>\n    <\/div>\n\n    <!-- FORM -->\n    <div class=\"form-section\" id=\"form-section\">\n      <div id=\"form-fields\">\n        <div class=\"form-header\">\n          <h3>Get your free report.<\/h3>\n          <p>Personalised setup, tier structure, and projected returns \u2014 sent to your inbox.<\/p>\n        <\/div>\n        <div id=\"err-msg\" class=\"err-msg\"><\/div>\n        <div class=\"frow\">\n          <div class=\"fg\"><label>First name *<\/label><input type=\"text\" id=\"f-fname\" placeholder=\"Ahmad\"><\/div>\n          <div class=\"fg\"><label>Work email *<\/label><input type=\"email\" id=\"f-email\" placeholder=\"you@yourbrand.com\"><\/div>\n        <\/div>\n        <div class=\"frow\">\n          <div class=\"fg\"><label>Business name *<\/label><input type=\"text\" id=\"f-biz\" placeholder=\"Kopi &amp; Co.\"><\/div>\n          <div class=\"fg\">\n            <label>Business type<\/label>\n            <select id=\"f-industry\">\n              <option value=\"Cafe \/ Restaurant\">Cafe \/ Restaurant<\/option>\n              <option value=\"Retail\">Retail<\/option>\n              <option value=\"Beauty \/ Wellness\">Beauty \/ Wellness<\/option>\n              <option value=\"Hotel \/ Hospitality\">Hotel \/ Hospitality<\/option>\n              <option value=\"Other\">Other<\/option>\n            <\/select>\n          <\/div>\n        <\/div>\n        <button class=\"submit-btn\" id=\"submit-btn\" onclick=\"submitForm()\">\n          Email me my report\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"\/><polygon points=\"22 2 15 22 11 13 2 9 22 2\"\/><\/svg>\n        <\/button>\n        <div class=\"form-note\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"\/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"\/><\/svg>\n          No spam. One email with your report.\n        <\/div>\n      <\/div>\n      <div class=\"gen-wrap\" id=\"gen-wrap\">\n        <div class=\"gen-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"3\"\/><path d=\"M12 2v3M12 19v3M4.22 4.22l2.12 2.12M17.66 17.66l2.12 2.12M2 12h3M19 12h3M4.22 19.78l2.12-2.12M17.66 6.34l2.12-2.12\"\/><\/svg><\/div>\n        <h3>Building your report...<\/h3>\n        <p>Putting together your personalised referral analysis.<\/p>\n        <div class=\"pbar\"><div class=\"pfill\" id=\"pfill\"><\/div><\/div>\n        <div class=\"gen-steps\">\n          <div class=\"gstep active\" id=\"gs1\"><div class=\"gdot\"><\/div>Reading your inputs<\/div>\n          <div class=\"gstep\" id=\"gs2\"><div class=\"gdot\"><\/div>Modelling your program<\/div>\n          <div class=\"gstep\" id=\"gs3\"><div class=\"gdot\"><\/div>Writing your analysis<\/div>\n          <div class=\"gstep\" id=\"gs4\"><div class=\"gdot\"><\/div>Sending to your inbox<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"success-wrap\" id=\"success-wrap\">\n        <div class=\"success-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg><\/div>\n        <h3>Your report is on its way.<\/h3>\n        <p>We have sent your personalised referral analysis to <strong id=\"sent-email\"><\/strong>. Check your inbox \u2014 it should arrive in a few minutes.<\/p>\n        <div class=\"success-note\">Our team will also follow up within 1 business day.<\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n<\/section>\n\n<!-- EXPLAINER -->\n<section class=\"exp\">\n  <div class=\"exp-inner\">\n    <span class=\"sec-tag\">How Eber Referral works<\/span>\n    <h2>One program. Configured your way.<\/h2>\n\n    <div class=\"how-grid\">\n      <div class=\"how-card\">\n        <div class=\"how-card-num\">01<\/div>\n        <h4>Your customer refers a friend<\/h4>\n        <p>They share a unique link. Their friend signs up through it \u2014 now they're linked in the system permanently.<\/p>\n      <\/div>\n      <div class=\"how-card\">\n        <div class=\"how-card-num\">02<\/div>\n        <h4>The milestone gate fires (if set)<\/h4>\n        <p>If you set a milestone, rewards only activate after your advocate has referred a minimum number of people. No milestone? Rewards activate immediately.<\/p>\n      <\/div>\n      <div class=\"how-card\">\n        <div class=\"how-card-num\">03<\/div>\n        <h4>The reward trigger fires<\/h4>\n        <p>Once the gate is cleared, rewards trigger based on your chosen mode \u2014 at signup, first spend, every spend, cumulative spend, or first qualifying receipt.<\/p>\n      <\/div>\n      <div class=\"how-card\">\n        <div class=\"how-card-num\">04<\/div>\n        <h4>Your advocate earns points<\/h4>\n        <p>Fixed points per referral, or points calculated on how much the referee spends \u2014 with an optional cap per transaction.<\/p>\n      <\/div>\n    <\/div>\n\n    <h2 style=\"margin-bottom:1rem\">The five reward triggers.<\/h2>\n    <table class=\"trigger-table\">\n      <thead>\n        <tr><th>Trigger<\/th><th>When reward fires<\/th><th>Best for<\/th><\/tr>\n      <\/thead>\n      <tbody>\n        <tr><td>At signup<\/td><td>When the referred friend creates an account<\/td><td>Maximising sign-up volume<\/td><\/tr>\n        <tr><td>On first purchase<\/td><td>Once, when the referee makes their first transaction<\/td><td>Ensuring referrals convert to buyers<\/td><\/tr>\n        <tr><td>On every purchase<\/td><td>Every time the referee spends \u2014 indefinitely<\/td><td>Long-term advocate engagement<\/td><\/tr>\n        <tr><td>Cumulative spend hit<\/td><td>When the referee's total spending crosses a set threshold<\/td><td>Filtering for high-value customers<\/td><\/tr>\n        <tr><td>First qualifying receipt<\/td><td>On the first single transaction that meets a minimum spend<\/td><td>Filtering out low-value visits<\/td><\/tr>\n      <\/tbody>\n    <\/table>\n\n    <div class=\"faq-wrap\">\n      <div class=\"faq-row\"><div class=\"faq-q\">Do I need a milestone?<\/div><div class=\"faq-a\">No. Leave it off and rewards activate as soon as your advocate makes a qualifying referral. Milestones are useful if you want to incentivise volume \u2014 e.g. only reward advocates who've referred at least 3 people.<\/div><\/div>\n      <div class=\"faq-row\"><div class=\"faq-q\">Can I run without a loyalty program?<\/div><div class=\"faq-a\">Yes. Referral runs independently. Your report will include a recommended starter setup.<\/div><\/div>\n      <div class=\"faq-row\"><div class=\"faq-q\">Do milestone counts reset?<\/div><div class=\"faq-a\">No. Milestone counts are cumulative and permanent. Invited users stay on record even if inactive. Each band fires once when the advocate's total referral count crosses its lower threshold.<\/div><\/div>\n      <div class=\"faq-row\"><div class=\"faq-q\">Fixed points or per RM?<\/div><div class=\"faq-a\">Both are supported. Fixed gives a flat reward per referral regardless of spend. Per RM scales the reward with how much the referee spends, with an optional cap per transaction.<\/div><\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- CTA SECTION -->\n<section style=\"background:var(--c-bg);border-top:1px solid var(--c-border);padding:52px 5%;text-align:center;width:100%\">\n  <div style=\"max-width:900px;margin:0 auto\">\n    <h2 style=\"font-family:'Montserrat',sans-serif;font-size:clamp(22px,3.5vw,32px);font-weight:800;color:var(--c-dark);letter-spacing:-.02em;line-height:1.2;margin-bottom:12px\">Ready to see it work for your brand?<\/h2>\n    <p style=\"font-size:14px;color:var(--c-mid);max-width:480px;margin:0 auto 28px;line-height:1.7\">We'll walk you through a tailored loyalty strategy for your business.<\/p>\n    <a href=\"#form-section\" onclick=\"document.getElementById('form-section').scrollIntoView({behavior:'smooth'});return false;\" style=\"display:inline-flex;align-items:center;gap:8px;background:var(--c-btn);color:#fff;font-family:'Montserrat',sans-serif;font-size:15px;font-weight:800;padding:14px 28px;border-radius:999px;text-decoration:none;transition:background .15s\">\n      Talk to our team\n      <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg>\n    <\/a>\n  <\/div>\n<\/section>\n\n<\/div><!-- #eber-calc -->\n\n<script>\n(function(){\n  \/\/ \u2500\u2500 PROXY \u2500\u2500\n  var PROXY_URL = (window.location.origin||'https:\/\/eber.co')+'\/wp-admin\/admin-ajax.php';\n\n  \/\/ \u2500\u2500 STATE \u2500\u2500\n  var IND='fnb', CURKEY='MYR', SYM='RM', MULT=1;\n  var TRIGGER='first';   \/\/ signup | first | every | accum | receipt\n  var PERIOD=12;\n  var MILESTONE=false;\n  var RTYPE='fixed';     \/\/ fixed | per\n  var REDEMPTION=0.40;\n  var calcResult={}, vResult={};\n\n  var CUR={\n    MYR:{sym:'RM', mult:1,     spMin:10,  spMax:600,   spStep:5,  mnMax:500,   mnStep:5},\n    SGD:{sym:'S$', mult:3.5,   spMin:10,  spMax:800,   spStep:5,  mnMax:1000,  mnStep:5},\n    HKD:{sym:'HK$',mult:0.60,  spMin:20,  spMax:3000,  spStep:20, mnMax:3000,  mnStep:20},\n    IDR:{sym:'Rp', mult:0.029, spMin:5000,spMax:500000,spStep:5000,mnMax:500000,mnStep:5000},\n    PHP:{sym:'P',  mult:0.083, spMin:50,  spMax:5000,  spStep:50, mnMax:5000,  mnStep:50},\n    THB:{sym:'B',  mult:0.13,  spMin:50,  spMax:5000,  spStep:50, mnMax:5000,  mnStep:50}\n  };\n\n  var PRE={\n    fnb:   {mem:500,vis:3,refs:2,sp:60, ret:.65,advPct:.09,refsSlider:9,spH:'Per person, per visit',   fixedPts:100,perPts:5,ptval:1.0,minSp:25},\n    retail:{mem:400,vis:2,refs:2,sp:120,ret:.60,advPct:.08,refsSlider:8,spH:'Per transaction',          fixedPts:200,perPts:3,ptval:1.0,minSp:50},\n    beauty:{mem:300,vis:2,refs:2,sp:150,ret:.70,advPct:.10,refsSlider:10,spH:'Per appointment',          fixedPts:250,perPts:4,ptval:1.5,minSp:60},\n    hotel: {mem:200,vis:1,refs:1,sp:350,ret:.55,advPct:.07,refsSlider:7,spH:'Per stay or F&B visit',   fixedPts:500,perPts:3,ptval:2.0,minSp:100},\n    other: {mem:300,vis:2,refs:2,sp:80, ret:.60,advPct:.08,refsSlider:8,spH:'Per visit',                fixedPts:150,perPts:4,ptval:1.0,minSp:30}\n  };\n\n  var TRIGGER_LABELS={\n    signup:'At signup',first:'On first purchase',every:'On every purchase',\n    accum:'Cumulative spend hit',receipt:'First qualifying receipt'\n  };\n\n  var IND_LABELS={fnb:'Cafe \/ Restaurant',retail:'Retail',beauty:'Beauty \/ Wellness',hotel:'Hotel \/ Hospitality',other:'Other'};\n\n  function fmt(n){\n    n=Math.round(n);\n    if(CURKEY==='IDR'){\n      if(n>=1000000000)return SYM+' '+(n\/1000000000).toFixed(1)+'B';\n      if(n>=1000000)   return SYM+' '+(n\/1000000).toFixed(1)+'M';\n      if(n>=1000)      return SYM+' '+(n\/1000).toFixed(0)+'K';\n      return SYM+' '+n.toLocaleString();\n    }\n    if(n>=1000000)return SYM+' '+(n\/1000000).toFixed(1)+'M';\n    if(n>=1000)   return SYM+' '+(n\/1000).toFixed(0)+'K';\n    return SYM+' '+n.toLocaleString();\n  }\n  function fmtSp(n){return SYM+' '+Math.round(n).toLocaleString();}\n  function snap(v,s){return Math.round(v\/s)*s;}\n\n  \/\/ \u2500\u2500 CURRENCY \u2500\u2500\n  window.setCurSelect=function(sel){\n    CURKEY=sel.value;\n    var c=CUR[CURKEY]; SYM=c.sym; MULT=c.mult;\n    var p=PRE[IND];\n    var ss=document.getElementById('s-spend');\n    ss.min=c.spMin;ss.max=c.spMax;ss.step=c.spStep;\n    ss.value=snap(p.sp*MULT,c.spStep);\n    document.getElementById('sp-min').textContent=SYM+' '+c.spMin.toLocaleString();\n    document.getElementById('sp-max').textContent=SYM+' '+c.spMax.toLocaleString();\n    document.getElementById('r-minsp').value=snap(p.minSp*MULT,c.mnStep);\n    document.querySelectorAll('.sym-lbl').forEach(function(e){e.textContent=SYM;});\n    recalc();\n  };\n\n  \/\/ \u2500\u2500 INDUSTRY \u2500\u2500\n  window.setIndSelect=function(sel){\n    IND=sel.value;\n    var p=PRE[IND]; var c=CUR[CURKEY];\n    document.getElementById('s-mem').value=p.mem;\n    document.getElementById('s-vis').value=p.vis;\n    document.getElementById('s-refs').value=p.refsSlider||10;\n    document.getElementById('s-spend').value=snap(p.sp*MULT,c.spStep);\n    document.getElementById('h-spend').textContent=p.spH;\n    document.getElementById('r-minsp').value=snap(p.minSp*MULT,c.mnStep);\n    document.getElementById('r-fixed-pts').value=p.fixedPts;\n    document.getElementById('r-per-pts').value=p.perPts;\n    document.getElementById('r-ptval').value=p.ptval.toFixed(2);\n    var fi=document.getElementById('f-industry');\n    if(fi){var lbl=IND_LABELS[IND];for(var i=0;i<fi.options.length;i++){if(fi.options[i].value===lbl){fi.selectedIndex=i;break;}}}\n    recalc();\n  };\n\n  \/\/ \u2500\u2500 TRIGGER \u2500\u2500\n  window.setTrigger=function(t,el){\n    TRIGGER=t;\n    document.querySelectorAll('.trigger-btn').forEach(function(b){b.classList.remove('active');});\n    el.classList.add('active');\n    \/\/ min spend only relevant for spend-based triggers\n    var showMin=['first','every','accum','receipt'].indexOf(t)>=0;\n    document.getElementById('rg-minspend').style.display=showMin?'':'none';\n    recalc();\n  };\n\n  \/\/ \u2500\u2500 MILESTONE BANDS \u2500\u2500\n  \/\/ Each band: {from, to, pts} \u2014 from\/to are referral counts, pts is points awarded\n  var MS_BANDS=[{fMin:1,to:3,pts:100},{fMin:4,to:7,pts:200}];\n  var MS_BAND_ID=0;\n\n  function renderBands(){\n    var list=document.getElementById('ms-bands-list');\n    if(!list)return;\n    list.innerHTML='';\n    MS_BANDS.forEach(function(b,i){\n      var row=document.createElement('div');\n      row.style.cssText='display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem;flex-wrap:wrap';\n      var ii=i;\n      function mk(tag,attrs,text){\n        var el=document.createElement(tag);\n        Object.keys(attrs).forEach(function(k){if(k==='style')el.style.cssText=attrs[k];else el[k]=attrs[k];});\n        if(text!==undefined)el.textContent=text;\n        return el;\n      }\n      var fIn=mk('input',{type:'number',className:'mi-input',value:b.fMin,min:1,max:999,style:'width:60px'});\n      fIn.addEventListener('input',function(){updateBand(ii,'fMin',this.value);});\n      var tIn=mk('input',{type:'number',className:'mi-input',value:b.to,min:1,max:999,style:'width:60px'});\n      tIn.addEventListener('input',function(){updateBand(ii,'to',this.value);});\n      var pIn=mk('input',{type:'number',className:'mi-input',value:b.pts,min:1,max:50000,style:'width:80px'});\n      pIn.addEventListener('input',function(){updateBand(ii,'pts',this.value);});\n      row.appendChild(mk('span',{style:'font-size:.75rem;font-weight:600;color:#0294A5;white-space:nowrap'},'Refs'));\n      row.appendChild(fIn);\n      row.appendChild(mk('span',{style:'font-size:.6875rem;color:#9CA3AF'},'to'));\n      row.appendChild(tIn);\n      row.appendChild(mk('span',{style:'font-size:.75rem;font-weight:600;color:#0294A5;white-space:nowrap'},'= pts'));\n      row.appendChild(pIn);\n      row.appendChild(mk('span',{style:'font-size:.6875rem;color:#9CA3AF'},'pts flat'));\n      if(MS_BANDS.length>1){\n        var del=mk('button',{style:'background:none;border:none;color:#9CA3AF;cursor:pointer;font-size:1.1rem;padding:0 .25rem;line-height:1'},'\u00d7');\n        del.addEventListener('click',function(){removeBand(ii);});\n        row.appendChild(del);\n      }\n      list.appendChild(row);\n    });\n  }\n\n  window.updateBand=function(i,field,val){\n    if(MS_BANDS[i])MS_BANDS[i][field]=+val||0;\n    recalc();\n  };\n  window.removeBand=function(i){\n    MS_BANDS.splice(i,1);\n    renderBands();\n    recalc();\n  };\n  window.addMsBand=function(){\n    var last=MS_BANDS[MS_BANDS.length-1];\n    var newFrom=last?last.to+1:1;\n    MS_BANDS.push({fMin:newFrom,to:newFrom+3,pts:last?last.pts*2:100});\n    renderBands();\n    recalc();\n  };\n\n  window.setMilestone=function(on){\n    MILESTONE=on;\n    document.getElementById('ms-no').classList.toggle('active',!on);\n    document.getElementById('ms-yes').classList.toggle('active',on);\n    document.getElementById('milestone-input-row').classList.toggle('show',on);\n    document.getElementById('r-milestone-badge').style.display=on?'':'none';\n    var desc=document.getElementById('milestone-desc');\n    if(desc)desc.classList.toggle('show',on);\n    if(on)renderBands();\n    recalc();\n  };\n\n  \/\/ \u2500\u2500 REWARD TYPE \u2500\u2500\n  window.setRType=function(t,el){\n    RTYPE=t;\n    document.querySelectorAll('.rtbtn').forEach(function(b){b.classList.remove('active');});\n    el.classList.add('active');\n    document.getElementById('rg-fixed').style.display=t==='fixed'?'':'none';\n    document.getElementById('rg-per').style.display=t==='per'?'':'none';\n    recalc();\n  };\n\n  \/\/ \u2500\u2500 GET VALUES \u2500\u2500\n  function getV(){\n    var p=PRE[IND]; var c=CUR[CURKEY];\n    \/\/ Read from editable inputs \u2014 they may exceed slider range\n    var spLoc=+document.getElementById('v-spend').value || +document.getElementById('s-spend').value;\n    var spMYR=spLoc\/MULT;\n    var fixedPts=+document.getElementById('r-fixed-pts').value||100;\n    var perPts=+document.getElementById('r-per-pts').value||5;\n    var ptval=+document.getElementById('r-ptval').value||1;\n    var minSpLoc=+document.getElementById('r-minsp').value||0;\n    var minSpMYR=minSpLoc\/MULT;\n    \/\/ milestone bands read from MS_BANDS global\n    return{\n      mem:+document.getElementById('v-mem').value || +document.getElementById('s-mem').value,\n      vis:+document.getElementById('v-vis').value || +document.getElementById('s-vis').value,\n      refs:2, \/\/ fixed: avg referrals per active advocate per month\n      advPctSlider:+document.getElementById('s-refs').value, \/\/ % of regulars who refer\n      spMYR:spMYR, spLoc:spLoc,\n      ret:p.ret, advPct:p.advPct,\n      fixedPts:fixedPts, perPts:perPts, ptval:ptval,\n      minSpMYR:minSpMYR, minSpLoc:minSpLoc,\n      msBands:MS_BANDS\n    };\n  }\n\n  \/\/ \u2500\u2500 COMPUTE \u2500\u2500\n  \/\/ Reward rate per referee event (in MYR reward value, using 40% redemption)\n  function rewardPerEvent(v, spendMYR){\n    var pts = RTYPE==='fixed'\n      ? v.fixedPts\n      : v.perPts * spendMYR;\n    return (pts\/100) * v.ptval * REDEMPTION;\n  }\n\n  function compute(v){\n    var advPctRaw=+document.getElementById('v-refs').value || +document.getElementById('s-refs').value;\n    var adv=Math.round(v.mem*(advPctRaw\/100));\n    var warn='';\n\n    \/\/ Milestone bands: each advocate accumulates total referral count over time.\n    \/\/ We track cumulative refs per advocate and check which band they are in.\n    \/\/ Band reward replaces (or adds to) the normal reward for that month.\n    \/\/ If MILESTONE is off, bands are ignored.\n    var cumRefsPerAdv=0; \/\/ tracks cumulative referrals per advocate across months\n\n    var tRev=0, tCost=0, ar=0, totalNewCust=0;\n\n    for(var i=0;i<PERIOD;i++){\n      var newThisMonth=adv*v.refs;\n      ar=ar*v.ret+newThisMonth;\n      totalNewCust+=newThisMonth;\n      cumRefsPerAdv+=v.refs; \/\/ each advocate accumulates this many more referrals\n\n      \/\/ Determine if any milestone band fires this month for advocates\n      \/\/ Band fires when cumRefsPerAdv crosses a band's FROM threshold for the first time\n      var msBandCost=0;\n      if(MILESTONE && v.msBands && v.msBands.length){\n        v.msBands.forEach(function(b){\n          var prevCum=cumRefsPerAdv-v.refs;\n          \/\/ Did we cross this band's FROM threshold this month?\n          if(b.fMin>0 && prevCum<b.fMin && cumRefsPerAdv>=b.fMin){\n            \/\/ How many advocates hit this threshold this month (simplify: fraction of adv)\n            var hitters=adv; \/\/ all advocates reach the same threshold at the same time (simplified)\n            msBandCost+=hitters*(b.pts\/100)*v.ptval*REDEMPTION;\n          }\n        });\n      }\n\n      \/\/ If milestone is ON and advocate hasn't hit the first band yet, no trigger rewards\n      var firstBandFrom = (MILESTONE && v.msBands && v.msBands.length) ? Math.min.apply(null,v.msBands.map(function(b){return b.fMin;})) : 0;\n      if(MILESTONE && cumRefsPerAdv < firstBandFrom){ continue; }\n\n      var monthRev=0, monthCost=0;\n\n      if(TRIGGER==='signup'){\n        \/\/ Reward at signup \u2014 flat per new referee this month\n        monthRev=0; \/\/ no spend-based revenue to attribute\n        monthCost=newThisMonth*rewardPerEvent(v,0)*100; \/\/ fixed pts only meaningful here\n        if(RTYPE==='per') warn='Per RM reward type is not meaningful for signup trigger. Showing fixed point cost only.';\n      } else if(TRIGGER==='first'){\n        \/\/ Reward on first spend only \u2014 new referees this month make their first visit\n        var q=v.spMYR>=v.minSpMYR?1:0;\n        monthRev=newThisMonth*v.vis*v.spMYR*q;\n        monthCost=newThisMonth*rewardPerEvent(v,v.spMYR)*q;\n      } else if(TRIGGER==='every'){\n        \/\/ Reward on every spend \u2014 all active referees\n        var q=v.spMYR>=v.minSpMYR?1:0;\n        monthRev=ar*v.vis*v.spMYR*q;\n        monthCost=ar*v.vis*rewardPerEvent(v,v.spMYR)*q;\n      } else if(TRIGGER==='accum'){\n        \/\/ Reward when cumulative spend hits threshold \u2014 approximated as:\n        \/\/ referee hits threshold after ceil(minSp\/spMYR) visits\n        var visToHit=v.minSpMYR>0?Math.ceil(v.minSpMYR\/v.spMYR):1;\n        var qualifyMonths=Math.ceil(visToHit\/Math.max(v.vis,1));\n        var eligibleAr=i>=qualifyMonths?ar:ar*(i\/Math.max(qualifyMonths,1));\n        monthRev=eligibleAr*v.vis*v.spMYR;\n        monthCost=eligibleAr*rewardPerEvent(v,v.minSpMYR); \/\/ reward based on threshold amount\n        if(v.minSpMYR===0) warn='Set a minimum cumulative spend for the accumulative trigger to be meaningful.';\n      } else if(TRIGGER==='receipt'){\n        \/\/ Reward on first qualifying single receipt \u2014 new referees only, if their spend >= min\n        var q=v.spMYR>=v.minSpMYR?1:0;\n        if(!q) warn='Avg spend ('+fmtSp(v.spLoc)+') is below the minimum qualifying spend ('+fmtSp(v.minSpLoc)+'). No rewards will trigger.';\n        monthRev=newThisMonth*v.vis*v.spMYR*q;\n        monthCost=newThisMonth*rewardPerEvent(v,v.spMYR)*q;\n      }\n\n      tRev+=monthRev;\n      tCost+=monthCost+msBandCost;\n    }\n\n    var tRevL=tRev*MULT, tCostL=tCost*MULT;\n    return{\n      tRevL:tRevL, tCostL:tCostL, nRevL:tRevL-tCostL,\n      roi:tCostL>0?tRevL\/tCostL:0,\n      am12:Math.round(ar), adv:adv,\n      totalNewCust:Math.round(totalNewCust),\n      warn:warn\n    };\n  }\n\n  \/\/ \u2500\u2500 INSIGHT \u2500\u2500\n  function insight(r,v){\n    if(r.warn) return r.warn;\n    if(TRIGGER==='signup') return 'Every new signup costs '+fmt(r.tCostL\/Math.max(r.totalNewCust,1))+' in rewards. '+r.adv+' advocates are active.';\n    if(r.tRevL===0) return 'No revenue to project yet \u2014 check your minimum spend setting.';\n    var costPct=r.tRevL>0?Math.round(r.tCostL\/r.tRevL*100):0;\n    if(r.roi>=15) return 'For every '+SYM+' 1 you reward, you get '+SYM+' '+r.roi.toFixed(0)+' back. Reward cost is only '+costPct+'% of revenue generated.';\n    if(r.roi>=8)  return 'For every '+SYM+' 1 you reward, you get '+SYM+' '+r.roi.toFixed(1)+' back. Reward cost is '+costPct+'% of revenue.';\n    if(r.roi>=4)  return 'For every '+SYM+' 1 you reward, you get '+SYM+' '+r.roi.toFixed(1)+' back. Tighten by raising the min spend or reducing your point rate.';\n    if(r.roi>=2)  return 'For every '+SYM+' 1 you reward, you get '+SYM+' '+r.roi.toFixed(1)+' back.';\n    return 'Returns are below 2x. Try lowering the point value or raising the minimum spend.';\n  }\n\n  \/\/ \u2500\u2500 RECALC \u2500\u2500\n  function recalc(){\n    var v=getV();\n    var r=compute(v);\n    calcResult=r; vResult=v;\n\n    \/\/ Badges\n    \/\/ Sync slider \u2192 input fields (only update if user isn't focused on the input)\n    \/\/ input boxes updated directly by slider listeners below\n    document.getElementById('r-trigger-badge').textContent=TRIGGER_LABELS[TRIGGER];\n    if(MILESTONE && v.msBands && v.msBands.length){\n      var bandStr=v.msBands.map(function(b){return b.fMin+'-'+b.to;}).join(', ');\n      document.getElementById('r-milestone-badge').textContent='Milestone bands: '+bandStr;\n    }\n\n    \/\/ Warning\n    var wEl=document.getElementById('r-warn');\n    if(r.warn){wEl.textContent=r.warn;wEl.style.display='block';}\n    else{wEl.style.display='none';}\n\n    \/\/ Big metric\n    if(TRIGGER==='signup'){\n      document.getElementById('r-big-label').textContent='Estimated reward cost (signups)';\n      document.getElementById('r-big-val').textContent=fmt(r.tCostL);\n      document.getElementById('r-big-sub').textContent='12-month total payout for signup rewards';\n      document.getElementById('r1-lbl').textContent='New sign-ups';\n      document.getElementById('r4-lbl').textContent='Total referrals';\n      document.getElementById('r1-val').textContent=r.totalNewCust.toLocaleString();\n      document.getElementById('r2-val').textContent=r.adv+' people';\n      document.getElementById('r3-val').textContent=fmt(r.tCostL);\n      document.getElementById('r4-val').textContent=(r.totalNewCust).toLocaleString();\n    } else {\n      document.getElementById('r-big-label').textContent='Revenue from referrals';\n      document.getElementById('r-big-val').textContent=fmt(r.tRevL);\n      document.getElementById('r-big-sub').textContent='12-month total';\n      document.getElementById('r1-lbl').textContent='New customers by month 12';\n      document.getElementById('r4-lbl').textContent='Net revenue after rewards';\n      document.getElementById('r1-val').textContent=r.am12.toLocaleString()+' people';\n      \n      document.getElementById('r2-val').textContent=r.adv+' people';\n      document.getElementById('r3-val').textContent=fmt(r.tCostL);\n      document.getElementById('r4-val').textContent=fmt(r.nRevL);\n    }\n\n    document.getElementById('r-insight').textContent=insight(r,v);\n  }\n\n  \/\/ \u2500\u2500 STEP ANIMATION \u2500\u2500\n  function setGStep(n){\n    for(var i=1;i<=4;i++){\n      var el=document.getElementById('gs'+i);if(!el)continue;\n      el.classList.remove('active','done');\n      if(i<n)el.classList.add('done');\n      if(i===n)el.classList.add('active');\n    }\n  }\n\n  \/\/ \u2500\u2500 SUBMIT \u2500\u2500\n  window.submitForm=async function(){\n    var fname=document.getElementById('f-fname').value.trim();\n    var email=document.getElementById('f-email').value.trim();\n    var biz=document.getElementById('f-biz').value.trim();\n    var ind=document.getElementById('f-industry').value;\n    var errEl=document.getElementById('err-msg');\n    errEl.style.display='none';\n    if(!fname||!email||!biz){errEl.textContent='Please fill in your name, email, and business name.';errEl.style.display='block';return;}\n    if(!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(email)){errEl.textContent='Please enter a valid email address.';errEl.style.display='block';return;}\n    document.getElementById('form-fields').style.display='none';\n    document.getElementById('gen-wrap').style.display='block';\n    var pct=0;\n    var ticker=setInterval(function(){pct=Math.min(pct+(pct<60?4:pct<85?1.5:.4),90);document.getElementById('pfill').style.width=pct+'%';},300);\n    setTimeout(function(){setGStep(2);},1500);\n    setTimeout(function(){setGStep(3);},3500);\n    setTimeout(function(){setGStep(4);},6000);\n    try{\n      var r=calcResult; var v=vResult;\n      var params={\n        net_gain:     fmt(r.nRevL||0),\n        industry:     ind,\n        customers:    Math.round(v.mem||500).toLocaleString(),\n        txn:          fmtSp(v.spLoc||60),\n        visits:       String(v.vis||2),\n        members:      Math.round(r.adv||0).toLocaleString(),\n        incr_revenue: fmt(r.tRevL||0),\n        ret_value:    fmt((r.tRevL||0)*0.15),\n        total_uplift: fmt((r.tRevL||0)*1.15),\n        eber_cost:    'Included in plan',\n        roi_pct:      (r.roi||0).toFixed(1)+'x',\n        payback:      'Under 3 months',\n        ret_lift:     Math.round((v.ret||0.65)*100)+'%',\n        first_name:   fname,\n        business_name:biz,\n        currency:     SYM,\n        trigger_mode: TRIGGER_LABELS[TRIGGER],\n        period:       '12 months',\n        milestone_gate: MILESTONE?('On'):'Off',\n        milestone_bands: MILESTONE&&v.msBands&&v.msBands.length?v.msBands.map(function(b){return b.fMin+'-'+b.to+' refs = '+Math.round((b.pts\/100)*(+document.getElementById('r-ptval').value)*100)\/100+' '+SYM;}).join(', '):'\u2014',\n        reward_type:  RTYPE==='fixed'?'Fixed points':'Per '+SYM+' spent',\n        lt_rev:       fmt(r.tRevL||0),\n        lt_cost:      fmt(r.tCostL||0),\n        lt_net:       fmt(r.nRevL||0),\n        lt_roi:       (r.roi||0).toFixed(1)+'x',\n        lt_new:       (r.am12||0).toLocaleString(),\n        ms_new:       (r.totalNewCust||0).toLocaleString(),\n        ms_cost:      fmt(r.tCostL||0),\n        ms_t1:        '\u2014', ms_t2:'\u2014', ms_t3:'\u2014'\n      };\n      var resp=await fetch(PROXY_URL+'?action=eber_send_report',{method:'POST',headers:{'Content-Type':'application\/json'},body:JSON.stringify({to_email:email,to_name:fname,params:params})});\n      var rd=await resp.json().catch(function(){return{error:'Server error. Check functions.php.'};});\n      if(!resp.ok||rd.error){var msg=rd.error||'Failed (HTTP '+resp.status+')';if(rd.brevo_code)msg+=' ['+rd.brevo_code+']';if(rd.raw)msg+=' \u2014 '+rd.raw;throw new Error(msg);}\n      clearInterval(ticker);\n      document.getElementById('pfill').style.width='100%';\n      setTimeout(function(){document.getElementById('gen-wrap').style.display='none';document.getElementById('success-wrap').style.display='block';document.getElementById('sent-email').textContent=email;},500);\n    }catch(err){\n      clearInterval(ticker);\n      document.getElementById('gen-wrap').style.display='none';\n      document.getElementById('form-fields').style.display='block';\n      errEl.textContent='Could not send your report: '+(err.message||'Please try again.');\n      errEl.style.display='block';\n    }\n  };\n\n  \/\/ \u2500\u2500 BIDIRECTIONAL SLIDER \u2194 INPUT SYNC \u2500\u2500\n  window.syncFromInput=function(inputId, sliderId){\n    var inp=document.getElementById(inputId);\n    var sld=document.getElementById(sliderId);\n    if(!inp||!sld)return;\n    var val=parseFloat(inp.value);\n    if(isNaN(val)||val<=0)return;\n    \/\/ Move slider thumb \u2014 if value exceeds max, pin slider at max visually\n    sld.value=Math.min(val, +sld.max);\n    \/\/ If value exceeds slider max, update the end label to show typed value\n    var endLabel=sld.parentElement.querySelector('.sq-end-max');\n    if(endLabel){\n      if(val>+sld.max){\n        \/\/ Show typed value at the end of slider\n        if(inputId==='v-spend') endLabel.textContent=SYM+' '+Math.round(val).toLocaleString();\n        else if(inputId==='v-refs') endLabel.textContent=Math.round(val)+'%';\n        else if(inputId==='v-vis') endLabel.textContent=Math.round(val)+'x';\n        else endLabel.textContent=Math.round(val).toLocaleString();\n      } else {\n        \/\/ Restore default label\n        endLabel.textContent=endLabel.dataset.default;\n      }\n    }\n    recalc();\n  };\n\n\n\n  \/\/ \u2500\u2500 GUIDED STEP SYSTEM \u2500\u2500\n  var CURRENT_STEP = 1;\n  var STEPS = ['setup-card','trigger-card','numbers-card'];\n  var SCROLL_OFFSET = 80; \/\/ px below viewport top\n\n  function scrollIntoStep(id){\n    var el = document.getElementById(id);\n    if(!el) return;\n    \/\/ Use a small timeout so any DOM changes settle first\n    setTimeout(function(){\n      var rect = el.getBoundingClientRect();\n      var top = rect.top + window.pageYOffset - SCROLL_OFFSET;\n      window.scrollTo({top: top, behavior: 'smooth'});\n    }, 60);\n  }\n\n  window.activateStep=function activateStep(n){\n    CURRENT_STEP = n;\n    STEPS.forEach(function(id, i){\n      var el = document.getElementById(id);\n      if(!el) return;\n      el.classList.remove('step-active','step-inactive','step-completed');\n      if(i+1 === n){\n        el.classList.add('step-active');\n      } else if(i+1 < n){\n        el.classList.add('step-completed');\n      } else {\n        el.classList.add('step-inactive');\n      }\n    });\n    var rp = document.getElementById('result-panel');\n    if(rp){\n      rp.classList.remove('step-active','step-inactive');\n      if(n < 4) rp.classList.add('step-inactive');\n      else rp.classList.add('step-active');\n    }\n    if(n <= 3) scrollIntoStep(STEPS[n-1]);\n    else scrollIntoStep('result-panel');\n  };\n\n  function advanceToStep(n){\n    if(n > CURRENT_STEP) activateStep(n);\n  }\n\n  \/\/ \u2500\u2500 Wire step transitions \u2500\u2500\n  \/\/ Navigation is via Next buttons (activateStep called directly from onclick)\n  \/\/ Clicking a completed\/inactive card also re-focuses it\n  STEPS.forEach(function(id, i){\n    var el = document.getElementById(id);\n    if(!el) return;\n    el.addEventListener('click', function(e){\n      \/\/ Only re-activate if clicking the card itself (not a button inside it)\n      if(e.target.closest('.step-next-btn')) return;\n      if(el.classList.contains('step-inactive') || el.classList.contains('step-completed')){\n        activateStep(i+1);\n      }\n    });\n  });\n\n  \/\/ Init \u2014 steps all visible but dimmed, waiting for user to start\n  \/\/ Don't activateStep(1) on load \u2014 wait for the hero button\n  STEPS.forEach(function(id){\n    var el=document.getElementById(id);\n    if(el)el.classList.add('step-inactive');\n  });\n  var rp=document.getElementById('result-panel');\n  if(rp)rp.classList.add('step-inactive');\n\n  window.startCalculator=function(){\n    activateStep(1);\n  };\n\n  \/\/ \u2500\u2500 BIDIRECTIONAL SLIDER \u2194 INPUT WIRING \u2500\u2500\n  \/\/ Slider moves \u2192 update number input box\n  \/\/ Number input typed \u2192 update slider position + recalc\n  (function(){\n    var pairs=[\n      {sId:'s-mem',  vId:'v-mem'},\n      {sId:'s-spend',vId:'v-spend'},\n      {sId:'s-vis',  vId:'v-vis'},\n      {sId:'s-refs', vId:'v-refs'}\n    ];\n    pairs.forEach(function(p){\n      var sld=document.getElementById(p.sId);\n      var inp=document.getElementById(p.vId);\n      if(!sld||!inp)return;\n\n      \/\/ Slider \u2192 input\n      sld.addEventListener('input',function(){\n        inp.value=sld.value;\n\n        \/\/ Restore end label\n        var endLbl=sld.parentElement.querySelector('.sq-end-max');\n        if(endLbl&&endLbl.dataset.default)endLbl.textContent=endLbl.dataset.default;\n        recalc();\n      });\n\n      \/\/ Input \u2192 slider\n      inp.addEventListener('input',function(){\n        var val=parseFloat(inp.value);\n        if(isNaN(val)||val<=0)return;\n        \/\/ Move slider thumb as far as it goes visually\n        sld.value=Math.min(val,+sld.max);\n        \/\/ Update end label if value exceeds slider max\n        var endLbl=sld.parentElement.querySelector('.sq-end-max');\n        if(endLbl){\n          if(val>+sld.max) endLbl.textContent=Math.round(val).toLocaleString();\n          else if(endLbl.dataset.default) endLbl.textContent=endLbl.dataset.default;\n        }\n\n        recalc();\n      });\n    });\n  })();\n\n  recalc();\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Referral Revenue Estimator Your regulars are yourbest sales channel. See what your referral program could earn in 12 months. Calculate mine 500+ brands on Eber Avg 34% retention lift Launch in a week 1Tell us about your business.Auto-filled for your industry. Currency RM \u2014 Malaysian RinggitS$ \u2014 Singapore DollarHK$ \u2014 Hong Kong DollarRp \u2014 Indonesian [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"parent":11215,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-11210","page","type-page","status-publish","hentry"],"blocksy_meta":[],"featured_image_src":null,"featured_image_src_square":null,"_links":{"self":[{"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/pages\/11210","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/comments?post=11210"}],"version-history":[{"count":0,"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/pages\/11210\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/pages\/11215"}],"wp:attachment":[{"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/media?parent=11210"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}