{"id":1092,"date":"2026-06-15T09:38:43","date_gmt":"2026-06-15T07:38:43","guid":{"rendered":"https:\/\/torreshospitalityconsulting.com\/?page_id=1092"},"modified":"2026-06-15T09:38:45","modified_gmt":"2026-06-15T07:38:45","slug":"free-upgrade-calculator","status":"publish","type":"page","link":"https:\/\/torreshospitalityconsulting.com\/en\/free-upgrade-calculator\/","title":{"rendered":"Free Upgrades Calculator"},"content":{"rendered":"<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=Poppins:wght@300;400;500;600;700;800&#038;display=swap\" rel=\"stylesheet\">\n\n<style>\n  :root {\n    --red: #e63329;\n    --red-dark: #c42820;\n    --bg: #ffffff;\n    --card-bg: #f5f5f5;\n    --card-border: #e0e0e0;\n    --card-active-bg: #fff5f5;\n    --text: #1a1a1a;\n    --text-muted: #555555;\n    --dark-bg: #1a1a1a;\n  }\n\n  .calc-wrap * { box-sizing: border-box; margin: 0; padding: 0; }\n\n  .calc-wrap {\n    font-family: 'Poppins', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n    color: var(--text);\n    line-height: 1.6;\n    background: var(--bg);\n  }\n\n  .calc-wrap a { color: var(--red); text-decoration: none; }\n  .calc-wrap a:hover { color: var(--red-dark); text-decoration: underline; }\n\n  .calc-wrap .container { max-width: 880px; margin: 0 auto; padding: 0 24px; }\n\n  .calc-wrap .hero { padding: 32px 0 8px; }\n\n  .calc-wrap h1 {\n    font-family: 'Poppins', sans-serif;\n    font-size: clamp(30px, 5vw, 50px);\n    font-weight: 800;\n    line-height: 1.2;\n    color: var(--text);\n  }\n\n  .calc-wrap h1 .accent { color: var(--red); }\n\n  .calc-wrap .subtitle {\n    color: var(--text-muted);\n    font-size: 17px;\n    margin-top: 16px;\n    max-width: 620px;\n  }\n\n  .calc-wrap .section-label {\n    display: flex; align-items: center; gap: 10px;\n    font-size: 11px; font-weight: 700; letter-spacing: 2px; text-transform: uppercase;\n    color: var(--red); margin-bottom: 16px;\n  }\n\n  .calc-wrap .section-label::before {\n    content: ''; display: inline-block; width: 28px; height: 2px; background: var(--red);\n  }\n\n  .calc-wrap .section-label.on-dark { color: #fff; }\n  .calc-wrap .section-label.on-dark::before { background: var(--red); }\n\n  .calc-wrap .calc-card {\n    background: var(--card-bg);\n    border: 1px solid var(--card-border);\n    border-radius: 8px;\n    padding: 32px;\n    margin: 28px 0;\n  }\n\n  .calc-wrap .input-group { margin-bottom: 26px; }\n  .calc-wrap .input-group:last-child { margin-bottom: 0; }\n\n  .calc-wrap label {\n    display: block; font-weight: 600; font-size: 14px; margin-bottom: 10px; color: var(--text);\n  }\n\n  .calc-wrap label .val { color: var(--red); font-weight: 700; }\n\n  .calc-wrap .toggle-group { display: flex; gap: 8px; }\n\n  .calc-wrap .toggle-btn {\n    flex: 1; padding: 12px 8px; border: 1px solid var(--card-border);\n    background: #fff; border-radius: 6px; cursor: pointer;\n    font-weight: 600; font-size: 14px; text-align: center; transition: all .15s;\n    color: var(--text); font-family: 'Poppins', sans-serif;\n  }\n\n  .calc-wrap .toggle-btn.active {\n    background: var(--card-active-bg); border-color: var(--red); color: var(--red);\n  }\n\n  .calc-wrap input[type=range] { width: 100%; accent-color: var(--red); }\n\n  .calc-wrap .range-row {\n    display: flex; justify-content: space-between; font-size: 12px; color: var(--text-muted); margin-top: 4px;\n  }\n\n  .calc-wrap .advanced-toggle {\n    display: inline-flex; align-items: center; gap: 6px;\n    margin-top: 8px; font-size: 13px; font-weight: 600; color: var(--red);\n    cursor: pointer; user-select: none;\n  }\n\n  .calc-wrap .advanced-panel {\n    margin-top: 20px; padding-top: 20px; border-top: 1px solid var(--card-border); display: none;\n  }\n\n  .calc-wrap .advanced-note {\n    font-size: 12px; color: var(--text-muted); margin-top: -6px; margin-bottom: 18px;\n  }\n\n  .calc-wrap .result-box {\n    background: var(--dark-bg); color: #fff; border-radius: 8px;\n    padding: 36px 32px; margin: 32px 0; text-align: center;\n  }\n\n  .calc-wrap .result-number {\n    font-family: 'Poppins', sans-serif;\n    font-size: clamp(34px, 7vw, 60px);\n    font-weight: 800; color: var(--red);\n  }\n\n  .calc-wrap .result-range { color: #ccc; margin-top: 8px; font-size: 15px; }\n\n  .calc-wrap .result-note {\n    color: #aaa; margin-top: 18px; font-size: 13px;\n    max-width: 480px; margin-left: auto; margin-right: auto;\n  }\n\n  .calc-wrap .result-note strong { color: #fff; }\n\n  .calc-wrap .breakdown {\n    display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin-top: 18px;\n  }\n\n  .calc-wrap .breakdown-item {\n    background: var(--card-bg); border: 1px solid var(--card-border);\n    border-radius: 6px; padding: 16px 8px; text-align: center;\n  }\n\n  .calc-wrap .breakdown-item strong {\n    font-size: 22px; display: block; margin-bottom: 4px;\n    color: var(--text); font-family: 'Poppins', sans-serif; font-weight: 700;\n  }\n\n  .calc-wrap .breakdown-item span { font-size: 12px; color: var(--text-muted); }\n\n  .calc-wrap .formula-note { color: var(--text-muted); font-size: 13px; margin-top: 16px; }\n\n  .calc-wrap .compare-row { margin-bottom: 14px; }\n\n  .calc-wrap .compare-label {\n    display: flex; justify-content: space-between; font-size: 13px; margin-bottom: 5px;\n    color: var(--text);\n  }\n\n  .calc-wrap .compare-track {\n    background: var(--card-border); border-radius: 4px; height: 10px; overflow: hidden;\n  }\n\n  .calc-wrap .compare-fill { height: 100%; border-radius: 4px; transition: width .2s; }\n\n  .calc-wrap .cta-section {\n    background: var(--dark-bg); color: #fff; border-radius: 8px;\n    padding: 40px 32px; text-align: center; margin: 40px 0 32px;\n  }\n\n  .calc-wrap .cta-section h2 {\n    font-family: 'Poppins', sans-serif;\n    font-size: clamp(22px, 4vw, 30px);\n    font-weight: 700; color: #fff;\n  }\n\n  .calc-wrap .cta-section p { color: #ccc; margin-top: 10px; font-size: 15px; }\n\n  .calc-wrap .btn-primary {\n    display: inline-block; background: var(--red); color: #fff !important;\n    padding: 14px 32px; border-radius: 6px; font-weight: 700;\n    text-decoration: none !important; margin-top: 18px; transition: background .2s;\n    font-family: 'Poppins', sans-serif;\n  }\n\n  .calc-wrap .btn-primary:hover { background: var(--red-dark); text-decoration: none !important; }\n\n  .calc-wrap section + section { margin-top: 40px; }\n\n  @media (max-width: 560px) {\n    .calc-wrap .breakdown { grid-template-columns: 1fr; }\n    .calc-wrap .toggle-btn { font-size: 13px; padding: 10px 6px; }\n  }\n<\/style>\n\n<div class=\"calc-wrap\">\n  <div class=\"container\">\n\n    <section class=\"hero\">\n      <div class=\"section-label\">CALCULATOR \u00b7 UPCILLARY PROGRAM<\/div>\n      <h1>Do you know how much money is there? <span class=\"accent\">giving away<\/span> your hotel every year without realizing it?<\/h1>\n      <p class=\"subtitle\">Every upgrade, suite, or extra you offer for free is revenue you&#039;re already generating\u2014you&#039;re just not collecting it. Estimate in seconds how much your hotel could be losing annually.<\/p>\n    <\/section>\n\n    <section class=\"calc-card\">\n      <div class=\"input-group\">\n        <label>Number of rooms: <span class=\"val\" id=\"roomsVal\">150<\/span><\/label>\n        <input type=\"range\" id=\"rooms\" min=\"50\" max=\"400\" step=\"10\" value=\"150\">\n        <div class=\"range-row\"><span>50<\/span><span>400<\/span><\/div>\n      <\/div>\n\n      <div class=\"input-group\">\n        <label>Hotel type<\/label>\n        <div class=\"toggle-group\" id=\"tipoGroup\">\n          <div class=\"toggle-btn active\" data-value=\"urbano\">Urban<\/div>\n          <div class=\"toggle-btn\" data-value=\"resort\">Resort \/ Vacation<\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"input-group\" style=\"margin-bottom: 6px;\">\n        <label>Category<\/label>\n        <div class=\"toggle-group\" id=\"catGroup\">\n          <div class=\"toggle-btn active\" data-value=\"4\">4\u2605<\/div>\n          <div class=\"toggle-btn\" data-value=\"5\">5\u2605<\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"advanced-toggle\" id=\"advToggle\">\u2699 Adjust with your hotel&#039;s actual data \u203a<\/div>\n\n      <div class=\"advanced-panel\" id=\"advancedPanel\">\n        <p class=\"advanced-note\">These values are calculated automatically based on type, category, and size. If you know your actual figures, adjust them here.<\/p>\n        <div class=\"input-group\">\n          <label>Complimentary upgrades given away per day: <span class=\"val\" id=\"eVal\"><\/span><\/label>\n          <input type=\"range\" id=\"eSlider\" min=\"0\" max=\"15\" step=\"0.5\">\n        <\/div>\n        <div class=\"input-group\">\n          <label>Average upgrade price per night: <span class=\"val\" id=\"pVal\"><\/span> \u20ac<\/label>\n          <input type=\"range\" id=\"pSlider\" min=\"15\" max=\"80\" step=\"1\">\n        <\/div>\n        <div class=\"input-group\">\n          <label>Average number of nights of stay: <span class=\"val\" id=\"dVal\"><\/span><\/label>\n          <input type=\"range\" id=\"dSlider\" min=\"1\" max=\"10\" step=\"0.5\">\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"result-box\">\n      <div class=\"section-label on-dark\" style=\"justify-content:center;\">ESTIMATED LEAKAGE PER YEAR<\/div>\n      <div class=\"result-number\" id=\"resultMain\">136.900 \u20ac<\/div>\n      <p class=\"result-range\">Likely range: <span id=\"resultRange\">\u20ac95,800 \u2013 \u20ac177,900<\/span><\/p>\n      <p class=\"result-note\">This is equivalent to giving away, on average, <strong id=\"eDisplay\">5<\/strong> upgrades every night \u2014 365 days a year.<\/p>\n    <\/section>\n\n    <section>\n      <div class=\"section-label\">HOW IS IT CALCULATED?<\/div>\n      <div class=\"breakdown\">\n        <div class=\"breakdown-item\"><strong id=\"bE\">5<\/strong><span>Free upgrades \/ day<\/span><\/div>\n        <div class=\"breakdown-item\"><strong id=\"bP\">30 \u20ac<\/strong><span>average price \/ night<\/span><\/div>\n        <div class=\"breakdown-item\"><strong id=\"bD\">2,5<\/strong><span>average stay nights<\/span><\/div>\n      <\/div>\n      <p class=\"formula-note\">365 days a year. Starting point based on the accumulated experience of the Torres Hospitality Consulting team implementing Ancillary Revenue programs in over 400 4-5 star hotels in Europe. Your hotel&#039;s actual figure may vary\u2014the Diagnostic (Phase 1 of the Upcillary Program) calculates it using data from your PMS.<\/p>\n    <\/section>\n\n    <section>\n      <div class=\"section-label\">YOUR HOTEL IN THE CONTEXT OF THE SECTOR<\/div>\n      <div id=\"compareBars\"><\/div>\n    <\/section>\n\n    <section class=\"cta-section\">\n      <h2>Do you want to know the real figure for your hotel?<\/h2>\n      <p>Book a 30-minute, no-obligation consultation. Together, we&#039;ll estimate your leak using your actual data\u2014you get the figure, whether you sign up or not.<\/p>\n      <a class=\"btn-primary\" href=\"mailto:pablo.torres@torresconsulting.co.uk?subject=Quiero%20calcular%20la%20fuga%20de%20ingresos%20de%20mi%20hotel\">Book a conversation \u2192<\/a>\n    <\/section>\n\n  <\/div>\n<\/div>\n\n<script>\n(function() {\n  var segmentParams = {\n    'urbano-4': { eRatio: 0.033333, p: 30, d: 2.5, label: 'Urbano 4\u2605' },\n    'urbano-5': { eRatio: 0.033333, p: 50, d: 2.5, label: 'Urbano 5\u2605' },\n    'resort-4': { eRatio: 0.053333, p: 35, d: 4,   label: 'Resort 4\u2605' },\n    'resort-5': { eRatio: 0.053333, p: 50, d: 4,   label: 'Resort 5\u2605' }\n  };\n\n  var state = { rooms: 150, tipo: 'urbano', cat: '4', E: 0, P: 0, D: 0 };\n\n  function fmtEUR(n) {\n    var rounded = Math.round(n \/ 100) * 100;\n    return rounded.toLocaleString('es-ES') + ' \u20ac';\n  }\n\n  function fmtNum(n) {\n    return n.toLocaleString('es-ES', { maximumFractionDigits: 1 });\n  }\n\n  function segKey() { return state.tipo + '-' + state.cat; }\n\n  function applyDefaults() {\n    var seg = segmentParams[segKey()];\n    state.E = Math.round(state.rooms * seg.eRatio * 10) \/ 10;\n    state.P = seg.p;\n    state.D = seg.d;\n    document.getElementById('eSlider').value = state.E;\n    document.getElementById('pSlider').value = state.P;\n    document.getElementById('dSlider').value = state.D;\n  }\n\n  function updateCompareBars() {\n    var keys = ['urbano-4', 'urbano-5', 'resort-4', 'resort-5'];\n    var vals = keys.map(function(k) {\n      var seg = segmentParams[k];\n      var E = Math.round(state.rooms * seg.eRatio * 10) \/ 10;\n      return { key: k, label: seg.label, val: E * seg.p * seg.d * 365 };\n    });\n    var max = Math.max.apply(null, vals.map(function(v) { return v.val; }));\n    var html = vals.map(function(v) {\n      var pct = Math.round((v.val \/ max) * 100);\n      var active = v.key === segKey();\n      var fill = active ? 'var(--red)' : '#bbbbbb';\n      var labelText = v.label + (active ? ' (tu selecci\u00f3n)' : '');\n      return '<div class=\"compare-row\">' +\n        '<div class=\"compare-label\"><span>' + labelText + '<\/span><span>' + fmtEUR(v.val) + '<\/span><\/div>' +\n        '<div class=\"compare-track\"><div class=\"compare-fill\" style=\"width:' + pct + '%;background:' + fill + ';\"><\/div><\/div>' +\n        '<\/div>';\n    }).join('');\n    document.getElementById('compareBars').innerHTML = html;\n  }\n\n  function update() {\n    var annual = state.E * state.P * state.D * 365;\n    document.getElementById('resultMain').textContent = fmtEUR(annual);\n    document.getElementById('resultRange').textContent = fmtEUR(annual * 0.7) + ' \u2013 ' + fmtEUR(annual * 1.3);\n    document.getElementById('eDisplay').textContent = fmtNum(state.E);\n    document.getElementById('bE').textContent = fmtNum(state.E);\n    document.getElementById('bP').textContent = state.P + ' \u20ac';\n    document.getElementById('bD').textContent = fmtNum(state.D);\n    document.getElementById('eVal').textContent = fmtNum(state.E);\n    document.getElementById('pVal').textContent = state.P;\n    document.getElementById('dVal').textContent = fmtNum(state.D);\n    document.getElementById('roomsVal').textContent = state.rooms;\n    updateCompareBars();\n  }\n\n  document.getElementById('rooms').addEventListener('input', function(e) {\n    state.rooms = +e.target.value;\n    applyDefaults();\n    update();\n  });\n\n  document.querySelectorAll('#tipoGroup .toggle-btn').forEach(function(btn) {\n    btn.addEventListener('click', function() {\n      document.querySelectorAll('#tipoGroup .toggle-btn').forEach(function(b) { b.classList.remove('active'); });\n      btn.classList.add('active');\n      state.tipo = btn.dataset.value;\n      applyDefaults();\n      update();\n    });\n  });\n\n  document.querySelectorAll('#catGroup .toggle-btn').forEach(function(btn) {\n    btn.addEventListener('click', function() {\n      document.querySelectorAll('#catGroup .toggle-btn').forEach(function(b) { b.classList.remove('active'); });\n      btn.classList.add('active');\n      state.cat = btn.dataset.value;\n      applyDefaults();\n      update();\n    });\n  });\n\n  document.getElementById('eSlider').addEventListener('input', function(e) { state.E = +e.target.value; update(); });\n  document.getElementById('pSlider').addEventListener('input', function(e) { state.P = +e.target.value; update(); });\n  document.getElementById('dSlider').addEventListener('input', function(e) { state.D = +e.target.value; update(); });\n\n  document.getElementById('advToggle').addEventListener('click', function() {\n    var panel = document.getElementById('advancedPanel');\n    var open = panel.style.display === 'block';\n    panel.style.display = open ? 'none' : 'block';\n    document.getElementById('advToggle').textContent = open\n      ? '\u2699 Ajustar con los datos reales de tu hotel \u203a'\n      : '\u2699 Ocultar ajustes avanzados \u2039';\n  });\n\n  applyDefaults();\n  update();\n})();\n<\/script>","protected":false},"excerpt":{"rendered":"<p>CALCULADORA \u00b7 PROGRAMA UPCILLARY \u00bfSabes cu\u00e1nto dinero est\u00e1 regalando tu hotel cada a\u00f1o sin darse cuenta? Cada upgrade, suite o extra que ofreces gratis es un<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1092","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/torreshospitalityconsulting.com\/en\/wp-json\/wp\/v2\/pages\/1092","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/torreshospitalityconsulting.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/torreshospitalityconsulting.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/torreshospitalityconsulting.com\/en\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/torreshospitalityconsulting.com\/en\/wp-json\/wp\/v2\/comments?post=1092"}],"version-history":[{"count":1,"href":"https:\/\/torreshospitalityconsulting.com\/en\/wp-json\/wp\/v2\/pages\/1092\/revisions"}],"predecessor-version":[{"id":1093,"href":"https:\/\/torreshospitalityconsulting.com\/en\/wp-json\/wp\/v2\/pages\/1092\/revisions\/1093"}],"wp:attachment":[{"href":"https:\/\/torreshospitalityconsulting.com\/en\/wp-json\/wp\/v2\/media?parent=1092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}