{"id":33,"date":"2026-04-22T21:12:39","date_gmt":"2026-04-22T20:12:39","guid":{"rendered":"https:\/\/samgoodfield.uk\/?page_id=33"},"modified":"2026-04-22T22:39:36","modified_gmt":"2026-04-22T21:39:36","slug":"pool-spa-calculator","status":"publish","type":"page","link":"https:\/\/samgoodfield.uk\/index.php\/pool-spa-calculator\/","title":{"rendered":"Pool &amp; Spa Calculator"},"content":{"rendered":"\n<p class=\"has-contrast-dark-color has-text-color has-link-color wp-elements-1 wp-block-paragraph\"><strong>Fast, Accurate Dosing for a Crystal Clear Soak<\/strong><\/p>\n\n\n\n<p class=\"has-contrast-dark-color has-text-color has-link-color wp-elements-2 wp-block-paragraph\">If you&#8217;ve ever had a &#8220;complete mare&#8221; trying to balance your water chemistry, you aren&#8217;t alone. Between pH levels, alkalinity, and chlorine shocks, getting the math right can feel like a chemistry degree is required.<\/p>\n\n\n\n<p class=\"has-contrast-dark-color has-text-color has-link-color wp-elements-3 wp-block-paragraph\">I built this <strong>easy-to-use chemical dosing tool<\/strong> after my own struggles to keep my water safe and clear. Whether you are looking for a <strong>Lay-Z-Spa chemical calculator<\/strong> or a professional-grade <strong>swimming pool chlorine calculator<\/strong>, this tool takes the guesswork out of maintenance.<\/p>\n\n\n\n<style>\n    \/* Scoped CSS - Only affects elements inside #pool-calculator-wrapper *\/\n    #pool-calculator-wrapper {\n        font-family: system-ui, -apple-system, sans-serif;\n        max-width: 650px;\n        margin: 2rem auto; \/* Centers the calculator in whatever container you put it in *\/\n        color: #333;\n        line-height: 1.6;\n        background-color: transparent;\n    }\n    #pool-calculator-wrapper .card {\n        background: white;\n        padding: 2rem;\n        border-radius: 12px;\n        box-shadow: 0 4px 10px rgba(0,0,0,0.1);\n        border: 1px solid #e2e8f0;\n    }\n    #pool-calculator-wrapper h1 {\n        text-align: center;\n        color: #0284c7;\n        margin-bottom: 0.5rem;\n        margin-top: 0;\n    }\n    #pool-calculator-wrapper p.subtitle {\n        text-align: center;\n        color: #666;\n        margin-bottom: 2rem;\n        font-size: 0.9rem;\n    }\n    #pool-calculator-wrapper h2 {\n        font-size: 1.2rem;\n        color: #0f766e;\n        border-bottom: 2px solid #e2e8f0;\n        padding-bottom: 0.5rem;\n        margin-top: 1.5rem;\n    }\n    #pool-calculator-wrapper label {\n        display: block;\n        margin-top: 1rem;\n        font-weight: 600;\n        font-size: 0.95rem;\n    }\n    #pool-calculator-wrapper input[type=\"number\"], \n    #pool-calculator-wrapper select {\n        width: 100%;\n        padding: 0.75rem;\n        margin-top: 0.5rem;\n        border: 1px solid #cbd5e1;\n        border-radius: 6px;\n        box-sizing: border-box;\n        font-size: 1rem;\n    }\n    #pool-calculator-wrapper .grid-2 {\n        display: grid;\n        grid-template-columns: 1fr 1fr;\n        gap: 1rem;\n    }\n    #pool-calculator-wrapper .checkbox-group {\n        display: flex;\n        align-items: center;\n        margin-top: 1.5rem;\n        padding: 1rem;\n        background: #f8fafc;\n        border-radius: 6px;\n        border: 1px solid #e2e8f0;\n    }\n    #pool-calculator-wrapper .checkbox-group input {\n        margin-right: 0.75rem;\n        width: 20px;\n        height: 20px;\n    }\n    #pool-calculator-wrapper .checkbox-group label {\n        margin: 0;\n        font-weight: normal;\n    }\n    #pool-calculator-wrapper .volume-display {\n        margin-top: 1rem;\n        padding: 1rem;\n        background: #e0f2fe;\n        border-radius: 6px;\n        text-align: center;\n        font-weight: bold;\n        color: #0369a1;\n        font-size: 1.1rem;\n    }\n    #pool-calculator-wrapper button {\n        margin-top: 2rem;\n        width: 100%;\n        padding: 1rem;\n        background: #0284c7;\n        color: white;\n        border: none;\n        border-radius: 6px;\n        font-size: 1.1rem;\n        font-weight: bold;\n        cursor: pointer;\n        transition: background 0.2s;\n    }\n    #pool-calculator-wrapper button:hover {\n        background: #0369a1;\n    }\n    #pool-calculator-wrapper #results {\n        margin-top: 2rem;\n        padding: 1.5rem;\n        background: #f0fdfa;\n        border: 1px solid #ccfbf1;\n        border-radius: 8px;\n        display: none;\n    }\n    #pool-calculator-wrapper .result-item {\n        margin-bottom: 1rem;\n        padding-bottom: 1rem;\n        border-bottom: 1px solid #ccfbf1;\n        display: flex;\n        align-items: flex-start;\n    }\n    #pool-calculator-wrapper .result-icon {\n        font-size: 1.5rem;\n        margin-right: 1rem;\n        line-height: 1.2;\n    }\n    #pool-calculator-wrapper .chem-amount {\n        font-size: 1.2rem;\n        font-weight: bold;\n        color: #0f766e;\n        display: block;\n        margin-top: 0.25rem;\n    }\n    #pool-calculator-wrapper .recommendation {\n        margin-top: 1rem;\n        padding: 1rem;\n        background: #fffbeb;\n        border-left: 4px solid #f59e0b;\n        border-radius: 4px;\n        font-size: 0.95rem;\n    }\n    #pool-calculator-wrapper .instruction-box {\n        margin-top: 1.5rem;\n        padding: 1rem;\n        background: #eff6ff;\n        border-left: 4px solid #3b82f6;\n        border-radius: 4px;\n        font-size: 0.95rem;\n    }\n    #pool-calculator-wrapper .instruction-box ul {\n        margin: 0.5rem 0 0 0;\n        padding-left: 1.2rem;\n    }\n    #pool-calculator-wrapper .instruction-box li {\n        margin-bottom: 0.5rem;\n    }\n    #pool-calculator-wrapper .unsafe-warning {\n        background-color: #fef2f2;\n        border: 1px solid #f87171;\n        border-left: 6px solid #dc2626;\n        padding: 1rem;\n        border-radius: 6px;\n        color: #991b1b;\n        margin-bottom: 1.5rem;\n        display: flex;\n        align-items: center;\n        font-weight: 500;\n    }\n    #pool-calculator-wrapper .unsafe-icon {\n        font-size: 2rem;\n        margin-right: 1rem;\n    }\n    #pool-calculator-wrapper .hidden-section {\n        display: none;\n    }\n    #pool-calculator-wrapper .disclaimer {\n        margin-top: 2rem;\n        font-size: 0.85rem;\n        color: #64748b;\n        text-align: center;\n        border-top: 1px solid #e2e8f0;\n        padding-top: 1rem;\n    }\n<\/style>\n\n<div id=\"pool-calculator-wrapper\">\n    <div class=\"card\">\n        <h1>Pool &#038; Spa Calculator<\/h1>\n        <p class=\"subtitle\">Set your volume and get exact chemical dosing.<\/p>\n\n        <h2>Step 1: Water Profile<\/h2>\n        <label for=\"body-type\">Water Body Type<\/label>\n        <select id=\"body-type\" onchange=\"handleBodyTypeChange()\">\n            <option value=\"hottub\">Hot Tub \/ Spa<\/option>\n            <option value=\"pool\">Swimming Pool<\/option>\n        <\/select>\n\n        <label for=\"method\">Volume Input Method<\/label>\n        <select id=\"method\" onchange=\"toggleMethod()\">\n            <option value=\"direct\">Direct Input (Liters)<\/option>\n            <option value=\"dimensions\">Calculate from Dimensions<\/option>\n        <\/select>\n\n        <div id=\"section-direct\">\n            <label for=\"direct-volume\">Total Volume (Liters)<\/label>\n            <input type=\"number\" id=\"direct-volume\" value=\"1000\" oninput=\"updateVolume()\">\n        <\/div>\n\n        <div id=\"section-dimensions\" class=\"hidden-section\">\n            <label for=\"shape\">Shape<\/label>\n            <select id=\"shape\" onchange=\"toggleShapeInputs()\">\n                <option value=\"rect\">Square \/ Rectangular<\/option>\n                <option value=\"circle\">Circular \/ Round<\/option>\n            <\/select>\n\n            <div class=\"grid-2\">\n                <div>\n                    <label id=\"label-length\" for=\"length\">Length (Meters)<\/label>\n                    <input type=\"number\" id=\"length\" step=\"0.1\" value=\"2.0\" oninput=\"updateVolume()\">\n                <\/div>\n                <div id=\"width-container\">\n                    <label for=\"width\">Width (Meters)<\/label>\n                    <input type=\"number\" id=\"width\" step=\"0.1\" value=\"2.0\" oninput=\"updateVolume()\">\n                <\/div>\n            <\/div>\n            \n            <label for=\"depth\">Average Water Depth (Meters)<\/label>\n            <input type=\"number\" id=\"depth\" step=\"0.1\" value=\"0.8\" oninput=\"updateVolume()\">\n        <\/div>\n\n        <div class=\"volume-display\">\n            Active Volume: <span id=\"calculated-volume\">1000<\/span> Liters\n        <\/div>\n\n        <h2>Step 2: Chemical Readings<\/h2>\n        <label for=\"chlorine\">Current Free Chlorine (ppm)<\/label>\n        <input type=\"number\" id=\"chlorine\" step=\"0.5\" placeholder=\"e.g., 1.5\">\n\n        <div class=\"grid-2\">\n            <div>\n                <label for=\"ph\">Current pH<\/label>\n                <input type=\"number\" id=\"ph\" step=\"0.1\" placeholder=\"e.g., 7.8\">\n            <\/div>\n            <div>\n                <label for=\"alkalinity\">Alkalinity (ppm)<\/label>\n                <input type=\"number\" id=\"alkalinity\" step=\"10\" placeholder=\"e.g., 60\">\n            <\/div>\n        <\/div>\n\n        <div class=\"checkbox-group\">\n            <input type=\"checkbox\" id=\"stabilized\">\n            <label for=\"stabilized\">I am using stabilized chlorine (Dichlor\/Trichlor)<\/label>\n        <\/div>\n\n        <button onclick=\"calculateChemicals()\">Calculate Balance<\/button>\n\n        <div id=\"results\"><\/div>\n\n        <p class=\"disclaimer\">\n            <strong>Disclaimer:<\/strong> This calculator provides estimates. Always check water levels with a reliable testing kit prior to bathing. Do not enter the water until chemicals have fully dissolved and circulated. \n        <\/p>\n    <\/div>\n<\/div>\n\n<script>\n    const GRAMS_PER_PPM_CHLORINE = 2.0; \n    const TARGET_PH = 7.4;\n    const GRAMS_PER_0_2_PH = 10.0;\n    const TARGET_ALK = 100.0;\n    const GRAMS_PER_10_PPM_ALK = 18.0;\n    const GRAMS_PER_TBSP = 15.0;\n\n    let currentVolumeLiters = 1000; \n\n    function handleBodyTypeChange() {\n        const type = document.getElementById('body-type').value;\n        const directVol = document.getElementById('direct-volume');\n        const len = document.getElementById('length');\n        const wid = document.getElementById('width');\n        const dep = document.getElementById('depth');\n\n        if (type === 'pool') {\n            directVol.value = 40000;\n            len.value = 8.0;\n            wid.value = 4.0;\n            dep.value = 1.5;\n        } else {\n            directVol.value = 1000;\n            len.value = 2.0;\n            wid.value = 2.0;\n            dep.value = 0.8;\n        }\n        updateVolume();\n    }\n\n    function toggleMethod() {\n        const method = document.getElementById('method').value;\n        const directSection = document.getElementById('section-direct');\n        const dimSection = document.getElementById('section-dimensions');\n\n        if (method === 'direct') {\n            directSection.style.display = 'block';\n            dimSection.style.display = 'none';\n        } else {\n            directSection.style.display = 'none';\n            dimSection.style.display = 'block';\n            toggleShapeInputs(); \n        }\n        updateVolume();\n    }\n\n    function toggleShapeInputs() {\n        const shape = document.getElementById('shape').value;\n        const widthContainer = document.getElementById('width-container');\n        const lengthLabel = document.getElementById('label-length');\n\n        if (shape === 'circle') {\n            widthContainer.style.display = 'none';\n            lengthLabel.innerText = 'Diameter (Meters)';\n        } else {\n            widthContainer.style.display = 'block';\n            lengthLabel.innerText = 'Length (Meters)';\n        }\n        updateVolume();\n    }\n\n    function updateVolume() {\n        const method = document.getElementById('method').value;\n\n        if (method === 'direct') {\n            currentVolumeLiters = parseFloat(document.getElementById('direct-volume').value) || 0;\n        } else {\n            const shape = document.getElementById('shape').value;\n            const lengthOrDia = parseFloat(document.getElementById('length').value) || 0;\n            const depth = parseFloat(document.getElementById('depth').value) || 0;\n            let volumeCubicMeters = 0;\n\n            if (shape === 'rect') {\n                const width = parseFloat(document.getElementById('width').value) || 0;\n                volumeCubicMeters = lengthOrDia * width * depth;\n            } else {\n                const radius = lengthOrDia \/ 2;\n                volumeCubicMeters = Math.PI * (radius * radius) * depth;\n            }\n            currentVolumeLiters = Math.round(volumeCubicMeters * 1000);\n        }\n        document.getElementById('calculated-volume').innerText = currentVolumeLiters.toLocaleString();\n    }\n\n    function formatAmount(grams) {\n        if (grams <= 0) return \"0g\";\n        const roundedGrams = Math.round(grams);\n        const tbsp = (grams \/ GRAMS_PER_TBSP).toFixed(1);\n        \n        if (roundedGrams > 1000) {\n            const kg = (roundedGrams \/ 1000).toFixed(2);\n            return `${kg} kg  (${roundedGrams}g)`;\n        }\n        return `${roundedGrams}g  (approx. ${tbsp} tbsp)`;\n    }\n\n    function calculateChemicals() {\n        const isPool = document.getElementById('body-type').value === 'pool';\n        const chlorine = parseFloat(document.getElementById('chlorine').value) || 0;\n        const ph = parseFloat(document.getElementById('ph').value) || 0;\n        const alkalinity = parseFloat(document.getElementById('alkalinity').value) || 0;\n        const isStabilized = document.getElementById('stabilized').checked;\n\n        const targetCl = isPool ? 2.5 : 4.0;\n        const minCl = isPool ? 1.0 : 3.0;\n        const maxCl = isPool ? 4.0 : 5.0;\n\n        const volRatio = currentVolumeLiters \/ 1000;\n        const resultsDiv = document.getElementById('results');\n        \n        let htmlOutput = '';\n        let itemsHTML = '';\n        let recommendationsHTML = '';\n        let isUnsafe = false;\n        let requiresChemicals = false;\n\n        if (alkalinity > 0 && alkalinity < 80) {\n            requiresChemicals = true;\n            const diff = TARGET_ALK - alkalinity;\n            const gramsNeeded = (diff \/ 10) * GRAMS_PER_10_PPM_ALK * volRatio;\n            itemsHTML += `\n                <div class=\"result-item\">\n                    <div class=\"result-icon\">\u2b06\ufe0f<\/div>\n                    <div><strong>Alkalinity Increaser (Baking Soda):<\/strong> <span class=\"chem-amount\">Add ${formatAmount(gramsNeeded)}<\/span><\/div>\n                <\/div>`;\n        } else if (alkalinity > 120) {\n            itemsHTML += `\n                <div class=\"result-item\">\n                    <div class=\"result-icon\">\u2b07\ufe0f<\/div>\n                    <div><strong>Alkalinity:<\/strong> <span style=\"color: #ea580c; font-weight:bold;\">Level is High.<\/span><\/div>\n                <\/div>`;\n            const aerationAction = isPool ? \"aerate the water (ensure return jets break the surface)\" : \"aerate the water (run jets with air valves open)\";\n            recommendationsHTML += `<div class=\"recommendation\"><strong>High Alkalinity:<\/strong> Use a pH decreaser to lower it. This will also lower your pH, so ${aerationAction} afterward to bring the pH back up.<\/div>`;\n        } else if (alkalinity > 0) {\n            itemsHTML += `\n                <div class=\"result-item\">\n                    <div class=\"result-icon\">\u2705<\/div>\n                    <div><strong>Alkalinity:<\/strong> Level is perfect (80 - 120 ppm).<\/div>\n                <\/div>`;\n        }\n\n        if (ph > 0 && ph < 7.2) {\n            requiresChemicals = true;\n            isUnsafe = true;\n            const diff = TARGET_PH - ph;\n            const gramsNeeded = (diff \/ 0.2) * GRAMS_PER_0_2_PH * volRatio;\n            itemsHTML += `\n                <div class=\"result-item\">\n                    <div class=\"result-icon\">\u2b06\ufe0f<\/div>\n                    <div><strong>pH Increaser (Soda Ash):<\/strong> <span class=\"chem-amount\">Add ${formatAmount(gramsNeeded)}<\/span><\/div>\n                <\/div>`;\n        } else if (ph > 7.6) {\n            requiresChemicals = true;\n            isUnsafe = true;\n            const diff = ph - TARGET_PH;\n            const gramsNeeded = (diff \/ 0.2) * GRAMS_PER_0_2_PH * volRatio;\n            itemsHTML += `\n                <div class=\"result-item\">\n                    <div class=\"result-icon\">\u2b07\ufe0f<\/div>\n                    <div><strong>pH Decreaser (Dry Acid):<\/strong> <span class=\"chem-amount\">Add ${formatAmount(gramsNeeded)}<\/span><\/div>\n                <\/div>`;\n        } else if (ph > 0) {\n            itemsHTML += `\n                <div class=\"result-item\">\n                    <div class=\"result-icon\">\u2705<\/div>\n                    <div><strong>pH:<\/strong> Level is perfect (7.2 - 7.6).<\/div>\n                <\/div>`;\n        }\n\n        if (chlorine < minCl) {\n            requiresChemicals = true;\n            isUnsafe = true;\n            const diff = targetCl - chlorine;\n            const gramsNeeded = diff * GRAMS_PER_PPM_CHLORINE * volRatio;\n            itemsHTML += `\n                <div class=\"result-item\">\n                    <div class=\"result-icon\">\u2b06\ufe0f<\/div>\n                    <div><strong>Chlorine Granules:<\/strong> <span class=\"chem-amount\">Add ${formatAmount(gramsNeeded)}<\/span><\/div>\n                <\/div>`;\n        } else if (chlorine > maxCl) {\n            isUnsafe = true;\n            itemsHTML += `\n                <div class=\"result-item\">\n                    <div class=\"result-icon\">\u2b07\ufe0f<\/div>\n                    <div><strong>Chlorine:<\/strong> <span style=\"color: #ea580c; font-weight:bold;\">Level is High.<\/span> No addition needed.<\/div>\n                <\/div>`;\n            const aerationAction = isPool ? \"run the filter pump and leave the pool uncovered\" : \"run the jets for a while with the hot tub cover off\";\n            recommendationsHTML += `<div class=\"recommendation\"><strong>High Chlorine:<\/strong> Your chlorine level is high. Please ${aerationAction} to help it dissipate.<\/div>`;\n        } else {\n            itemsHTML += `\n                <div class=\"result-item\">\n                    <div class=\"result-icon\">\u2705<\/div>\n                    <div><strong>Chlorine:<\/strong> Level is perfect (${minCl}-${maxCl} ppm).<\/div>\n                <\/div>`;\n        }\n\n        if (isUnsafe) {\n            htmlOutput += `\n                <div class=\"unsafe-warning\">\n                    <div class=\"unsafe-icon\">\ud83d\uded1<\/div>\n                    <div><strong>WARNING: UNSAFE TO USE.<\/strong><br>Your core sanitizer or pH levels are outside of safe bathing limits. Adjust chemistry and retest before entering.<\/div>\n                <\/div>`;\n        }\n\n        htmlOutput += '<h2>Required Adjustments<\/h2>' + itemsHTML;\n\n        if (requiresChemicals) {\n            const waitTime = isPool ? \"2 to 4 hours (with the pump running)\" : \"20 to 30 minutes (with the jets on)\";\n            htmlOutput += `\n                <div class=\"instruction-box\">\n                    <strong>\ud83e\uddea Dosing Instructions & Safety<\/strong>\n                    <ul>\n                        <li><strong>Order:<\/strong> Always adjust <strong>Alkalinity<\/strong> first, then <strong>pH<\/strong>, and finally <strong>Chlorine<\/strong>.<\/li>\n                        <li><strong>Wait Time:<\/strong> Allow chemicals to circulate for at least <strong>${waitTime}<\/strong> before re-testing.<\/li>\n                        <li><strong>Safety:<\/strong> Do not enter the water while chemicals are actively dissolving and circulating. Always test the water to confirm safe levels prior to bathing.<\/li>\n                    <\/ul>\n                <\/div>\n            `;\n        }\n\n        if (isStabilized) {\n            const waterType = isPool ? \"pool\" : \"hot tub\";\n            recommendationsHTML += `<div class=\"recommendation\"><strong>Stabilized Chlorine Warning:<\/strong> Because you are using stabilized chlorine, Cyanuric Acid (CYA) will build up over time. Even if test strips read OK, change a portion of the ${waterType} water periodically.<\/div>`;\n        }\n\n        if (recommendationsHTML !== '') {\n            htmlOutput += `<h3 style=\"margin-top: 1.5rem;\">Recommendations & Warnings<\/h3>` + recommendationsHTML;\n        }\n\n        resultsDiv.innerHTML = htmlOutput;\n        resultsDiv.style.display = 'block';\n    }\n\n    handleBodyTypeChange();\n    toggleMethod();\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading has-contrast-dark-color has-text-color has-link-color wp-elements-4\">Why Use Our Chemical Calculator?<\/h2>\n\n\n\n<p class=\"has-contrast-dark-color has-text-color has-link-color wp-elements-5 wp-block-paragraph\">Maintaining a healthy spa isn&#8217;t just about clear water; it\u2019s about safety. Incorrect dosing can lead to skin irritation, cloudy water, or damage to your heater.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Precision Dosing:<\/strong> Calculate the exact grams or milliliters required for your specific water volume.<\/li>\n\n\n\n<li class=\"has-contrast-dark-color has-text-color has-link-color wp-elements-6\"><strong>Multi-Device Friendly:<\/strong> Works perfectly for <strong>Hot Tubs, Intex pools, and Lay-Z-Spa<\/strong> models.<\/li>\n\n\n\n<li class=\"has-contrast-dark-color has-text-color has-link-color wp-elements-7\"><strong>Comprehensive Testing:<\/strong> Covers Chlorine, Bromine, pH Plus, pH Minus, and Total Alkalinity.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-contrast-dark-color has-text-color has-link-color wp-elements-8\">How to Calculate Your Hot Tub Chemicals<\/h3>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li class=\"has-contrast-dark-color has-text-color has-link-color wp-elements-9\"><strong>Enter Your Volume:<\/strong> Check your manual for your spa&#8217;s water capacity in Litres or Gallons.<\/li>\n\n\n\n<li><strong>Input Current Levels:<\/strong> Use a test strip or digital tester to find your current readings.<\/li>\n\n\n\n<li><strong>Get Your Results:<\/strong> Our tool will tell you exactly how much product to add to reach the <strong>ideal chemical range<\/strong>.<\/li>\n<\/ol>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"has-contrast-dark-color has-text-color has-link-color wp-elements-10 wp-block-paragraph\"><strong>Pro Tip:<\/strong> Always wait at least 30 minutes after adding chemicals before re-testing your water to allow for proper circulation!<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-contrast-dark-color has-text-color has-link-color wp-elements-11\">Supported Pools &amp; Spas<\/h2>\n\n\n\n<p class=\"has-contrast-dark-color has-text-color has-link-color wp-elements-12 wp-block-paragraph\">Our calculator is optimized for all major brands and types, including:<\/p>\n\n\n\n<ul class=\"wp-block-list has-contrast-dark-color has-text-color has-link-color wp-elements-13\">\n<li><strong>Inflatable Spas:<\/strong> Perfect for Lay-Z-Spa, Wave, and Clever Spa owners.<\/li>\n\n\n\n<li class=\"has-contrast-dark-color has-text-color has-link-color wp-elements-14\"><strong>Hard-Shell Hot Tubs:<\/strong> Reliable dosing for Balboa systems and more.<\/li>\n\n\n\n<li><strong>Above Ground Pools:<\/strong> Ideal for Bestway and Intex pool chlorine calculations.<\/li>\n\n\n\n<li><strong>Inground Swimming Pools:<\/strong> Accurate scaling for high-volume water treatments.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-contrast-dark-color has-text-color has-link-color wp-elements-15 wp-block-paragraph\"><strong>How much chlorine should I add to my hot tub?<\/strong> <br>The amount depends on your current reading and total water volume. Use the <strong>chlorine calculator<\/strong> above to avoid over-sanitizing.<\/p>\n\n\n\n<p class=\"has-contrast-dark-color has-text-color has-link-color wp-elements-16 wp-block-paragraph\"><strong>What is the ideal pH for a swimming pool?<\/strong> <br>For maximum comfort and chemical efficiency, you should aim for a pH level between <strong>7.2 and 7.6<\/strong>.<\/p>\n\n\n\n<p class=\"has-contrast-dark-color has-text-color has-link-color wp-elements-17 wp-block-paragraph\"><strong>Can I use this as a Lay-Z-Spa chemical calculator?<\/strong> <br>Yes! Simply select your specific Lay-Z-Spa model or enter the volume (typically 600L to 1,200L) to get instant dosing instructions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fast, Accurate Dosing for a Crystal Clear Soak If you&#8217;ve ever had a &#8220;complete mare&#8221; trying to balance your water chemistry, you aren&#8217;t alone. Between pH levels, alkalinity, and chlorine shocks, getting the math right can feel like a chemistry degree is required. I built this easy-to-use chemical dosing tool after my own struggles to [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-33","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/samgoodfield.uk\/index.php\/wp-json\/wp\/v2\/pages\/33","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/samgoodfield.uk\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/samgoodfield.uk\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/samgoodfield.uk\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/samgoodfield.uk\/index.php\/wp-json\/wp\/v2\/comments?post=33"}],"version-history":[{"count":7,"href":"https:\/\/samgoodfield.uk\/index.php\/wp-json\/wp\/v2\/pages\/33\/revisions"}],"predecessor-version":[{"id":102,"href":"https:\/\/samgoodfield.uk\/index.php\/wp-json\/wp\/v2\/pages\/33\/revisions\/102"}],"wp:attachment":[{"href":"https:\/\/samgoodfield.uk\/index.php\/wp-json\/wp\/v2\/media?parent=33"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}