{"id":32958,"date":"2026-07-13T15:04:42","date_gmt":"2026-07-13T15:04:42","guid":{"rendered":"https:\/\/saunazilla.com\/?page_id=32958"},"modified":"2026-07-13T15:04:43","modified_gmt":"2026-07-13T15:04:43","slug":"electric-vs-infrared-sauna-calculator","status":"publish","type":"page","link":"https:\/\/saunazilla.com\/en\/electric-vs-infrared-sauna-calculator\/","title":{"rendered":"Electric vs Infrared Sauna Cost Calculator | Running Cost &amp; Energy Use"},"content":{"rendered":"<p>Are you planning a home sauna and trying to make a choice between an electric sauna and the infrared? It&#8217;s certainly not a simple question, nor a straightforward answer. But, if power consumption, electricity costs, and the environmental footprint are your key variables, then this calculator is for you.<\/p>\n<p>&nbsp;<\/p>\n\n<p>Please note that no online calculator can give you a perfect answer. Every home sauna build is different. These two sauna types themselves are entirely different user experiences and temperatures, etc. If you happen to be wondering about the various sauna heater sizes, please see our <a href=\"https:\/\/saunazilla.com\/en\/sauna-heater-size-calculator\/\">sauna heater size calculator<\/a>.<\/p>\n<p>&nbsp;<\/p>\n\n\n<!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>Infrared vs Electric Sauna Cost &#038; Energy Calculator<\/title>\n<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=Noto+Sans+Display:wght@400;500;600;700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n  :root {\n    --red: #F60202;\n    --red-dark: #C20000;\n    --orange-dark: #ea8200;\n    --red-light: #FFF0F0;\n    --red-bg: #FFF5F5;\n    --gray-50: #FAFAFA;\n    --gray-100: #F5F5F5;\n    --gray-200: #E5E5E5;\n    --gray-300: #D4D4D4;\n    --gray-400: #A3A3A3;\n    --gray-500: #737373;\n    --gray-600: #525252;\n    --gray-700: #404040;\n    --gray-800: #262626;\n    --gray-900: #171717;\n    --white: #FFFFFF;\n    --radius: 8px;\n    --radius-lg: 12px;\n  }\n\n  body {\n    font-family: 'Noto Sans Display', system-ui, -apple-system, sans-serif;\n    background: var(--gray-100);\n    color: var(--gray-900);\n    line-height: 1.5;\n    padding: 20px;\n  }\n\n  .calc-wrap {\n    max-width: 860px;\n    margin: 0 auto;\n  }\n\n  .calc-card {\n    background: var(--white);\n    border: 1px solid var(--gray-200);\n    border-radius: var(--radius-lg);\n    overflow: hidden;\n    box-shadow: 0 1px 3px rgba(0,0,0,0.06);\n  }\n\n  .calc-head {\n    background: var(--red);\n    color: var(--white);\n    padding: 24px 28px 20px;\n    text-align: center;\n  }\n\n  .calc-head .icon-wrap {\n    width: 48px;\n    height: 48px;\n    background: rgba(255,255,255,0.15);\n    border-radius: 50%;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    margin: 0 auto 12px;\n  }\n\n  .calc-head .icon-wrap svg {\n    width: 24px;\n    height: 24px;\n  }\n\n  .calc-head h1 {\n    font-size: 1.25rem;\n    font-weight: 700;\n    letter-spacing: -0.01em;\n  }\n\n  .calc-head p {\n    font-size: 0.85rem;\n    opacity: 0.85;\n    margin-top: 4px;\n  }\n\n  .calc-body {\n    padding: 20px 24px 24px;\n  }\n\n  .row {\n    margin-bottom: 18px;\n  }\n\n  .row:last-child { margin-bottom: 0; }\n\n  .label {\n    font-size: 0.75rem;\n    font-weight: 600;\n    text-transform: uppercase;\n    letter-spacing: 0.04em;\n    color: var(--gray-500);\n    margin-bottom: 8px;\n  }\n\n  .label-row {\n    display: flex;\n    align-items: baseline;\n    justify-content: space-between;\n    margin-bottom: 8px;\n  }\n\n  .label-row .label-sm {\n    font-size: 0.75rem;\n    font-weight: 600;\n    text-transform: uppercase;\n    letter-spacing: 0.04em;\n    color: var(--gray-500);\n  }\n\n  .label-row .val {\n    font-size: 0.8rem;\n    font-weight: 600;\n    color: var(--red);\n  }\n\n  \/* Section title *\/\n  .section-title {\n    font-size: 0.75rem;\n    font-weight: 600;\n    text-transform: uppercase;\n    letter-spacing: 0.04em;\n    color: var(--gray-400);\n    margin: 0 0 14px;\n    padding-bottom: 8px;\n    border-bottom: 1px solid var(--gray-200);\n  }\n\n  \/* Shared inputs row *\/\n  .shared-row {\n    display: grid;\n    grid-template-columns: 1fr 1fr 1fr;\n    gap: 14px;\n    margin-bottom: 22px;\n  }\n\n  @media (max-width: 680px) {\n    .shared-row { grid-template-columns: 1fr; }\n  }\n\n  \/* Heater comparison grid *\/\n  .heater-grid {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 16px;\n    margin-bottom: 22px;\n  }\n\n  @media (max-width: 680px) {\n    .heater-grid { grid-template-columns: 1fr; }\n  }\n\n  \/* Heater card *\/\n  .heater-card {\n    background: var(--gray-50);\n    border: 1px solid var(--gray-200);\n    border-radius: var(--radius);\n    padding: 16px;\n  }\n\n  .heater-card .card-head {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    margin-bottom: 14px;\n  }\n\n  .heater-card .card-indicator {\n    width: 10px;\n    height: 10px;\n    border-radius: 50%;\n    flex-shrink: 0;\n  }\n\n  .heater-card .card-indicator.electric { background: var(--red); }\n  .heater-card .card-indicator.infrared { background: var(--orange-dark); }\n\n  .heater-card .card-title {\n    font-size: 0.85rem;\n    font-weight: 700;\n    color: var(--gray-800);\n  }\n\n  .heater-card label {\n    display: block;\n    font-size: 0.72rem;\n    font-weight: 600;\n    text-transform: uppercase;\n    letter-spacing: 0.04em;\n    color: var(--gray-500);\n    margin-bottom: 6px;\n    margin-top: 12px;\n  }\n\n  .heater-card label:first-of-type {\n    margin-top: 0;\n  }\n\n  \/* Select *\/\n  select {\n    width: 100%;\n    padding: 8px 10px;\n    font-size: 0.82rem;\n    font-weight: 500;\n    border: 1px solid var(--gray-300);\n    border-radius: 6px;\n    background: var(--white);\n    color: var(--gray-700);\n    font-family: inherit;\n    outline: none;\n    transition: border-color 0.15s;\n  }\n\n  select:focus {\n    border-color: var(--red);\n    box-shadow: 0 0 0 3px rgba(246,2,2,0.12);\n  }\n\n  \/* Number input *\/\n  input[type=number] {\n    width: 100%;\n    padding: 8px 10px;\n    font-size: 0.9rem;\n    font-weight: 500;\n    border: 1px solid var(--gray-300);\n    border-radius: 6px;\n    background: var(--white);\n    outline: none;\n    transition: border-color 0.15s, box-shadow 0.15s;\n    font-family: inherit;\n    -moz-appearance: textfield;\n  }\n\n  input[type=number]::-webkit-inner-spin-button,\n  input[type=number]::-webkit-outer-spin-button {\n    opacity: 1;\n    height: 28px;\n  }\n\n  input[type=number]:focus {\n    border-color: var(--red);\n    box-shadow: 0 0 0 3px rgba(246,2,2,0.12);\n  }\n\n  \/* Range slider *\/\n  .range-row {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n  }\n\n  input[type=range] {\n    flex: 1;\n    -webkit-appearance: none;\n    appearance: none;\n    height: 6px;\n    border-radius: 99px;\n    background: var(--gray-200);\n    outline: none;\n  }\n\n  input[type=range]::-webkit-slider-thumb {\n    -webkit-appearance: none;\n    appearance: none;\n    width: 20px;\n    height: 20px;\n    border-radius: 50%;\n    background: var(--red);\n    border: 3px solid #fff;\n    box-shadow: 0 1px 4px rgba(0,0,0,.25);\n    cursor: pointer;\n  }\n\n  input[type=range]::-moz-range-thumb {\n    width: 20px;\n    height: 20px;\n    border-radius: 50%;\n    background: var(--red);\n    border: 3px solid #fff;\n    box-shadow: 0 1px 4px rgba(0,0,0,.25);\n    cursor: pointer;\n  }\n\n  .range-val {\n    min-width: 50px;\n    text-align: right;\n    font-size: 0.8rem;\n    font-weight: 600;\n    color: var(--red);\n    flex-shrink: 0;\n  }\n\n  \/* Advanced toggle *\/\n  .advanced-toggle {\n    font-size: 0.75rem;\n    font-weight: 600;\n    color: var(--gray-500);\n    cursor: pointer;\n    display: flex;\n    align-items: center;\n    gap: 5px;\n    user-select: none;\n    margin-top: 14px;\n    padding-top: 12px;\n    border-top: 1px solid var(--gray-200);\n  }\n\n  .advanced-toggle .arrow {\n    transition: transform .15s ease;\n    display: inline-block;\n    font-size: 0.7rem;\n  }\n\n  .advanced-toggle.open .arrow {\n    transform: rotate(90deg);\n  }\n\n  .advanced-body {\n    display: none;\n    margin-top: 12px;\n    padding: 12px;\n    border-radius: var(--radius);\n    background: var(--white);\n    border: 1px solid var(--gray-200);\n  }\n\n  .advanced-body.open {\n    display: block;\n  }\n\n  .hint {\n    font-size: 0.72rem;\n    color: var(--gray-400);\n    margin-top: 8px;\n    line-height: 1.5;\n  }\n\n  \/* Result grid *\/\n  .result-grid {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 12px;\n    margin-bottom: 14px;\n  }\n\n  @media (max-width: 540px) {\n    .result-grid { grid-template-columns: 1fr; }\n  }\n\n  .result-card {\n    border: 1px solid var(--gray-200);\n    border-radius: var(--radius);\n    padding: 16px;\n    text-align: center;\n  }\n\n  .result-card .r-label {\n    font-size: 0.65rem;\n    font-weight: 600;\n    text-transform: uppercase;\n    letter-spacing: 0.04em;\n    color: var(--gray-400);\n    margin-bottom: 6px;\n  }\n\n  .result-card .r-num {\n    font-size: 1.6rem;\n    font-weight: 800;\n    color: var(--gray-900);\n    line-height: 1;\n    letter-spacing: -0.02em;\n  }\n\n  .result-card .r-sub {\n    font-size: 0.72rem;\n    color: var(--gray-400);\n    margin-top: 2px;\n  }\n\n  .result-card.electric .r-num { color: var(--red); }\n  .result-card.infrared .r-num { color: var(--orange-dark); }\n\n  .result-card .r-breakdown {\n    margin-top: 12px;\n    padding-top: 10px;\n    border-top: 1px solid var(--gray-200);\n  }\n\n  .result-card .r-breakdown div {\n    display: flex;\n    justify-content: space-between;\n    font-size: 0.75rem;\n    padding: 3px 0;\n    color: var(--gray-600);\n  }\n\n  .result-card .r-breakdown div span:last-child {\n    font-weight: 600;\n    color: var(--gray-700);\n  }\n\n  \/* Hero savings banner *\/\n  .savings-banner {\n    background: var(--red);\n    color: var(--white);\n    border-radius: var(--radius);\n    padding: 20px 22px;\n    text-align: center;\n    margin-bottom: 14px;\n  }\n\n  .savings-banner .headline {\n    font-size: 1.15rem;\n    font-weight: 800;\n    margin-bottom: 4px;\n  }\n\n  .savings-banner .detail {\n    font-size: 0.82rem;\n    opacity: 0.88;\n  }\n\n  \/* Chart card *\/\n  .chart-card {\n    background: var(--gray-50);\n    border: 1px solid var(--gray-200);\n    border-radius: var(--radius);\n    padding: 16px 18px;\n    margin-bottom: 14px;\n  }\n\n  .chart-card h3 {\n    font-size: 0.85rem;\n    font-weight: 700;\n    color: var(--gray-800);\n    margin: 0 0 14px;\n  }\n\n  .bar-group {\n    margin-bottom: 14px;\n  }\n\n  .bar-group:last-child { margin-bottom: 0; }\n\n  .bar-label {\n    display: flex;\n    justify-content: space-between;\n    font-size: 0.72rem;\n    font-weight: 600;\n    color: var(--gray-500);\n    margin-bottom: 3px;\n  }\n\n  .bar-track {\n    background: var(--gray-200);\n    border-radius: 99px;\n    height: 14px;\n    width: 100%;\n    overflow: hidden;\n    margin-bottom: 2px;\n  }\n\n  .bar-fill {\n    height: 100%;\n    border-radius: 99px;\n    transition: width 0.3s ease;\n  }\n\n  .bar-fill.electric { background: var(--red); }\n  .bar-fill.infrared { background: var(--orange-dark); }\n\n  .bar-value {\n    font-size: 0.72rem;\n    color: var(--gray-500);\n    font-weight: 500;\n    margin-bottom: 6px;\n  }\n\n  .bar-group:last-child .bar-value { margin-bottom: 0; }\n\n  \/* Branding *\/\n  .sauna-branding {\n    text-align: center;\n    padding: 14px 0 4px;\n    opacity: 0.35;\n  }\n\n  \/* Disclaimer *\/\n  .disclaimer {\n    padding: 0 24px 20px;\n    font-size: 0.68rem;\n    color: var(--gray-400);\n    line-height: 1.6;\n  }\n\n  @media (max-width: 540px) {\n    .calc-body { padding: 16px; }\n    .calc-head { padding: 20px 16px 16px; }\n    .disclaimer { padding: 0 16px 16px; }\n    .result-card .r-num { font-size: 1.3rem; }\n  }\n<\/style>\n<\/head>\n<body>\n<div class=\"calc-wrap\">\n\n  <div class=\"calc-card\">\n    <div class=\"calc-head\">\n      <div class=\"icon-wrap\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n          <path d=\"M12 20h.01\"\/><path d=\"M12 14h.01\"\/><path d=\"M12 8h.01\"\/><path d=\"M21.5 2.5L12 12\"\/><path d=\"M16.5 6.5L20 3\"\/><path d=\"M22 8l-3 3\"\/><path d=\"M4 4l16 16\"\/><path d=\"M9.21 3.1A6.98 6.98 0 0 1 19 8c0 3.5-2 6.5-5 7.5\"\/>\n        <\/svg>\n      <\/div>\n      <h1>Infrared vs. Traditional Electric Sauna: Cost &amp; Energy Calculator<\/h1>\n      <p>Estimate monthly and annual electricity cost, kWh usage, and CO\u2082 footprint for both heater types<\/p>\n    <\/div>\n\n    <div class=\"calc-body\">\n\n      <!-- Shared inputs -->\n      <div class=\"section-title\">Common settings<\/div>\n      <div class=\"shared-row\">\n        <div class=\"row\" style=\"margin:0;\">\n          <div class=\"label-row\">\n            <span class=\"label-sm\">Sessions per week<\/span>\n            <span class=\"val\" id=\"sessionsPerWeekVal\">3<\/span>\n          <\/div>\n          <input type=\"range\" id=\"sessionsPerWeek\" min=\"1\" max=\"14\" step=\"1\" value=\"3\">\n        <\/div>\n        <div class=\"row\" style=\"margin:0;\">\n          <div class=\"label\" style=\"margin-bottom:6px;\">Electricity rate ($\/kWh)<\/div>\n          <input type=\"number\" id=\"rate\" min=\"0.01\" step=\"0.01\" value=\"0.15\">\n        <\/div>\n        <div class=\"row\" style=\"margin:0;\">\n          <div class=\"label\" style=\"margin-bottom:6px;\">Grid carbon intensity (lbs CO\u2082\/kWh)<\/div>\n          <input type=\"number\" id=\"carbon\" min=\"0\" step=\"0.01\" value=\"0.85\">\n        <\/div>\n      <\/div>\n\n      <!-- Heater comparison -->\n      <div class=\"section-title\">Heater comparison<\/div>\n      <div class=\"heater-grid\">\n\n        <!-- Electric -->\n        <div class=\"heater-card\">\n          <div class=\"card-head\">\n            <span class=\"card-indicator electric\"><\/span>\n            <span class=\"card-title\">Traditional Electric Heater<\/span>\n          <\/div>\n\n          <label>Preset<\/label>\n          <select id=\"electricPreset\">\n            <option value=\"small\">Small (1\u20132 person) \u2013 4.5 kW<\/option>\n            <option value=\"medium\" selected>Medium (3\u20134 person) \u2013 6 kW<\/option>\n            <option value=\"large\">Large (5\u20136 person) \u2013 9 kW<\/option>\n            <option value=\"custom\">Custom<\/option>\n          <\/select>\n\n          <label>Heater power (kW)<\/label>\n          <div class=\"range-row\">\n            <input type=\"range\" id=\"electricKw\" min=\"3\" max=\"18\" step=\"0.5\" value=\"6\">\n            <span class=\"range-val\" id=\"electricKwVal\">6.0<\/span>\n          <\/div>\n\n          <label>Preheat time (minutes)<\/label>\n          <div class=\"range-row\">\n            <input type=\"range\" id=\"electricPreheat\" min=\"10\" max=\"60\" step=\"1\" value=\"35\">\n            <span class=\"range-val\" id=\"electricPreheatVal\">35<\/span>\n          <\/div>\n\n          <label>Session length (minutes)<\/label>\n          <div class=\"range-row\">\n            <input type=\"range\" id=\"electricSession\" min=\"15\" max=\"90\" step=\"5\" value=\"40\">\n            <span class=\"range-val\" id=\"electricSessionVal\">40<\/span>\n          <\/div>\n\n          <!-- Advanced: duty cycle -->\n          <div class=\"advanced-toggle\" id=\"electricAdvToggle\"><span class=\"arrow\">\u25b8<\/span> Advanced: power draw by phase<\/div>\n          <div class=\"advanced-body\" id=\"electricAdvBody\">\n            <label>Duty cycle during session (%)<\/label>\n            <div class=\"range-row\">\n              <input type=\"range\" id=\"electricDuty\" min=\"20\" max=\"80\" step=\"1\" value=\"50\">\n              <span class=\"range-val\" id=\"electricDutyVal\">50%<\/span>\n            <\/div>\n            <p class=\"hint\">After preheat, the heater cycles on\/off to hold temperature. Duty cycle = % of time it&#8217;s drawing power.<\/p>\n          <\/div>\n        <\/div>\n\n        <!-- Infrared -->\n        <div class=\"heater-card\">\n          <div class=\"card-head\">\n            <span class=\"card-indicator infrared\"><\/span>\n            <span class=\"card-title\">Infrared Sauna Cabin<\/span>\n          <\/div>\n\n          <label>Preset<\/label>\n          <select id=\"infraredPreset\">\n            <option value=\"small\">1\u20132 Person \u2013 1.5 kW<\/option>\n            <option value=\"medium\" selected>1\u20132 Person \u2013 2.0 kW<\/option>\n            <option value=\"large\">3\u20134 Person \u2013 3.0 kW<\/option>\n            <option value=\"custom\">Custom<\/option>\n          <\/select>\n\n          <label>Heater power (kW)<\/label>\n          <div class=\"range-row\">\n            <input type=\"range\" id=\"infraredKw\" min=\"1\" max=\"4\" step=\"0.1\" value=\"2\">\n            <span class=\"range-val\" id=\"infraredKwVal\">2.0<\/span>\n          <\/div>\n\n          <label>Preheat time (minutes)<\/label>\n          <div class=\"range-row\">\n            <input type=\"range\" id=\"infraredPreheat\" min=\"0\" max=\"20\" step=\"1\" value=\"10\">\n            <span class=\"range-val\" id=\"infraredPreheatVal\">10<\/span>\n          <\/div>\n\n          <label>Session length (minutes)<\/label>\n          <div class=\"range-row\">\n            <input type=\"range\" id=\"infraredSession\" min=\"15\" max=\"90\" step=\"5\" value=\"40\">\n            <span class=\"range-val\" id=\"infraredSessionVal\">40<\/span>\n          <\/div>\n\n          <!-- Advanced: duty cycle -->\n          <div class=\"advanced-toggle\" id=\"infraredAdvToggle\"><span class=\"arrow\">\u25b8<\/span> Advanced: power draw by phase<\/div>\n          <div class=\"advanced-body\" id=\"infraredAdvBody\">\n            <label>Duty cycle during session (%)<\/label>\n            <div class=\"range-row\">\n              <input type=\"range\" id=\"infraredDuty\" min=\"50\" max=\"100\" step=\"1\" value=\"90\">\n              <span class=\"range-val\" id=\"infraredDutyVal\">90%<\/span>\n            <\/div>\n            <p class=\"hint\">After preheat, the heater cycles on\/off to hold temperature. Duty cycle = % of time it&#8217;s drawing power.<\/p>\n          <\/div>\n        <\/div>\n\n      <\/div>\n\n      <!-- Results -->\n      <div class=\"section-title\">Annual comparison<\/div>\n      <div class=\"result-grid\">\n        <div class=\"result-card electric\">\n          <div class=\"r-label\">Traditional Electric<\/div>\n          <div class=\"r-num\" id=\"electricAnnualCost\">$0<\/div>\n          <div class=\"r-sub\" id=\"electricAnnualKwh\">0 kWh\/year<\/div>\n          <div class=\"r-breakdown\">\n            <div><span>Per session<\/span><span id=\"electricSessKwh\">0 kWh<\/span><\/div>\n            <div><span>Monthly cost<\/span><span id=\"electricMonthCost\">$0<\/span><\/div>\n            <div><span>Annual CO\u2082<\/span><span id=\"electricAnnualCo2\">0 lbs<\/span><\/div>\n          <\/div>\n        <\/div>\n\n        <div class=\"result-card infrared\">\n          <div class=\"r-label\">Infrared Cabin<\/div>\n          <div class=\"r-num\" id=\"infraredAnnualCost\">$0<\/div>\n          <div class=\"r-sub\" id=\"infraredAnnualKwh\">0 kWh\/year<\/div>\n          <div class=\"r-breakdown\">\n            <div><span>Per session<\/span><span id=\"infraredSessKwh\">0 kWh<\/span><\/div>\n            <div><span>Monthly cost<\/span><span id=\"infraredMonthCost\">$0<\/span><\/div>\n            <div><span>Annual CO\u2082<\/span><span id=\"infraredAnnualCo2\">0 lbs<\/span><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- Savings banner -->\n      <div class=\"savings-banner\">\n        <div class=\"headline\" id=\"savingsHeadline\">Adjust inputs to see your savings<\/div>\n        <div class=\"detail\" id=\"savingsDetail\"><\/div>\n      <\/div>\n\n      <!-- Bar chart -->\n      <div class=\"chart-card\">\n        <h3>Side-by-Side Comparison (Annual)<\/h3>\n\n        <div class=\"bar-group\">\n          <div class=\"bar-label\"><span>Cost ($\/year)<\/span><\/div>\n          <div class=\"bar-track\"><div class=\"bar-fill electric\" id=\"barCostElectric\" style=\"width:0%;\"><\/div><\/div>\n          <div class=\"bar-value\" id=\"barCostElectricVal\">Electric: $0<\/div>\n          <div class=\"bar-track\"><div class=\"bar-fill infrared\" id=\"barCostInfrared\" style=\"width:0%;\"><\/div><\/div>\n          <div class=\"bar-value\" id=\"barCostInfraredVal\">Infrared: $0<\/div>\n        <\/div>\n\n        <div class=\"bar-group\">\n          <div class=\"bar-label\"><span>Energy (kWh\/year)<\/span><\/div>\n          <div class=\"bar-track\"><div class=\"bar-fill electric\" id=\"barKwhElectric\" style=\"width:0%;\"><\/div><\/div>\n          <div class=\"bar-value\" id=\"barKwhElectricVal\">Electric: 0 kWh<\/div>\n          <div class=\"bar-track\"><div class=\"bar-fill infrared\" id=\"barKwhInfrared\" style=\"width:0%;\"><\/div><\/div>\n          <div class=\"bar-value\" id=\"barKwhInfraredVal\">Infrared: 0 kWh<\/div>\n        <\/div>\n\n        <div class=\"bar-group\">\n          <div class=\"bar-label\"><span>CO\u2082 (lbs\/year)<\/span><\/div>\n          <div class=\"bar-track\"><div class=\"bar-fill electric\" id=\"barCo2Electric\" style=\"width:0%;\"><\/div><\/div>\n          <div class=\"bar-value\" id=\"barCo2ElectricVal\">Electric: 0 lbs<\/div>\n          <div class=\"bar-track\"><div class=\"bar-fill infrared\" id=\"barCo2Infrared\" style=\"width:0%;\"><\/div><\/div>\n          <div class=\"bar-value\" id=\"barCo2InfraredVal\">Infrared: 0 lbs<\/div>\n        <\/div>\n      <\/div>\n\n    <\/div>\n\n    <div class=\"disclaimer\">\n      Estimates based on typical residential heater specs and duty-cycle behavior. Actual results vary with insulation quality, ambient temperature, sauna volume, and local utility rates. Default carbon intensity (0.85 lbs CO\u2082\/kWh) is a rough U.S. grid average \u2014 replace with your local eGRID subregion value for a more precise footprint estimate.\n    <\/div>\n\n    <div class=\"sauna-branding\">\n      <a href=\"https:\/\/saunazilla.com\" target=\"_blank\" rel=\"noopener\" style=\"display:inline-block\">\n        <img decoding=\"async\" src=\"https:\/\/saunazilla.com\/wp-content\/uploads\/2024\/02\/Saunazilla-dark-red.png\" alt=\"Saunazilla\" style=\"height:18px;width:auto;display:block\">\n      <\/a>\n    <\/div>\n  <\/div>\n\n<\/div>\n\n<script>\n(function(){\n  \/\/ ---------- Presets ----------\n  const electricPresets = {\n    small:  { kw:4.5, preheat:30, session:35, duty:40 },\n    medium: { kw:6.0, preheat:35, session:40, duty:50 },\n    large:  { kw:9.0, preheat:45, session:45, duty:55 }\n  };\n  const infraredPresets = {\n    small:  { kw:1.5, preheat:8,  session:40, duty:85 },\n    medium: { kw:2.0, preheat:10, session:40, duty:90 },\n    large:  { kw:3.0, preheat:12, session:45, duty:90 }\n  };\n\n  \/\/ ---------- Element refs ----------\n  const el = id => document.getElementById(id);\n\n  const inputs = {\n    sessionsPerWeek: el('sessionsPerWeek'),\n    rate: el('rate'),\n    carbon: el('carbon'),\n\n    electricPreset: el('electricPreset'),\n    electricKw: el('electricKw'),\n    electricPreheat: el('electricPreheat'),\n    electricSession: el('electricSession'),\n    electricDuty: el('electricDuty'),\n\n    infraredPreset: el('infraredPreset'),\n    infraredKw: el('infraredKw'),\n    infraredPreheat: el('infraredPreheat'),\n    infraredSession: el('infraredSession'),\n    infraredDuty: el('infraredDuty'),\n  };\n\n  \/\/ ---------- Helpers ----------\n  function hrsFromMin(min){ return min \/ 60; }\n\n  function calcEnergyPerSession(P, preheatMin, dutyPct, sessionMin){\n    const tPre = hrsFromMin(preheatMin);\n    const tSess = hrsFromMin(sessionMin);\n    const D = dutyPct \/ 100;\n    return (P * tPre) + (P * D * tSess);\n  }\n\n  function fmtMoney(v){\n    return '$' + v.toLocaleString('en-US', {minimumFractionDigits:2, maximumFractionDigits:2});\n  }\n  function fmtNum(v, dec=1){\n    return v.toLocaleString('en-US', {minimumFractionDigits:dec, maximumFractionDigits:dec});\n  }\n\n  \/\/ ---------- Sync range + display ----------\n  function bindRange(rangeId, valId, formatter){\n    const range = el(rangeId);\n    const val = el(valId);\n    const update = () => { val.textContent = formatter(range.value); };\n    range.addEventListener('input', () => { update(); recalc(); });\n    update();\n  }\n\n  bindRange('sessionsPerWeek','sessionsPerWeekVal', v => v);\n  bindRange('electricKw','electricKwVal', v => parseFloat(v).toFixed(1));\n  bindRange('electricPreheat','electricPreheatVal', v => v);\n  bindRange('electricSession','electricSessionVal', v => v);\n  bindRange('electricDuty','electricDutyVal', v => v + '%');\n\n  bindRange('infraredKw','infraredKwVal', v => parseFloat(v).toFixed(1));\n  bindRange('infraredPreheat','infraredPreheatVal', v => v);\n  bindRange('infraredSession','infraredSessionVal', v => v);\n  bindRange('infraredDuty','infraredDutyVal', v => v + '%');\n\n  el('rate').addEventListener('input', recalc);\n  el('carbon').addEventListener('input', recalc);\n\n  \/\/ ---------- Presets ----------\n  function applyPreset(type){\n    const presetSelect = type === 'electric' ? inputs.electricPreset : inputs.infraredPreset;\n    const presets = type === 'electric' ? electricPresets : infraredPresets;\n    const key = presetSelect.value;\n    if(key === 'custom') return;\n    const p = presets[key];\n    const prefix = type;\n    el(prefix+'Kw').value = p.kw;\n    el(prefix+'Preheat').value = p.preheat;\n    el(prefix+'Session').value = p.session;\n    el(prefix+'Duty').value = p.duty;\n    el(prefix+'KwVal').textContent = p.kw.toFixed(1);\n    el(prefix+'PreheatVal').textContent = p.preheat;\n    el(prefix+'SessionVal').textContent = p.session;\n    el(prefix+'DutyVal').textContent = p.duty + '%';\n    recalc();\n  }\n\n  inputs.electricPreset.addEventListener('change', () => applyPreset('electric'));\n  inputs.infraredPreset.addEventListener('change', () => applyPreset('infrared'));\n\n  ['electricKw','electricPreheat','electricSession','electricDuty'].forEach(id=>{\n    el(id).addEventListener('input', () => inputs.electricPreset.value = 'custom');\n  });\n  ['infraredKw','infraredPreheat','infraredSession','infraredDuty'].forEach(id=>{\n    el(id).addEventListener('input', () => inputs.infraredPreset.value = 'custom');\n  });\n\n  \/\/ ---------- Advanced toggles ----------\n  function setupAdvToggle(toggleId, bodyId){\n    const toggle = el(toggleId);\n    const body = el(bodyId);\n    toggle.addEventListener('click', () => {\n      toggle.classList.toggle('open');\n      body.classList.toggle('open');\n    });\n  }\n  setupAdvToggle('electricAdvToggle', 'electricAdvBody');\n  setupAdvToggle('infraredAdvToggle', 'infraredAdvBody');\n\n  \/\/ ---------- Core recalculation ----------\n  function recalc(){\n    const sessionsPerWeek = parseFloat(inputs.sessionsPerWeek.value);\n    const rate = parseFloat(inputs.rate.value) || 0;\n    const carbon = parseFloat(inputs.carbon.value) || 0;\n\n    \/\/ Electric\n    const eKw = parseFloat(inputs.electricKw.value);\n    const ePre = parseFloat(inputs.electricPreheat.value);\n    const eSess = parseFloat(inputs.electricSession.value);\n    const eDuty = parseFloat(inputs.electricDuty.value);\n    const eEnergySession = calcEnergyPerSession(eKw, ePre, eDuty, eSess);\n\n    \/\/ Infrared\n    const iKw = parseFloat(inputs.infraredKw.value);\n    const iPre = parseFloat(inputs.infraredPreheat.value);\n    const iSess = parseFloat(inputs.infraredSession.value);\n    const iDuty = parseFloat(inputs.infraredDuty.value);\n    const iEnergySession = calcEnergyPerSession(iKw, iPre, iDuty, iSess);\n\n    \/\/ Cost per session\n    const eCostSession = eEnergySession * rate;\n    const iCostSession = iEnergySession * rate;\n\n    \/\/ Monthly (Cost_monthly = Cost * N_weekly * 4.33)\n    const eCostMonthly = eCostSession * sessionsPerWeek * 4.33;\n    const iCostMonthly = iCostSession * sessionsPerWeek * 4.33;\n\n    \/\/ Annual\n    const eCostAnnual = eCostMonthly * 12;\n    const iCostAnnual = iCostMonthly * 12;\n\n    \/\/ Energy monthly\/annual\n    const eEnergyMonthly = eEnergySession * sessionsPerWeek * 4.33;\n    const iEnergyMonthly = iEnergySession * sessionsPerWeek * 4.33;\n    const eEnergyAnnual = eEnergyMonthly * 12;\n    const iEnergyAnnual = iEnergyMonthly * 12;\n\n    \/\/ CO2 (lbs)\n    const eCo2Session = eEnergySession * carbon;\n    const iCo2Session = iEnergySession * carbon;\n    const eCo2Annual = eEnergyAnnual * carbon;\n    const iCo2Annual = iEnergyAnnual * carbon;\n\n    \/\/ ---------- Update result cards ----------\n    el('electricAnnualCost').textContent = fmtMoney(eCostAnnual);\n    el('electricAnnualKwh').textContent = fmtNum(eEnergyAnnual,0) + ' kWh\/year';\n    el('electricSessKwh').textContent = fmtNum(eEnergySession,2) + ' kWh';\n    el('electricMonthCost').textContent = fmtMoney(eCostMonthly);\n    el('electricAnnualCo2').textContent = fmtNum(eCo2Annual,0) + ' lbs';\n\n    el('infraredAnnualCost').textContent = fmtMoney(iCostAnnual);\n    el('infraredAnnualKwh').textContent = fmtNum(iEnergyAnnual,0) + ' kWh\/year';\n    el('infraredSessKwh').textContent = fmtNum(iEnergySession,2) + ' kWh';\n    el('infraredMonthCost').textContent = fmtMoney(iCostMonthly);\n    el('infraredAnnualCo2').textContent = fmtNum(iCo2Annual,0) + ' lbs';\n\n    \/\/ ---------- Savings banner ----------\n    const costDiff = eCostAnnual - iCostAnnual;\n    const co2Diff = eCo2Annual - iCo2Annual;\n    const energyDiff = eEnergyAnnual - iEnergyAnnual;\n    const pctLess = eEnergyAnnual > 0 ? (energyDiff \/ eEnergyAnnual * 100) : 0;\n\n    const headline = el('savingsHeadline');\n    const detail = el('savingsDetail');\n\n    if(costDiff >= 0){\n      headline.textContent = `Choosing Infrared saves you ${fmtMoney(costDiff)} per year`;\n      detail.textContent = `That's ${fmtNum(Math.abs(energyDiff),0)} fewer kWh (${fmtNum(Math.abs(pctLess),0)}% less energy) and ${fmtNum(Math.abs(co2Diff),0)} fewer lbs of CO\u2082 annually vs. the traditional electric heater.`;\n    } else {\n      headline.textContent = `Traditional Electric saves you ${fmtMoney(Math.abs(costDiff))} per year`;\n      detail.textContent = `Based on your current settings, the electric heater setup is actually cheaper \u2014 check your duty cycle and session length assumptions.`;\n    }\n\n    \/\/ ---------- Bar chart ----------\n    function setBar(fillId, valId, value, maxValue, label, unit, decimals){\n      const pct = maxValue > 0 ? Math.max(2, (value \/ maxValue) * 100) : 0;\n      el(fillId).style.width = pct + '%';\n      el(valId).textContent = `${label}: ${unit === '$' ? fmtMoney(value) : fmtNum(value, decimals) + ' ' + unit}`;\n    }\n\n    const maxCost = Math.max(eCostAnnual, iCostAnnual, 1);\n    setBar('barCostElectric','barCostElectricVal', eCostAnnual, maxCost, 'Electric', '$', 2);\n    setBar('barCostInfrared','barCostInfraredVal', iCostAnnual, maxCost, 'Infrared', '$', 2);\n\n    const maxKwh = Math.max(eEnergyAnnual, iEnergyAnnual, 1);\n    setBar('barKwhElectric','barKwhElectricVal', eEnergyAnnual, maxKwh, 'Electric', 'kWh', 0);\n    setBar('barKwhInfrared','barKwhInfraredVal', iEnergyAnnual, maxKwh, 'Infrared', 'kWh', 0);\n\n    const maxCo2 = Math.max(eCo2Annual, iCo2Annual, 1);\n    setBar('barCo2Electric','barCo2ElectricVal', eCo2Annual, maxCo2, 'Electric', 'lbs', 0);\n    setBar('barCo2Infrared','barCo2InfraredVal', iCo2Annual, maxCo2, 'Infrared', 'lbs', 0);\n  }\n\n  \/\/ ---------- init ----------\n  recalc();\n})();\n<\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Are you planning a home sauna and trying to make a choice between an electric sauna and the infrared? It&#8217;s certainly not a simple question, nor a straightforward answer. But, if power consumption, electricity costs, and the environmental footprint are your key variables, then this calculator is for you. &nbsp; Please note that no online [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":32956,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-templates\/alasivu.php","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-32958","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/saunazilla.com\/en\/wp-json\/wp\/v2\/pages\/32958","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/saunazilla.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/saunazilla.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/saunazilla.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/saunazilla.com\/en\/wp-json\/wp\/v2\/comments?post=32958"}],"version-history":[{"count":2,"href":"https:\/\/saunazilla.com\/en\/wp-json\/wp\/v2\/pages\/32958\/revisions"}],"predecessor-version":[{"id":32961,"href":"https:\/\/saunazilla.com\/en\/wp-json\/wp\/v2\/pages\/32958\/revisions\/32961"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/saunazilla.com\/en\/wp-json\/wp\/v2\/media\/32956"}],"wp:attachment":[{"href":"https:\/\/saunazilla.com\/en\/wp-json\/wp\/v2\/media?parent=32958"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}