============================================================ */ (function(){ 'use strict'; function init(){ var root = document.getElementById('zssb'); if(!root) return; /* ── State ──────────────────────────────────────── */ var s1Type = 'sleeper'; // 'sleeper' or 'offduty' var s2Type = 'sleeper'; /* ── Toggle button setup ────────────────────────── */ function setupToggle(slpId, offId, callback){ var slpBtn = document.getElementById(slpId); var offBtn = document.getElementById(offId); if(!slpBtn || !offBtn) return; slpBtn.addEventListener('click', function(){ slpBtn.classList.add('active'); offBtn.classList.remove('active'); callback('sleeper'); }); offBtn.addEventListener('click', function(){ offBtn.classList.add('active'); slpBtn.classList.remove('active'); callback('offduty'); }); } setupToggle('zssb-s1-sleeper', 'zssb-s1-offduty', function(t){ s1Type = t; }); setupToggle('zssb-s2-sleeper', 'zssb-s2-offduty', function(t){ s2Type = t; }); /* ── Format decimal hours → "Xh Ym" ─────────────── */ function fmtHrs(h){ if(isNaN(h) || h < 0) return '0h 0m'; var hh = Math.floor(h); var mm = Math.round((h - hh) * 60); if(mm === 60){ hh++; mm = 0; } if(hh === 0 && mm === 0) return '0h 0m'; if(hh === 0) return mm + 'm'; if(mm === 0) return hh + 'h'; return hh + 'h ' + mm + 'm'; } /* ── Add decimal hours to a time string ─────────── */ function addHrs(timeStr, hrs){ if(!timeStr || timeStr === '') return null; var parts = timeStr.split(':'); if(parts.length < 2) return null; var totalMins = parseInt(parts[0], 10) * 60 + parseInt(parts[1], 10) + Math.round(hrs * 60); totalMins = ((totalMins % 1440) + 1440) % 1440; var h = Math.floor(totalMins / 60); var m = totalMins % 60; return (h < 10 ? '0' : '') + h + ':' + (m < 10 ? '0' : '') + m; } /* ── Convert 24hr "HH:MM" → 12hr "H:MM AM/PM" ─── */ function to12hr(t24){ if(!t24) return null; var p = t24.split(':'); var h = parseInt(p[0], 10); var m = p[1]; var ampm = h >= 12 ? 'PM' : 'AM'; h = h % 12; if(h === 0) h = 12; return h + ':' + m + ' ' + ampm; } /* ── Warning helpers ─────────────────────────────── */ function showWarn(msg){ var w = document.getElementById('zssb-warn'); var wm = document.getElementById('zssb-wmsg'); if(w && wm){ wm.textContent = msg; w.classList.add('show'); } } function hideWarn(){ var w = document.getElementById('zssb-warn'); if(w) w.classList.remove('show'); } /* ── Status bar progress ─────────────────────────── */ function setStatus(step){ var pills = ['zssb-pill-1', 'zssb-pill-2', 'zssb-pill-3']; for(var i = 0; i < pills.length; i++){ var el = document.getElementById(pills[i]); if(el){ el.classList[i < step ? 'add' : 'remove']('active'); } } } /* ════════════════════════════════════════════════ MAIN CALCULATION — FMCSA 49 CFR §395.1(g) ════════════════════════════════════════════════ */ function calc(){ hideWarn(); setStatus(2); /* Read inputs */ var drivenBefore = parseFloat(document.getElementById('zssb-driven').value) || 0; var drivenBetween = parseFloat(document.getElementById('zssb-driven-between').value) || 0; var s1h = parseFloat(document.getElementById('zssb-s1-hrs').value) || 0; var s1m = parseFloat(document.getElementById('zssb-s1-min').value) || 0; var s2h = parseFloat(document.getElementById('zssb-s2-hrs').value) || 0; var s2m = parseFloat(document.getElementById('zssb-s2-min').value) || 0; var s1Start = document.getElementById('zssb-s1-start').value; var s2Start = document.getElementById('zssb-s2-start').value; /* Convert to decimal hours */ var split1 = s1h + (s1m / 60); var split2 = s2h + (s2m / 60); /* ── Validation ────────────────────────────────── */ if(split1 <= 0 && split2 <= 0){ showWarn('Please enter the duration for at least one split rest period.'); return; } if(split1 < 0 || split2 < 0){ showWarn('Rest period durations cannot be negative.'); return; } if(drivenBefore < 0 || drivenBetween < 0){ showWarn('Driving hours cannot be negative.'); return; } var totalDriven = drivenBefore + drivenBetween; if(totalDriven > 11){ showWarn('Total hours driven (' + totalDriven.toFixed(2) + ' hrs) exceeds the 11-hour driving limit.'); return; } /* ── FMCSA Split Sleeper Berth Logic ───────────── RULE 1: Combined rest >= 10 hours RULE 2: The longer period must be >= 7 hrs AND in sleeper berth RULE 3: The shorter period must be >= 2 hrs (sleeper or off-duty) ─────────────────────────────────────────────────── */ var totalRest = split1 + split2; var combinedOk = totalRest >= 10; var longSplit = Math.max(split1, split2); var shortSplit = Math.min(split1, split2); var longIsS1 = split1 >= split2; var longType = longIsS1 ? s1Type : s2Type; /* Long split: must be >= 7 hrs AND sleeper berth */ var longOk = (longSplit >= 7) && (longType === 'sleeper'); /* Short split: must be >= 2 hrs (any type) */ var shortOk = (shortSplit >= 2); /* Single-split detection (only one period entered) */ var oneSplit = (split1 > 0 && split2 === 0) || (split1 === 0 && split2 > 0); var isCompliant = false; var reason = ''; if(oneSplit){ isCompliant = false; reason = 'Only one split period entered. Please enter both Split 1 and Split 2 durations to check full FMCSA compliance.'; } else { var failReasons = []; if(!longOk){ if(longSplit < 7){ failReasons.push('Longer split (' + fmtHrs(longSplit) + ') is under the required 7-hour minimum.'); } else { failReasons.push('Longer split (' + fmtHrs(longSplit) + ') must be in the sleeper berth, not off-duty.'); } } if(!shortOk){ failReasons.push('Shorter split (' + fmtHrs(shortSplit) + ') is under the required 2-hour minimum.'); } if(!combinedOk){ failReasons.push('Combined rest (' + fmtHrs(totalRest) + ') is under the 10-hour minimum required.'); } isCompliant = longOk && shortOk && combinedOk; if(isCompliant){ reason = 'Both splits meet FMCSA requirements. Your 14-hour clock is paused during both rest periods and restarts at the end of Split 2.'; } else { reason = failReasons.join(' '); } } /* ── Remaining drive time ───────────────────────── */ var driveRemaining = Math.max(0, 11 - totalDriven); /* ── Timeline data (if start times provided) ──── */ var timelineData = null; if(s1Start && s1Start !== ''){ var s1End = addHrs(s1Start, split1); var midDrive = s2Start && s2Start !== '' ? s2Start : (s1End ? addHrs(s1End, drivenBetween) : null); var s2End = midDrive ? addHrs(midDrive, split2) : null; timelineData = { s1Start: to12hr(s1Start), s1End: to12hr(s1End), s2Start: s2Start && s2Start !== '' ? to12hr(s2Start) : (midDrive ? to12hr(midDrive) : null), s2End: to12hr(s2End), resumeTime: s2End ? to12hr(s2End) : null }; } /* ── Render results ──────────────────────────────── */ renderResults(isCompliant, reason, { split1: split1, split2: split2, totalRest: totalRest, longSplit: longSplit, shortSplit: shortSplit, longOk: longOk, shortOk: shortOk, combinedOk: combinedOk, longType: longType, drivenBefore: drivenBefore, drivenBetween: drivenBetween, totalDriven: totalDriven, driveRemaining:driveRemaining, s1Type: s1Type, s2Type: s2Type, oneSplit: oneSplit }, timelineData); setStatus(3); } /* ════════════════════════════════════════════════ RENDER RESULTS ════════════════════════════════════════════════ */ function renderResults(isCompliant, reason, d, tl){ /* Element refs */ var resEl = document.getElementById('zssb-res'); var banner = document.getElementById('zssb-banner'); var bannerStatus= document.getElementById('zssb-banner-status'); var bannerReason= document.getElementById('zssb-banner-reason'); var bannerSvg = document.getElementById('zssb-banner-svg'); var cardsEl = document.getElementById('zssb-cards'); var breakdownEl = document.getElementById('zssb-breakdown'); var timelineEl = document.getElementById('zssb-timeline'); var tlWrap = document.getElementById('zssb-timeline-wrap'); /* ── Compliance Banner ──────────────────────────── */ if(d.oneSplit){ banner.className = 'compliance-banner non-compliant'; bannerStatus.textContent = 'Incomplete — Enter Both Splits'; bannerSvg.innerHTML = ''; } else if(isCompliant){ banner.className = 'compliance-banner compliant'; bannerStatus.textContent = '✅ FMCSA Compliant — Valid Split'; bannerSvg.innerHTML = ''; } else { banner.className = 'compliance-banner non-compliant'; bannerStatus.textContent = '❌ Non-Compliant — Invalid Split'; bannerSvg.innerHTML = ''; } bannerReason.textContent = reason; /* ── Summary Cards ──────────────────────────────── */ var cards = []; if(!d.oneSplit){ cards.push({ v: fmtHrs(d.split1), u: d.s1Type === 'sleeper' ? 'SLEEPER' : 'OFF-DUTY', n: 'Split 1 Duration', cls: d.s1Type === 'sleeper' ? 'blue' : 'orange' }); cards.push({ v: fmtHrs(d.split2), u: d.s2Type === 'sleeper' ? 'SLEEPER' : 'OFF-DUTY', n: 'Split 2 Duration', cls: d.s2Type === 'sleeper' ? 'blue' : 'orange' }); cards.push({ v: fmtHrs(d.totalRest), u: 'TOTAL REST', n: 'Combined Off-Duty', cls: d.combinedOk ? 'green' : 'red' }); cards.push({ v: fmtHrs(d.driveRemaining), u: 'REMAINING', n: 'Drive Time Left', cls: d.driveRemaining > 4 ? 'green' : (d.driveRemaining > 2 ? 'orange' : 'red') }); } cardsEl.innerHTML = cards.map(function(c){ return '
' + '
' + c.v + '
' + '
' + c.u + '
' + '
' + c.n + '
' + '
'; }).join(''); /* ── Breakdown Table ────────────────────────────── */ var rows = []; if(!d.oneSplit){ rows.push({lbl: 'Split 1 (' + (d.s1Type === 'sleeper' ? 'Sleeper Berth' : 'Off-Duty') + ')', val: fmtHrs(d.split1), cls: ''}); rows.push({lbl: 'Split 2 (' + (d.s2Type === 'sleeper' ? 'Sleeper Berth' : 'Off-Duty') + ')', val: fmtHrs(d.split2), cls: ''}); rows.push({lbl: 'Combined Rest Total', val: fmtHrs(d.totalRest) + (d.totalRest >= 10 ? ' ✓' : ' ✗ (Need ≥10h)'), cls: d.combinedOk ? 'ok' : 'fail'}); rows.push({lbl: 'Longer Split ≥7 hrs in Sleeper Berth', val: d.longOk ? '✓ Pass' : '✗ Fail', cls: d.longOk ? 'ok' : 'fail'}); rows.push({lbl: 'Shorter Split ≥2 hrs (any type)', val: d.shortOk ? '✓ Pass' : '✗ Fail', cls: d.shortOk ? 'ok' : 'fail'}); rows.push({lbl: 'Hours Driven Before Split 1', val: fmtHrs(d.drivenBefore), cls: 'info'}); rows.push({lbl: 'Hours Driven Between Splits', val: fmtHrs(d.drivenBetween), cls: 'info'}); rows.push({lbl: 'Total Hours Driven', val: fmtHrs(d.totalDriven) + ' / 11 hrs max', cls: d.totalDriven < 11 ? 'ok' : 'fail'}); rows.push({lbl: 'Drive Time Remaining After Splits', val: fmtHrs(d.driveRemaining), cls: d.driveRemaining > 0 ? 'ok' : 'fail'}); rows.push({lbl: '14-Hour Clock Paused During Splits', val: isCompliant ? 'Yes — Both periods excluded' : 'Not applicable (fix issues above)', cls: isCompliant ? 'ok' : 'fail'}); } breakdownEl.innerHTML = rows.map(function(r){ return '
' + '' + r.lbl + '' + '' + r.val + '' + '
'; }).join(''); /* ── Timeline ───────────────────────────────────── */ if(!d.oneSplit){ tlWrap.style.display = 'block'; var items = []; items.push({ dot: 'drive', label: 'Started Driving', desc: 'Drove ' + fmtHrs(d.drivenBefore) + ' before first rest period.' }); items.push({ dot: 'sleep', label: 'Split 1 Begins' + (tl && tl.s1Start ? ' at ' + tl.s1Start : ''), desc: fmtHrs(d.split1) + ' ' + (d.s1Type === 'sleeper' ? 'in Sleeper Berth' : 'Off-Duty') + (tl && tl.s1End ? ' → Ends: ' + tl.s1End : '') }); if(d.drivenBetween > 0){ items.push({ dot: 'drive', label: 'Resumed Driving Between Splits', desc: 'Drove ' + fmtHrs(d.drivenBetween) + ' between the two rest periods.' }); } items.push({ dot: 'sleep', label: 'Split 2 Begins' + (tl && tl.s2Start ? ' at ' + tl.s2Start : ''), desc: fmtHrs(d.split2) + ' ' + (d.s2Type === 'sleeper' ? 'in Sleeper Berth' : 'Off-Duty') + (tl && tl.s2End ? ' → Ends: ' + tl.s2End : '') }); if(isCompliant){ items.push({ dot: 'done', label: '14-Hour Clock Restarts' + (tl && tl.resumeTime ? ' at ' + tl.resumeTime : ''), desc: 'Both splits complete. ' + fmtHrs(d.driveRemaining) + ' drive time remaining.' }); } else { items.push({ dot: 'off', label: 'Non-Compliant — Cannot Resume', desc: 'Fix the split issues above before resuming driving.' }); } timelineEl.innerHTML = items.map(function(it){ return '
' + '
' + '
' + '
' + it.label + '
' + '
' + it.desc + '
' + '
'; }).join(''); } else { tlWrap.style.display = 'none'; } /* ── Show results panel ─────────────────────────── */ resEl.classList.add('show'); setTimeout(function(){ resEl.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }, 100); } /* ════════════════════════════════════════════════ RESET ════════════════════════════════════════════════ */ function resetAll(){ /* Clear number inputs */ var numIds = ['zssb-driven', 'zssb-driven-between', 'zssb-s1-hrs', 'zssb-s1-min', 'zssb-s2-hrs', 'zssb-s2-min']; numIds.forEach(function(id){ var el = document.getElementById(id); if(el) el.value = ''; }); /* Clear time inputs */ ['zssb-s1-start', 'zssb-s2-start'].forEach(function(id){ var el = document.getElementById(id); if(el) el.value = ''; }); /* Reset toggle states */ s1Type = 'sleeper'; s2Type = 'sleeper'; ['zssb-s1-sleeper', 'zssb-s2-sleeper'].forEach(function(id){ var el = document.getElementById(id); if(el) el.classList.add('active'); }); ['zssb-s1-offduty', 'zssb-s2-offduty'].forEach(function(id){ var el = document.getElementById(id); if(el) el.classList.remove('active'); }); /* Hide warning and results */ hideWarn(); var resEl = document.getElementById('zssb-res'); if(resEl) resEl.classList.remove('show'); setStatus(1); } /* ── Event Listeners ──────────────────────────────── */ var calcBtn = document.getElementById('zssb-btn'); if(calcBtn) calcBtn.addEventListener('click', calc); var rstBtn = document.getElementById('zssb-reset'); if(rstBtn) rstBtn.addEventListener('click', resetAll); /* Enter key triggers calculation */ var numFields = ['zssb-driven', 'zssb-driven-between', 'zssb-s1-hrs', 'zssb-s1-min', 'zssb-s2-hrs', 'zssb-s2-min']; numFields.forEach(function(id){ var el = document.getElementById(id); if(el) el.addEventListener('keydown', function(e){ if(e.key === 'Enter') calc(); }); }); } /* end init() */ /* ── Safe DOM-ready execution ───────────────────────── */ if(document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', init); } else { init(); } })();
Pool Sand Calculator
Calculate exact sand for pool base or filter — volume, weight & bags instantly.
Pool Dimensions
Pool Shape
Unit System
Pool Diameter
Sand Base Depth
Bag Size (lbs)
i
Standard recommendation: 2 inches (5 cm) of mason sand under the liner for most above-ground pools. Increase to 3–4 in for uneven ground.
!
Please enter valid positive values for all required fields.
Results — Pool Base Sand
Formulas, Assumptions & References
  • Round base: V = π × (D/2)² × depth
  • Rect base: V = length × width × depth
  • Oval base: V = π × (A/2) × (B/2) × depth
  • Filter sand: V = π × (tank_dia/2)² × fill_depth
  • Weight: dry mason / silica sand ≈ 100 lb/ft³ (1,602 kg/m³)
  • Filter tanks should be filled to 60–70% capacity only — never overfill.
  • Recommended base depth: 2 in flat ground, 3–4 in uneven terrain.
  • Use #20 silica sand for filters; mason / mortar sand for base.
  • Source: Pool & Hot Tub Alliance (phta.org) installation guidelines.
  • Results are estimates for planning purposes only.

Pool Sand Calculator: Find Your Exact Sand Needs Instantly

Whether you’re setting up a new above ground pool or replacing the media in your filter system, knowing the exact amount of sand you need saves you time, money, and frustrating trips back to the hardware store. The Zo Calculator pool sand calculator handles both jobs — bed base estimation and filter sizing — so you walk in with a precise shopping list and walk out ready to work.


What This Calculator Tells You

Depending on your goal, this sand calculator for pool projects covers every measurement you need:

  • Total cubic feet or cubic yards of sand required for your pool base
  • Total weight in pounds or tons to help you order the right quantity
  • Filter sand volume based on your filter tank diameter and fill depth
  • Recommended sand depth for a stable, level pool base (typically 2–3 inches)
  • Sand quantity for round, oval, or rectangular pools — all shapes supported
  • Filter tank size match to help you confirm you have the right swimming pool sand filter size calculator inputs

How the Calculator Works (The Formula & Logic)

The tool runs two distinct calculations depending on your use case.

For Pool Base Sand (Sand Under Pool)

This covers the sand base or pool bed — the leveling layer that goes beneath your liner.

Volume (ft³) = Pool Length (ft) × Pool Width (ft) × Sand Depth (ft) Weight (lbs) = Volume (ft³) × 100 (dry sand weighs approximately 100 lbs per cubic foot)

For a round pool, the formula adjusts to:

Volume (ft³) = π × Radius² × Sand Depth (ft) (π ≈ 3.14159; Radius = Diameter ÷ 2)

This is the core logic behind the sand calculator for round pool and the above ground pool sand base calculator modes.

For Pool Filter Sand

This covers sand inside your filter tank — the media that traps debris and keeps water clear.

Filter Sand Volume (ft³) = π × (Tank Radius in ft)² × Fill Depth (ft) Weight (lbs) = Volume × 100

Most residential filters require sand to fill roughly 60–70% of the tank’s capacity. The pool filter sand calculator mode uses this industry-standard fill ratio automatically.


Standard Ratings & Classifications (Reference Chart)

Pool Base Sand Depth Guide

Pool TypeRecommended Sand DepthNotes
Above Ground (Flat Yard)2 inchesStandard for most installs
Above Ground (Uneven Ground)3–4 inchesExtra leveling needed
In-Ground (Sand Base)2–3 inchesBeneath liner only
Soft Ground / Clay Soil4+ inchesAdd geotextile barrier

Pool Filter Sand Volume Guide

Filter Tank DiameterTypical Sand LoadPool Size Range
16 inches50 lbsUp to 10,000 gallons
19 inches100 lbs10,000–20,000 gallons
24 inches150–200 lbs20,000–35,000 gallons
30 inches300+ lbs35,000+ gallons

The pool sand filter size calculator mode uses your tank’s diameter and fill depth to match these ranges precisely.


Step-by-Step Practical Example

Let’s say you’re installing a 15-foot diameter, round, above ground pool with a 2-inch sand base, plus you need to refill a 19-inch diameter filter tank to a depth of 14 inches.

Step 1 — Convert all measurements to feet

  • Pool radius: 15 ÷ 2 = 7.5 ft
  • Sand depth: 2 inches = 0.167 ft
  • Filter radius: 19 inches ÷ 2 = 9.5 inches = 0.792 ft
  • Filter fill depth: 14 inches = 1.167 ft

Step 2 — Calculate pool base sand volume

  • Volume = π × (7.5)² × 0.167
  • Volume = 3.14159 × 56.25 × 0.167
  • Volume ≈ 29.5 ft³
  • Weight ≈ 2,950 lbs (≈ 1.5 tons)

Step 3 — Calculate filter sand volume

  • Volume = π × (0.792)² × 1.167
  • Volume = 3.14159 × 0.627 × 1.167
  • Volume ≈ 2.3 ft³ ≈ 100 lbs of filter sand ✓ (matches the 19-inch tank standard)

So for this project, you’d need roughly 1.5 tons of mason sand for the base and one 100 lb bag of filter sand for the tank.


How to Use Zo Calculator’s Pool Sand Calculator Tool

Using the sand calculator for pool projects on ZoCalculator.com is straightforward:

  1. Select your calculation type — choose “Pool Base Sand” or “Pool Filter Sand” from the dropdown
  2. Enter your pool shape — round, rectangular, or oval
  3. Input your pool dimensions — diameter (or length × width) in feet or inches
  4. Set your sand depth — enter your desired base depth (we recommend 2 inches for most above ground pool installs)
  5. For filter mode — enter your filter tank’s internal diameter and the target fill depth in inches
  6. Click Calculate — the tool instantly displays total volume in cubic feet, cubic yards, and weight in pounds
  7. Read your result — use the weight figure when ordering bags or bulk delivery from your supplier

No account or sign-in is needed. Results appear instantly and you can adjust any field to re-run the calculation.


Practical Applications and Real-World Uses

  • DIY pool installation: Homeowners installing an above ground pool use the sand under pool calculator to buy the exact amount of mason sand needed for a stable, level base — no guesswork, no waste.
  • Filter maintenance: Pool service technicians use the pool sand filter calculator to determine how many bags of #20 silica sand to stock before a filter media replacement job.
  • Pool supply retailers: Store associates can use this tool to quickly recommend the correct sand quantity to customers based on their pool and filter specs.
  • Landscapers and pool contractors: Professionals building multiple pools per season use the pool base sand calculator to generate per-project material estimates for accurate quoting.
  • Seasonal re-openings: Pool owners replacing old filter media each spring use the swimming pool sand filter size calculator to confirm the correct sand load for their specific tank model.
  • Budget planning: Comparing bulk sand delivery vs. bagged sand is easier when you know the precise tonnage from the sand for pool base calculator before calling suppliers.

Important Notes & Technical Limitations

  1. Dry sand weight is assumed. The calculator uses an average of 100 lbs per cubic foot for dry silica or mason sand. Wet sand or specialty filter media (like ZeoSand or glass) may weigh differently — adjust accordingly.
  2. Base depth is user-defined. The tool does not enforce a minimum depth. Always follow your pool manufacturer’s installation guidelines, which typically specify 2–3 inches for the base.
  3. Filter fill ratio is fixed at 60–70%. The pool sand filter calculator uses the industry-standard fill level. Over-filling a filter tank reduces efficiency — never fill above the manufacturer’s recommended level.
  4. This tool is for planning and estimation only. Results are not a substitute for professional installation advice, especially on uneven terrain, slopes, or high-water-table sites.

Helpful References & Sources


🙋 Frequently Asked Questions (FAQs)

How much sand do I need for my pool base?

For most above ground pools, you need a 2-inch layer of sand under the liner. Using the formula Volume = π × Radius² × Depth (in feet), a 15-foot round pool requires approximately 29–30 cubic feet (about 1.5 tons) of mason sand. Our how much sand do I need for my pool calculator handles this automatically once you enter your dimensions.

How much sand does a pool filter need?

The amount of sand a pool filter needs depends on the tank’s diameter. A 16-inch tank typically holds 50 lbs, a 19-inch tank takes 100 lbs, and a 24-inch tank requires 150–200 lbs of #20 silica sand. Always fill to 60–70% of tank capacity — never overfill, as it restricts water flow and reduces filtration efficiency.

What type of sand goes under an above ground pool?

Mason sand (also called mortar sand or torpedo sand) is the recommended type for an above ground pool sand base. It’s fine, smooth, and compacts well without sharp edges that could damage the vinyl liner. Play sand is too fine and can shift, while coarse builder’s sand has jagged particles that may puncture the liner.

What type of sand goes inside a pool filter?

Pool filters use #20 silica sand — a specifically graded, angular sand that traps particles as water passes through. Standard #20 silica sand has particles between 0.45 and 0.55 mm. Some owners upgrade to ZeoSand or filter glass, both of which require smaller quantities due to higher filtration efficiency.

How often should pool filter sand be replaced?

Pool filter sand should typically be replaced every 3–5 years under normal residential use. Over time, the sharp edges of silica sand wear smooth, reducing its ability to trap fine particles. Signs it needs changing include cloudy water that doesn’t clear after backwashing, increased filter pressure, or poor water clarity despite balanced chemistry.

Can I use regular play sand for my pool base?

While play sand is technically usable, it is not the ideal choice. It is ultra-fine, which means it compacts unevenly, can wash away in rain before the pool is installed, and may shift over time under the weight of a full pool. Mason sand is the industry-preferred choice for a stable, durable pool base.

How deep should the sand base be for an above ground pool?

The standard recommendation is a 2-inch sand base for most above ground pools installed on a flat, level surface. If your ground is uneven, rocky, or has clay soil, increasing the depth to 3–4 inches provides better leveling and cushioning. Always check your pool manufacturer’s installation manual for the specific recommended depth for your model.

Is the pool sand calculator accurate for oval pools?

Yes. For oval pools, the calculator uses the formula: Volume = π × (Length/2) × (Width/2) × Depth, which is the standard ellipse area formula adapted for sand volume. Enter the full length and full width of your oval pool and your desired sand depth, and the tool will return an accurate result for both base sand and total weight.

What is the difference between a pool base sand calculator and a pool filter sand calculator?

A pool base sand calculator (or pool sand base calculator) estimates the sand needed underneath your pool liner to create a level, protective layer before installation. A pool filter sand calculator estimates the sand needed inside your filtration tank to filter debris from pool water. They use different formulas and serve entirely different purposes — both modes are available in the Zo Calculator tool.

How do I convert cubic feet of sand to bags?

Most bagged sand sold at home improvement stores comes in 50 lb bags. Since dry sand weighs approximately 100 lbs per cubic foot, one cubic foot of sand equals roughly two 50 lb bags. Divide your total weight result from the calculator by 50 to find the number of standard bags you need. For large projects, ordering bulk sand by the ton is often more economical.


Explore Related Calculators on Zo Calculator