{"id":11204,"date":"2026-06-22T10:49:44","date_gmt":"2026-06-22T02:49:44","guid":{"rendered":"https:\/\/eber.co\/?page_id=11204"},"modified":"2026-06-22T17:37:13","modified_gmt":"2026-06-22T09:37:13","slug":"loyalty-roi-calculator","status":"publish","type":"page","link":"https:\/\/eber.co\/tools\/loyalty-roi-calculator\/","title":{"rendered":"Loyalty ROI Calculator"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"11204\" class=\"elementor elementor-11204\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ed9b612 e-con-full e-flex e-con e-parent\" data-id=\"ed9b612\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-451f661 elementor-widget elementor-widget-html\" data-id=\"451f661\" 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<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\" \/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n<title>Hero Section \u2014 Eber ROI Calculator<\/title>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Montserrat:ital,wght@0,400;0,500;0,600;0,700;0,800;1,700&display=swap\" rel=\"stylesheet\" \/>\n<style>\n  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n  body {\n    font-family: 'Montserrat', sans-serif;\n    background: #ffffff;\n    -webkit-font-smoothing: antialiased;\n  }\n\n  \/* \u2500\u2500 HERO \u2500\u2500 *\/\n  .hero {\n    background: #ffffff;\n    background-image:\n      linear-gradient(rgba(0,196,179,0.07) 1px, transparent 1px),\n      linear-gradient(90deg, rgba(0,196,179,0.07) 1px, transparent 1px);\n    background-size: 60px 60px;\n    padding: 5rem 2rem 4rem;\n    text-align: center;\n    position: relative;\n    overflow: hidden;\n  }\n  .hero::before {\n    content: '';\n    position: absolute;\n    inset: 0;\n    background: radial-gradient(ellipse 70% 60% at 50% 0%, rgba(0,196,179,0.12), transparent 70%);\n    pointer-events: none;\n  }\n\n  .hero-badge {\n    display: inline-flex;\n    align-items: center;\n    gap: 0.5rem;\n    background: #E9F8F7;\n    border: 1px solid rgba(0,196,179,0.3);\n    border-radius: 999px;\n    padding: 0.35rem 1rem;\n    font-size: 0.75rem;\n    font-weight: 700;\n    color: #0294A5;\n    letter-spacing: 0.06em;\n    text-transform: uppercase;\n    margin-bottom: 1.5rem;\n    position: relative;\n  }\n  .hero-badge .dot {\n    width: 7px;\n    height: 7px;\n    background: #00C4B3;\n    border-radius: 50%;\n    animation: blink 2s infinite;\n  }\n  @keyframes blink {\n    0%, 100% { opacity: 1; }\n    50%       { opacity: 0.3; }\n  }\n\n  .hero h1 {\n    font-size: clamp(2.25rem, 5vw, 3.75rem);\n    font-weight: 700;\n    letter-spacing: -0.03em;\n    line-height: 1.1;\n    color: #0294A5;\n    margin-bottom: 1.25rem;\n    position: relative;\n  }\n  .hero h1 em {\n    color: #00C4B3;\n    font-style: normal;\n  }\n\n  .hero p {\n    font-size: 1.0625rem;\n    color: #5A8A84;\n    max-width: 560px;\n    margin: 0 auto;\n    line-height: 1.75;\n    position: relative;\n  }\n\n  \/* \u2500\u2500 TRUST BAR \u2500\u2500 *\/\n  .trust-bar {\n    background: #E9F8F7;\n    border-top: 1px solid rgba(0,196,179,0.2);\n    border-bottom: 1px solid rgba(0,196,179,0.2);\n    padding: 1.25rem 2rem;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 2.5rem;\n    flex-wrap: wrap;\n  }\n\n  .trust-item {\n    display: flex;\n    align-items: center;\n    gap: 0.5rem;\n    font-size: 0.8125rem;\n    font-weight: 700;\n    color: #0294A5;\n  }\n\n  \/* \u2500\u2500 RESPONSIVE \u2500\u2500 *\/\n  @media (max-width: 768px) {\n    .hero { padding: 3.5rem 1.25rem 3rem; }\n    .trust-bar { gap: 1.25rem; }\n  }\n<\/style>\n<\/head>\n<body>\n\n<!-- HERO -->\n<section class=\"hero\">\n  <div class=\"hero-badge\">\n    <span class=\"dot\"><\/span>\n    ROI calculator\n  <\/div>\n  <h1>How much could loyalty<br>earn you in <em>12 months?<\/em><\/h1>\n  <p>Enter your numbers below. We'll show you a conservative estimate of your revenue uplift and retention value \u2014 based on real loyalty benchmarks, adjusted for reward costs.<\/p>\n<\/section>\n\n<!-- TRUST BAR -->\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\">\n      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\/>\n    <\/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\">\n      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13 7h8m0 0v8m0-8l-8 8-4-4-6 6\"\/>\n    <\/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\">\n      <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\"\/>\n      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\/>\n    <\/svg>\n    Launch in a week\n  <\/div>\n<\/div>\n\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-462a247 e-flex e-con-boxed e-con e-parent\" data-id=\"462a247\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-45294f7 elementor-widget elementor-widget-html\" data-id=\"45294f7\" 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 href=\"https:\/\/fonts.googleapis.com\/css2?family=Montserrat:wght@400;500;600;700;800&display=swap\" rel=\"stylesheet\" \/>\n\n<style>\n  .calc-wrapper { background:#FAFBFC; padding:3rem 2rem 5rem; font-family:'Montserrat',sans-serif; }\n  .calc-inner { max-width:1060px; margin:0 auto; display:grid; grid-template-columns:1fr 1fr; gap:2rem; align-items:start; }\n  .panel { background:#ffffff; border:1px solid rgba(0,196,179,0.15); border-radius:20px; padding:2rem; }\n  .panel-title { font-size:0.75rem; font-weight:700; text-transform:uppercase; letter-spacing:0.12em; color:#00C4B3; margin-bottom:1.5rem; }\n  .field { margin-bottom:1.375rem; }\n  .field-label { display:flex; justify-content:space-between; align-items:center; font-size:0.8125rem; font-weight:600; color:#0294A5; margin-bottom:0.5rem; }\n  .field-val { font-weight:700; color:#0294A5; background:#E9F8F7; border-radius:6px; padding:0.15rem 0.6rem; font-size:0.8125rem; }\n  .field-hint { font-size:0.7rem; color:#5A8A84; margin-top:0.3rem; }\n  input[type=\"range\"] { -webkit-appearance:none; appearance:none; width:100%; height:4px; background:#CCF5F1; border-radius:999px; outline:none; cursor:pointer; }\n  input[type=\"range\"]::-webkit-slider-thumb { -webkit-appearance:none; width:18px; height:18px; background:#00C4B3; border-radius:50%; border:3px solid #ffffff; box-shadow:0 0 0 2px #00C4B3; cursor:pointer; transition:transform 0.15s; }\n  input[type=\"range\"]::-webkit-slider-thumb:hover { transform:scale(1.15); }\n  input[type=\"range\"]::-moz-range-thumb { width:18px; height:18px; background:#00C4B3; border-radius:50%; border:3px solid #ffffff; cursor:pointer; }\n  select { width:100%; padding:0.6rem 0.9rem; border:1px solid rgba(0,196,179,0.3); border-radius:8px; font-family:'Montserrat',sans-serif; font-size:0.875rem; font-weight:600; color:#0294A5; background:#ffffff; cursor:pointer; outline:none; appearance:none; background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%2300C4B3' d='M1 1l5 5 5-5'\/%3E%3C\/svg%3E\"); background-repeat:no-repeat; background-position:right 0.9rem center; }\n  select:focus { border-color:#00C4B3; }\n  .assumption-toggle { display:flex; align-items:center; gap:0.5rem; font-size:0.8rem; font-weight:700; color:#0294A5; cursor:pointer; margin-bottom:1.25rem; background:none; border:none; font-family:'Montserrat',sans-serif; padding:0; }\n  .assumption-toggle svg { transition:transform 0.25s; }\n  .assumption-toggle.open svg { transform:rotate(180deg); }\n  .assumptions-section { display:none; }\n  .assumptions-section.visible { display:block; }\n  .results-panel { background:#E9F8F7; border:1px solid rgba(0,196,179,0.25); border-radius:20px; padding:2rem; position:sticky; top:80px; }\n  .results-title { font-size:0.75rem; font-weight:700; text-transform:uppercase; letter-spacing:0.12em; color:#00C4B3; margin-bottom:1.5rem; }\n  .roi-hero { background:#ffffff; border:1px solid rgba(0,196,179,0.3); border-radius:14px; padding:1.5rem; text-align:center; margin:1.5rem 0; }\n  .roi-hero-label { font-size:0.75rem; font-weight:700; text-transform:uppercase; letter-spacing:0.1em; color:#00C4B3; margin-bottom:0.5rem; }\n  .roi-hero-val { font-size:clamp(2.5rem,5vw,3.5rem); font-weight:800; color:#0294A5; letter-spacing:-0.02em; line-height:1; }\n  .roi-hero-sub { font-size:0.8125rem; color:#5A8A84; margin-top:0.5rem; }\n  .metric-row { display:flex; justify-content:space-between; align-items:baseline; padding:0.85rem 0; border-bottom:1px solid rgba(0,196,179,0.2); }\n  .metric-row:last-of-type { border-bottom:none; }\n  .metric-row-label { font-size:0.8125rem; color:#5A8A84; font-weight:500; max-width:55%; line-height:1.4; }\n  .metric-row-val { font-size:1.125rem; font-weight:800; color:#0294A5; text-align:right; }\n  .metric-row-val.highlight { color:#00C4B3; }\n  .email-gate { margin-top:1.5rem; border-top:1px solid rgba(0,196,179,0.25); padding-top:1.5rem; }\n  .email-gate p { font-size:0.8rem; color:#5A8A84; margin-bottom:0.75rem; line-height:1.5; }\n  .email-input-row { display:flex; gap:0.5rem; }\n  .email-input-row input[type=\"email\"] { flex:1; padding:0.75rem 1rem; border:1px solid rgba(0,196,179,0.35); border-radius:8px; background:#ffffff; color:#0294A5; font-family:'Montserrat',sans-serif; font-size:0.8125rem; outline:none; }\n  .email-input-row input[type=\"email\"]::placeholder { color:#aaa; }\n  .email-input-row input[type=\"email\"]:focus { border-color:#00C4B3; }\n  .btn-send { background:#00C4B3; color:#ffffff; font-family:'Montserrat',sans-serif; font-weight:700; font-size:0.8125rem; padding:0.75rem 1.25rem; border-radius:8px; border:none; cursor:pointer; white-space:nowrap; transition:opacity 0.2s, transform 0.15s; }\n  .btn-send:hover { opacity:0.9; transform:translateY(-1px); }\n  .email-success { display:none; background:rgba(0,196,179,0.12); border:1px solid rgba(0,196,179,0.3); border-radius:8px; padding:0.75rem 1rem; font-size:0.8rem; color:#00C4B3; font-weight:600; text-align:center; }\n  .calc-disclaimer { max-width:1060px; margin:0 auto; padding:1.5rem 2rem 0; font-size:0.7375rem; color:#5A8A84; line-height:1.6; text-align:center; }\n  @media(max-width:768px) {\n    .calc-inner { grid-template-columns:1fr; }\n    .results-panel { position:static; }\n    .calc-wrapper { padding:2rem 1.25rem 4rem; }\n    .email-input-row { flex-direction:column; }\n  }\n<\/style>\n\n<div class=\"calc-wrapper\">\n  <div class=\"calc-inner\">\n\n    <!-- LEFT: INPUTS -->\n    <div>\n      <div class=\"panel\">\n        <p class=\"panel-title\">Your business<\/p>\n\n        <div class=\"field\">\n          <label class=\"field-label\" for=\"industry\">Industry<\/label>\n          <select id=\"industry\">\n            <option value=\"fnb\">F&B \/ Restaurant<\/option>\n            <option value=\"retail\">Retail<\/option>\n            <option value=\"hospitality\">Hospitality \/ Hotel<\/option>\n            <option value=\"membership\">Membership club<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"field\">\n          <div class=\"field-label\">Monthly unique customers <span class=\"field-val\" id=\"val-customers\">500<\/span><\/div>\n          <input type=\"range\" id=\"customers\" min=\"50\" max=\"5000\" step=\"100\" value=\"500\" \/>\n          <p class=\"field-hint\">Unique customers who transact per month, per outlet<\/p>\n        <\/div>\n\n        <div class=\"field\">\n          <div class=\"field-label\">Avg transaction value <span class=\"field-val\" id=\"val-txn\">$ 45<\/span><\/div>\n          <input type=\"range\" id=\"txn\" min=\"10\" max=\"500\" step=\"5\" value=\"45\" \/>\n          <p class=\"field-hint\">Average spend per visit, in your local currency<\/p>\n        <\/div>\n\n        <div class=\"field\">\n          <div class=\"field-label\">Avg visits per customer \/ month <span class=\"field-val\" id=\"val-visits\">1.5\u00d7<\/span><\/div>\n          <input type=\"range\" id=\"visits\" min=\"1\" max=\"8\" step=\"0.5\" value=\"1.5\" \/>\n        <\/div>\n      <\/div>\n\n      <!-- ASSUMPTIONS -->\n      <div class=\"panel\" style=\"margin-top:1.5rem;\">\n        <button class=\"assumption-toggle\" id=\"toggle-assumptions\" onclick=\"toggleAssumptions()\">\n          Adjust loyalty benchmarks\n          <svg width=\"14\" height=\"14\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2.5\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M19 9l-7 7-7-7\"\/><\/svg>\n        <\/button>\n        <p style=\"font-size:0.75rem; color:#5A8A84; margin-top:-0.75rem; margin-bottom:0;\">Industry benchmarks auto-filled. Adjust to match your expectations.<\/p>\n\n        <div class=\"assumptions-section\" id=\"assumptions-section\">\n          <div style=\"height:1.25rem;\"><\/div>\n          <div class=\"field\">\n            <div class=\"field-label\">Loyalty member enrolment rate <span class=\"field-val\" id=\"val-enrol\">30%<\/span><\/div>\n            <input type=\"range\" id=\"enrol\" min=\"5\" max=\"80\" step=\"1\" value=\"30\" \/>\n            <p class=\"field-hint\">% of customers who sign up to your loyalty programme<\/p>\n          <\/div>\n          <div class=\"field\">\n            <div class=\"field-label\">Visit frequency lift (members) <span class=\"field-val\" id=\"val-freq-lift\">+20%<\/span><\/div>\n            <input type=\"range\" id=\"freq-lift\" min=\"0\" max=\"60\" step=\"1\" value=\"20\" \/>\n            <p class=\"field-hint\">How much more often loyalty members visit vs non-members<\/p>\n          <\/div>\n          <div class=\"field\">\n            <div class=\"field-label\">Avg spend lift (members) <span class=\"field-val\" id=\"val-spend-lift\">+15%<\/span><\/div>\n            <input type=\"range\" id=\"spend-lift\" min=\"0\" max=\"50\" step=\"1\" value=\"15\" \/>\n            <p class=\"field-hint\">How much more loyalty members spend per visit<\/p>\n          <\/div>\n          <div class=\"field\">\n            <div class=\"field-label\">Retention improvement <span class=\"field-val\" id=\"val-ret-lift\">12% more return<\/span><\/div>\n            <input type=\"range\" id=\"ret-lift\" min=\"0\" max=\"30\" step=\"1\" value=\"12\" \/>\n            <p class=\"field-hint\">How many more customers return after joining loyalty<\/p>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- RIGHT: RESULTS -->\n    <div>\n      <div class=\"results-panel\">\n        <p class=\"results-title\">Your projected ROI<\/p>\n\n        <div class=\"roi-hero\">\n          <p class=\"roi-hero-label\">Estimated net gain \u2014 per outlet<\/p>\n          <div class=\"roi-hero-val\" id=\"net-gain\">$ 0<\/div>\n          <p class=\"roi-hero-sub\">conservative estimate after reward costs<\/p>\n        <\/div>\n\n        <div class=\"metric-row\">\n          <span class=\"metric-row-label\">Loyalty members enrolled<\/span>\n          <span class=\"metric-row-val\" id=\"members-count\">0<\/span>\n        <\/div>\n        <div class=\"metric-row\">\n          <span class=\"metric-row-label\">Incremental revenue from members<\/span>\n          <span class=\"metric-row-val highlight\" id=\"incr-revenue\">$ 0<\/span>\n        <\/div>\n        <div class=\"metric-row\">\n          <span class=\"metric-row-label\">Retention value saved<\/span>\n          <span class=\"metric-row-val highlight\" id=\"ret-value\">$ 0<\/span>\n        <\/div>\n        <div class=\"metric-row\">\n          <span class=\"metric-row-label\">Total gross uplift (year 1)<\/span>\n          <span class=\"metric-row-val highlight\" id=\"total-uplift\">$ 0<\/span>\n        <\/div>\n        <div class=\"metric-row\">\n          <span class=\"metric-row-label\">Conservative adjustment (reward costs, redemption)<\/span>\n          <span class=\"metric-row-val\" id=\"adjustment\">\u2212 $ 0<\/span>\n        <\/div>\n        \n        <div class=\"email-gate\">\n          <p>Get this report + find out which Eber plan fits your business size and goals.<\/p>\n          <div class=\"email-input-row\">\n            <input type=\"email\" id=\"email-input\" placeholder=\"your@email.com\" \/>\n            <button class=\"btn-send\" onclick=\"sendReport()\">Send report<\/button>\n          <\/div>\n          <div class=\"email-success\" id=\"email-success\">\u2713 Report sent! Check your inbox shortly.<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n  <p class=\"calc-disclaimer\">Estimates are per outlet, based on the inputs above. Not intended for multi-outlet or enterprise projections. A 35% conservative adjustment is applied to account for reward costs, redemption rates, and programme overhead. Actual results depend on programme design, reward structure, and execution quality.<\/p>\n<\/div>\n\n<script>\n  const CONSERVATIVE_FACTOR = 0.65;\n\n  const presets = {\n    fnb:         { enrol:30, freqLift:20, spendLift:15, retLift:12 },\n    retail:      { enrol:25, freqLift:15, spendLift:12, retLift:10 },\n    hospitality: { enrol:40, freqLift:10, spendLift:18, retLift:15 },\n    membership:  { enrol:70, freqLift:25, spendLift:20, retLift:20 },\n  };\n\n  function fmt(n)  { return '$ ' + Math.round(n).toLocaleString(); }\n  function fmtK(n) { return Math.round(n).toLocaleString(); }\n\n  function calc() {\n    const customers = +document.getElementById('customers').value;\n    const txn       = +document.getElementById('txn').value;\n    const visits    = +document.getElementById('visits').value;\n    const enrol     = +document.getElementById('enrol').value \/ 100;\n    const freqLift  = +document.getElementById('freq-lift').value \/ 100;\n    const spendLift = +document.getElementById('spend-lift').value \/ 100;\n    const retLift   = +document.getElementById('ret-lift').value \/ 100;\n\n    const members        = Math.round(customers * enrol);\n    const memberRev      = members * txn * (1 + spendLift) * visits * (1 + freqLift);\n    const incrAnnual     = (memberRev - (members * txn * visits)) * 12;\n    const retainedExtra  = customers * retLift;\n    const retValueAnnual = retainedExtra * (txn * visits * 3);\n    const totalGross     = incrAnnual + retValueAnnual;\n    const adjustmentAmt  = totalGross * (1 - CONSERVATIVE_FACTOR);\n    const netGain        = totalGross * CONSERVATIVE_FACTOR;\n\n    document.getElementById('members-count').textContent = fmtK(members) + ' customers';\n    document.getElementById('incr-revenue').textContent  = fmt(incrAnnual);\n    document.getElementById('ret-value').textContent     = fmt(retValueAnnual);\n    document.getElementById('total-uplift').textContent  = fmt(totalGross);\n    document.getElementById('adjustment').textContent    = '\u2212 ' + fmt(adjustmentAmt);\n    document.getElementById('net-gain').textContent      = fmt(netGain);\n  }\n\n  function bindSlider(id, display, formatter) {\n    const slider = document.getElementById(id);\n    const out    = document.getElementById('val-' + display);\n    slider.addEventListener('input', () => { out.textContent = formatter(slider.value); calc(); });\n  }\n\n  bindSlider('customers',  'customers',   v => Number(v).toLocaleString());\n  bindSlider('txn',        'txn',         v => '$ ' + v);\n  bindSlider('visits',     'visits',      v => v + '\u00d7');\n  bindSlider('enrol',      'enrol',       v => v + '%');\n  bindSlider('freq-lift',  'freq-lift',   v => '+' + v + '%');\n  bindSlider('spend-lift', 'spend-lift',  v => '+' + v + '%');\n  bindSlider('ret-lift',   'ret-lift',    v => v + '% more return');\n\n  document.getElementById('industry').addEventListener('change', function() {\n    const p = presets[this.value];\n    document.getElementById('enrol').value       = p.enrol;\n    document.getElementById('freq-lift').value   = p.freqLift;\n    document.getElementById('spend-lift').value  = p.spendLift;\n    document.getElementById('ret-lift').value    = p.retLift;\n    document.getElementById('val-enrol').textContent      = p.enrol + '%';\n    document.getElementById('val-freq-lift').textContent  = '+' + p.freqLift + '%';\n    document.getElementById('val-spend-lift').textContent = '+' + p.spendLift + '%';\n    document.getElementById('val-ret-lift').textContent   = p.retLift + '% more return';\n    calc();\n  });\n\n  function toggleAssumptions() {\n    const section = document.getElementById('assumptions-section');\n    const btn     = document.getElementById('toggle-assumptions');\n    const visible = section.classList.toggle('visible');\n    btn.classList.toggle('open', visible);\n  }\n\n  const BREVO_API_KEY      = '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';\n  const BREVO_TEMPLATE_ID  = 60;\n  const BREVO_SENDER_EMAIL = 'marketing@eber.co';\n  const BREVO_SENDER_NAME  = 'Eber';\n  const BREVO_LIST_ID      = 30;\n\n  async function sendReport() {\n    const email = document.getElementById('email-input').value.trim();\n    if (!email || !email.includes('@')) { document.getElementById('email-input').focus(); return; }\n    const btn = document.querySelector('.btn-send');\n    btn.textContent = 'Sending\u2026';\n    btn.disabled = true;\n\n    const params = {\n      industry:     document.getElementById('industry').options[document.getElementById('industry').selectedIndex].text,\n      customers:    document.getElementById('val-customers').textContent,\n      txn:          document.getElementById('val-txn').textContent,\n      visits:       document.getElementById('val-visits').textContent,\n      members:      document.getElementById('members-count').textContent,\n      incr_revenue: document.getElementById('incr-revenue').textContent,\n      ret_value:    document.getElementById('ret-value').textContent,\n      ret_lift:     document.getElementById('val-ret-lift').textContent,\n      total_uplift: document.getElementById('total-uplift').textContent,\n      adjustment:   document.getElementById('adjustment').textContent,\n      net_gain:     document.getElementById('net-gain').textContent,\n    };\n\n    try {\n      \/\/ 1 \u2014 Send the ROI report email\n      const emailRes = await fetch('https:\/\/api.brevo.com\/v3\/smtp\/email', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'api-key': BREVO_API_KEY },\n        body: JSON.stringify({\n          sender: { name: BREVO_SENDER_NAME, email: BREVO_SENDER_EMAIL },\n          to: [{ email }],\n          templateId: BREVO_TEMPLATE_ID,\n          params,\n        }),\n      });\n      if (!emailRes.ok) { const err = await emailRes.json(); throw new Error(err.message); }\n\n      \/\/ 2 \u2014 Add contact to ROI Calculator Leads list\n      await fetch('https:\/\/api.brevo.com\/v3\/contacts', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'api-key': BREVO_API_KEY },\n        body: JSON.stringify({\n          email,\n          listIds: [BREVO_LIST_ID],\n          attributes: {\n            INDUSTRY:  params.industry,\n            NET_GAIN:  params.net_gain,\n            CUSTOMERS: params.customers,\n            TXN_VALUE: params.txn,\n          },\n          updateEnabled: true,\n        }),\n      });\n\n      \/\/ Success\n      document.querySelector('.email-input-row').style.display = 'none';\n      document.getElementById('email-success').style.display = 'block';\n\n    } catch(e) {\n      btn.textContent = 'Send report';\n      btn.disabled = false;\n      alert('Something went wrong \u2014 please try again or email us at marketing@eber.co');\n      console.error('Brevo error:', e);\n    }\n  }\n\n  calc();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1217edc e-flex e-con-boxed e-con e-parent\" data-id=\"1217edc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-48e6c6f elementor-widget elementor-widget-html\" data-id=\"48e6c6f\" 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<style>\n  .edu-wrap { padding: 3rem 2rem; background: #ffffff; font-family: 'Montserrat', sans-serif; }\n  .edu-inner { max-width: 1060px; margin: 0 auto; }\n  .edu-section-label { font-size: 11px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: #5A8A84; margin: 0 0 0.75rem; }\n  .edu-heading { font-size: 1.75rem; font-weight: 800; color: #0294A5; margin: 0 0 0.5rem; letter-spacing: -0.02em; }\n  .edu-subhead { font-size: 15px; color: #5A8A84; margin: 0 0 1.75rem; line-height: 1.7; }\n  .tab-row { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 1.25rem; }\n  .tab-btn { font-size: 0.8125rem; font-weight: 700; padding: 0.5rem 15px; border-radius: 8px; border: 1px solid rgba(0,196,179,0.3); background: #ffffff; color: #0294A5; cursor: pointer; transition: all 0.15s; font-family: 'Montserrat', sans-serif; }\n  .tab-btn:hover { background: #E9F8F7; }\n  .tab-btn.active { background: #00C4B3; color: #ffffff; border-color: #00C4B3; }\n  .industry-panel { display: none; }\n  .industry-panel.active { display: block; }\n  .industry-desc { font-size: 15px; color: #5A8A84; line-height: 1.7; padding: 1rem 1.25rem; background: #E9F8F7; border-radius: 12px; margin-bottom: 1.25rem; }\n  .bench-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 1rem; }\n  .bench-card { background: #FAFBFC; border: 1px solid rgba(0,196,179,0.15); border-radius: 12px; padding: 1rem 1.125rem; }\n  .bench-card-label { font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: #5A8A84; margin: 0 0 6px; }\n  .bench-card-val { font-size: 30px; font-weight: 800; color: #0294A5; margin: 0 0 4px; line-height: 1; }\n  .bench-card-note { font-size: 0.75rem; color: #5A8A84; margin: 0; }\n  .source-note { font-size: 0.7375rem; color: #5A8A84; margin-top: 1rem; line-height: 1.6; }\n  .edu-divider { border: none; border-top: 1px solid rgba(0,196,179,0.15); margin: 2.5rem 0; }\n  .def-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }\n  .def-card { background: #ffffff; border: 1px solid rgba(0,196,179,0.15); border-radius: 16px; padding: 1.25rem; }\n  .def-icon { font-size: 1.375rem; color: #00C4B3; margin-bottom: 0.625rem; }\n  .def-title { font-size: 0.875rem; font-weight: 700; color: #0294A5; margin: 0 0 6px; }\n  .def-body { font-size: 15px; color: #5A8A84; line-height: 1.65; margin: 0; }\n  @media(max-width: 768px) {\n    .bench-grid { grid-template-columns: repeat(2, 1fr); }\n    .def-grid { grid-template-columns: 1fr; }\n    .edu-wrap { padding: 2rem 1.25rem; }\n  }\n<\/style>\n\n<link href=\"https:\/\/cdn.jsdelivr.net\/npm\/@tabler\/icons-webfont@latest\/tabler-icons.min.css\" rel=\"stylesheet\" \/>\n\n<div class=\"edu-wrap\">\n  <div class=\"edu-inner\">\n\n    <p class=\"edu-section-label\">Loyalty benchmarks<\/p>\n    <h2 class=\"edu-heading\">What do these numbers mean for your industry?<\/h2>\n    <p class=\"edu-subhead\">The calculator uses real loyalty programme benchmarks. Select your industry to see what's typical \u2014 and what's possible.<\/p>\n\n    <div class=\"tab-row\">\n      <button class=\"tab-btn active\" onclick=\"showIndustry('fnb', this)\">F&B<\/button>\n      <button class=\"tab-btn\" onclick=\"showIndustry('retail', this)\">Retail<\/button>\n      <button class=\"tab-btn\" onclick=\"showIndustry('hospitality', this)\">Hospitality<\/button>\n      <button class=\"tab-btn\" onclick=\"showIndustry('membership', this)\">Membership<\/button>\n    <\/div>\n\n    <!-- F&B -->\n    <div class=\"industry-panel active\" id=\"edu-panel-fnb\">\n      <p class=\"industry-desc\">F&B brands see the strongest loyalty ROI because purchase frequency is naturally high. A small lift in visit rate compounds quickly across thousands of monthly transactions.<\/p>\n      <div class=\"bench-grid\">\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Enrolment rate<\/p>\n          <p class=\"bench-card-val\">30%<\/p>\n          <p class=\"bench-card-note\">of customers join<\/p>\n        <\/div>\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Visit frequency lift<\/p>\n          <p class=\"bench-card-val\">+20%<\/p>\n          <p class=\"bench-card-note\">members visit more<\/p>\n        <\/div>\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Avg spend lift<\/p>\n          <p class=\"bench-card-val\">+15%<\/p>\n          <p class=\"bench-card-note\">per visit<\/p>\n        <\/div>\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Retention lift<\/p>\n          <p class=\"bench-card-val\">12% more<\/p>\n          <p class=\"bench-card-note\">customers return<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- Retail -->\n    <div class=\"industry-panel\" id=\"edu-panel-retail\">\n      <p class=\"industry-desc\">Retail loyalty programmes excel at increasing basket size and reducing churn. Members tend to consolidate spending with brands they're enrolled in, reducing price comparison behaviour.<\/p>\n      <div class=\"bench-grid\">\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Enrolment rate<\/p>\n          <p class=\"bench-card-val\">25%<\/p>\n          <p class=\"bench-card-note\">of customers join<\/p>\n        <\/div>\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Visit frequency lift<\/p>\n          <p class=\"bench-card-val\">+15%<\/p>\n          <p class=\"bench-card-note\">members visit more<\/p>\n        <\/div>\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Avg spend lift<\/p>\n          <p class=\"bench-card-val\">+12%<\/p>\n          <p class=\"bench-card-note\">per visit<\/p>\n        <\/div>\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Retention lift<\/p>\n          <p class=\"bench-card-val\">10% more<\/p>\n          <p class=\"bench-card-note\">customers return<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- Hospitality -->\n    <div class=\"industry-panel\" id=\"edu-panel-hospitality\">\n      <p class=\"industry-desc\">Hospitality loyalty drives higher spend per stay and direct booking behaviour \u2014 reducing reliance on OTAs. Members tend to book earlier and stay longer than non-members.<\/p>\n      <div class=\"bench-grid\">\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Enrolment rate<\/p>\n          <p class=\"bench-card-val\">40%<\/p>\n          <p class=\"bench-card-note\">of customers join<\/p>\n        <\/div>\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Visit frequency lift<\/p>\n          <p class=\"bench-card-val\">+10%<\/p>\n          <p class=\"bench-card-note\">members return more<\/p>\n        <\/div>\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Avg spend lift<\/p>\n          <p class=\"bench-card-val\">+18%<\/p>\n          <p class=\"bench-card-note\">per stay<\/p>\n        <\/div>\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Retention lift<\/p>\n          <p class=\"bench-card-val\">15% more<\/p>\n          <p class=\"bench-card-note\">guests return<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- Membership -->\n    <div class=\"industry-panel\" id=\"edu-panel-membership\">\n      <p class=\"industry-desc\">Membership clubs see the highest enrolment rates since joining the programme is often tied to club access itself. Spend and frequency lifts are strong due to the community and exclusivity effect.<\/p>\n      <div class=\"bench-grid\">\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Enrolment rate<\/p>\n          <p class=\"bench-card-val\">70%<\/p>\n          <p class=\"bench-card-note\">of customers join<\/p>\n        <\/div>\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Visit frequency lift<\/p>\n          <p class=\"bench-card-val\">+25%<\/p>\n          <p class=\"bench-card-note\">members visit more<\/p>\n        <\/div>\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Avg spend lift<\/p>\n          <p class=\"bench-card-val\">+20%<\/p>\n          <p class=\"bench-card-note\">per visit<\/p>\n        <\/div>\n        <div class=\"bench-card\">\n          <p class=\"bench-card-label\">Retention lift<\/p>\n          <p class=\"bench-card-val\">20% more<\/p>\n          <p class=\"bench-card-note\">members stay<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <p class=\"source-note\">Benchmarks based on published loyalty industry research across Southeast Asia F&B, retail, and hospitality sectors. Actual results vary by brand, programme design, and execution quality.<\/p>\n\n    <hr class=\"edu-divider\" \/>\n    <br>\n\n    <p class=\"edu-section-label\">Definitions<\/p>\n    <h2 class=\"edu-heading\">What each metric means<\/h2>\n    <p class=\"edu-subhead\">Not sure what to enter? Here's a plain-English guide to each input.<\/p>\n\n    <div class=\"def-grid\">\n      <div class=\"def-card\">\n        <div class=\"def-icon\"><i class=\"ti ti-users\"><\/i><\/div>\n        <p class=\"def-title\">Monthly unique customers<\/p>\n        <p class=\"def-body\">The number of individual customers who make at least one purchase per month. Count heads, not transactions \u2014 if one customer visits 3 times, they count as 1.<\/p>\n      <\/div>\n      <div class=\"def-card\">\n        <div class=\"def-icon\"><i class=\"ti ti-receipt\"><\/i><\/div>\n        <p class=\"def-title\">Avg transaction value<\/p>\n        <p class=\"def-body\">The average amount spent per visit or purchase. Take your total monthly revenue and divide by total number of transactions to get this figure.<\/p>\n      <\/div>\n      <div class=\"def-card\">\n        <div class=\"def-icon\"><i class=\"ti ti-repeat\"><\/i><\/div>\n        <p class=\"def-title\">Avg visits per customer \/ month<\/p>\n        <p class=\"def-body\">How many times the average customer transacts in a month. A caf\u00e9 customer visiting twice a week = 8\u00d7. A retail customer buying once a month = 1\u00d7.<\/p>\n      <\/div>\n      <div class=\"def-card\">\n        <div class=\"def-icon\"><i class=\"ti ti-user-check\"><\/i><\/div>\n        <p class=\"def-title\">Loyalty enrolment rate<\/p>\n        <p class=\"def-body\">The share of your customers who sign up to your loyalty programme. Typically 20\u201340% for F&B and retail, higher for membership-based businesses.<\/p>\n      <\/div>\n      <div class=\"def-card\">\n        <div class=\"def-icon\"><i class=\"ti ti-arrow-back-up\"><\/i><\/div>\n        <p class=\"def-title\">Retention improvement<\/p>\n        <p class=\"def-body\">How many more customers return after joining your loyalty programme. A 12% improvement means 12 out of every 100 customers who would have left, now come back.<\/p>\n      <\/div>\n      <div class=\"def-card\">\n        <div class=\"def-icon\"><i class=\"ti ti-shield-check\"><\/i><\/div>\n        <p class=\"def-title\">Conservative adjustment<\/p>\n        <p class=\"def-body\">A 35% reduction applied to the gross uplift to account for loyalty reward costs, redemption rates, and programme overhead \u2014 giving you a realistic net estimate, not a best-case scenario.<\/p>\n      <\/div>\n    <\/div>\n\n  <\/div>\n<\/div>\n\n<script>\n  function showIndustry(id, btn) {\n    document.querySelectorAll('.industry-panel').forEach(p => p.classList.remove('active'));\n    document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));\n    document.getElementById('edu-panel-' + id).classList.add('active');\n    btn.classList.add('active');\n  }\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-773cf30 e-con-full e-flex e-con e-parent\" data-id=\"773cf30\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4949d25 elementor-widget elementor-widget-html\" data-id=\"4949d25\" 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<style>\n  .footer-cta {\n    background: #ffffff;\n    background-size: 60px 60px;\n    padding: 5rem 2rem;\n    text-align: center;\n    position: relative;\n    overflow: hidden;\n    font-family: 'Montserrat', sans-serif;\n  }\n  .footer-cta::before {\n    content: '';\n    position: absolute;\n    inset: 0;\n    background: radial-gradient(ellipse 60% 50% at 50% 100%, rgba(0,196,179,0.15), transparent 70%);\n    pointer-events: none;\n  }\n  .footer-cta h2 {\n    font-size: clamp(1.75rem, 4vw, 2.75rem);\n    font-weight: 700;\n    color: #0294A5;\n    letter-spacing: -0.025em;\n    margin-bottom: 1rem;\n    position: relative;\n  }\n  .footer-cta h2 em { color: #00C4B3; font-style: normal; }\n  .footer-cta .cta-sub {\n    color: #5A8A84;\n    font-size: 1rem;\n    margin-bottom: 2rem;\n    position: relative;\n  }\n  .cta-btns { display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap; position: relative; }\n  .cta-btn-primary {\n    background: #00C4B3;\n    color: #ffffff;\n    font-family: 'Montserrat', sans-serif;\n    font-weight: 700;\n    font-size: 0.9375rem;\n    padding: 0.9rem 2.25rem;\n    border-radius: 8px;\n    text-decoration: none;\n    transition: opacity 0.2s, transform 0.15s;\n    display: inline-block;\n  }\n  .cta-btn-primary:hover { opacity: 0.9; transform: translateY(-2px); }\n  .cta-btn-ghost {\n    background: transparent;\n    color: #0294A5;\n    font-family: 'Montserrat', sans-serif;\n    font-weight: 700;\n    font-size: 0.9375rem;\n    padding: 0.9rem 2.25rem;\n    border-radius: 8px;\n    border: 1px solid rgba(0,196,179,0.4);\n    text-decoration: none;\n    transition: border-color 0.2s, background 0.2s;\n    display: inline-block;\n  }\n  .cta-btn-ghost:hover { border-color: #00C4B3; background: rgba(0,196,179,0.08); }\n<\/style>\n\n<section class=\"footer-cta\">\n  <h2>Ready to see it work for <em>your brand?<\/em><\/h2>\n  <p class=\"cta-sub\">Talk to our team \u2014 we'll walk you through a tailored loyalty strategy for your business.<\/p>\n  <div class=\"cta-btns\">\n    <a href=\"\" class=\"cta-btn-primary\">Fill the form below<\/a>\n    <a href=\"https:\/\/eber.co\/pricing\" class=\"cta-btn-ghost\">See pricing<\/a>\n  <\/div>\n<\/section>\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>&nbsp; ROI calculator How much could loyalty earn you in 12 months? Enter your numbers below. We&#8217;ll show you a conservative estimate of your revenue uplift and retention value \u2014 based on real loyalty benchmarks, adjusted for reward costs. 500+ brands on Eber Avg 34% retention lift Launch in a week Your business Industry F&amp;B [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":11215,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-11204","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\/11204","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\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/comments?post=11204"}],"version-history":[{"count":0,"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/pages\/11204\/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=11204"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}