============================================================ */ (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(); } })();
Paver Sand Calculator
Calculate exact sand quantity — bags, cubic yards, cubic feet & tons. Works for any paving project worldwide.
Project Dimensions
Length
Width
Sand Depth
Sand Type
Bag Size
!
Please enter valid positive values for Length, Width, and Depth.
Results
Joint Sand Inputs
Patio Length
Patio Width
Paver Size
Joint Width
Joint Fill Depth
Sand Type
Bag Size
!
Please enter valid positive values.
Results
Formulas, References & Notes

Bedding / Base Sand Formula

  • Area (ft²) = Length (ft) × Width (ft)
  • Volume (ft³) = Area (ft²) × Depth (ft)
  • Volume (yd³) = Volume (ft³) ÷ 27
  • Weight (lbs) = Volume (ft³) × Density (lbs/ft³)
  • Bags = Weight (lbs) ÷ Bag Size (lbs) — rounded up
  • Densities used: Coarse: 100 lb/ft³ · Fine: 90 lb/ft³ · Masonry: 95 lb/ft³

Joint Sand Formula (ICPI Method)

  • Joint fraction X = Joint Width ÷ (Paver Length + Joint Width)
  • Joint fraction Y = Joint Width ÷ (Paver Width + Joint Width)
  • Total joint fraction = jfx + jfy − (jfx × jfy)
  • Joint Volume (ft³) = Total Area × Joint Fraction × Joint Depth (ft)
  • Densities: Polymeric/Locking: 75 lb/ft³ · Fine Joint Sand: 80 lb/ft³

Key Conversions

  • 1 yd³ = 27 ft³  |  1 ft³ = 0.02832 m³
  • 1 short ton = 2,000 lbs  |  1 metric ton = 2,204.6 lbs
  • ICPI standard: 1 inch (25 mm) bedding layer — do not exceed for stable installation.
  • Source: Interlocking Concrete Pavement Institute — icpi.org
  • Results are planning estimates. Always purchase a 10% overage buffer.

Paver Sand Calculator: Find Exactly How Much Sand You Need Instantly

Figuring out how much paver sand you need doesn't have to be guesswork. This paver sand calculator gives you a precise answer in seconds — enter your area dimensions and sand depth, and you'll instantly get the total volume in cubic feet, cubic yards, and the number of bags required. Whether you're laying a backyard patio, a walkway, or a full driveway, this tool eliminates waste and overspending before you ever visit the store.


What This Calculator Tells You

Enter your project measurements and the Zo Calculator paver sand tool returns all of the following:

  • Total area of your paving project in square feet
  • Total sand volume needed in cubic feet and cubic yards
  • Weight in tons for bulk sand ordering from suppliers
  • Number of bags required (based on standard 50 lb or 60 lb bag sizes) — ideal for a paver sand bag calculator check before you shop
  • Base layer sand volume for your compacted paver base and sand calculator
  • Jointing sand quantity (for paver joint sand calculator needs — the finer top-layer sand that locks pavers in place)
  • Polymeric sand quantity when using a polymeric paver sand calculator estimate for weed-resistant, hardening jointing applications

How the Calculator Works (The Formula & Logic)

Calculating paver sand comes down to three values: area, depth, and unit conversion. Here's the exact logic the tool applies:

Step 1 — Calculate Area:

Area (sq ft) = Length (ft) × Width (ft)

Step 2 — Calculate Volume:

Volume (cubic ft) = Area (sq ft) × Sand Depth (ft)

(Sand depth in inches must be converted: Depth in ft = Depth in inches ÷ 12)

Step 3 — Convert to Cubic Yards (for bulk orders):

Volume (cubic yards) = Volume (cubic ft) ÷ 27

Step 4 — Calculate Weight (for bulk sand delivery):

Weight (tons) = Volume (cubic ft) × 100 ÷ 2000

(Assumes a standard dry sand density of approximately 100 lbs per cubic foot)

Step 5 — Calculate Number of Bags:

Bags needed = Total Weight (lbs) ÷ Bag Size (lbs)

Most home improvement retailers like Home Depot and Lowe's sell paver sand in 50 lb bags. The paver sand calculator Home Depot and Lowe's paver sand calculator shoppers typically reference both assume this standard bag size, so our tool uses it as the default while letting you switch to 60 lb if needed.


Standard Sand Depths & Layer Classifications

Different paver projects require different sand layer thicknesses. Use this table as your reference guide when deciding how deep to set each layer.

Layer TypeRecommended DepthPurposeCommon Sand Type
Paver Base Layer4–6 inchesPrimary compacted sub-baseCoarse concrete sand or crushed stone dust
Bedding / Setting Sand1 inchSmooth, level surface for paversCoarse washed concrete sand (ASTM C33)
Paver Joint Sand¼ – ½ inch (joints only)Fill gaps between paversFine jointing sand or polymeric sand
Polymeric Joint Sand¼ – ½ inch (joints only)Weed & ant resistant, hardens firmPolymeric paver sand (e.g., Quikrete, Sakrete)

Rule of thumb: For a standard residential patio, plan for a total sand and base depth of 5–7 inches — about 4–6 inches of compacted base material plus 1 inch of bedding sand. Your paver base and sand calculator total should reflect both layers combined.


Step-by-Step Practical Example

Let's say you're building a 12 ft × 15 ft patio and need 1 inch of bedding sand plus filling the paver joints.

Step 1 — Calculate the area:

  • Area = 12 ft × 15 ft = 180 sq ft

Step 2 — Convert sand depth to feet:

  • 1 inch of bedding sand = 1 ÷ 12 = 0.083 ft

Step 3 — Calculate volume:

  • Volume = 180 sq ft × 0.083 ft = 14.94 cubic ft

Step 4 — Convert to cubic yards:

  • 14.94 ÷ 27 = 0.55 cubic yards

Step 5 — Calculate weight:

  • 14.94 cubic ft × 100 lbs = 1,494 lbs ÷ 2,000 = 0.75 tons

Step 6 — Calculate bags needed:

  • 1,494 lbs ÷ 50 lbs per bag = ≈ 30 bags

So for a 180 sq ft patio at 1-inch bedding sand depth, you'd need approximately 30 bags of 50 lb paver sand or 0.55 cubic yards in bulk. Add a separate calculation for joint sand if using paver locking sand or polymeric sand between the pavers.


How to Use Zo Calculator's Paver Sand Tool

Using ZoCalculator.com to calculate paver sand is straightforward. Here's exactly what to do:

  1. Enter your project length and width in feet. For irregular shapes, break the area into rectangles and add the totals.
  2. Input your sand depth in inches. Use 1 inch for bedding/setting sand, or your full base depth if calculating paver base sand separately.
  3. Select your bag size — choose 50 lb (most common at Home Depot and Lowe's) or 60 lb for bulk contractor bags.
  4. Choose your sand type if prompted — standard concrete sand, paver leveling sand, paver locking sand, or polymeric paver sand. This adjusts density values for accurate weight results.
  5. Hit Calculate — your results appear instantly: total volume, weight in tons, and bags needed.
  6. Use the results to shop. Round up to the nearest full bag to account for spillage and waste. A 10% overage buffer is built into the display automatically.

Need to figure out how much paver sand you need for a custom L-shaped or curved patio? Simply split the area into smaller rectangles, run each through the paver sand calculator square feet field separately, then add the bag totals.


Practical Applications and Real-World Uses

Knowing how to calculate paver sand accurately matters in every one of these common scenarios:

  • Residential patio installation: Homeowners planning a DIY concrete paver patio use the patio paver sand calculator to avoid multiple costly store runs — getting it right in one trip.
  • Driveway paving projects: Contractors use the sand paver base calculator to spec out bulk sand delivery orders for larger surfaces, saving time and margin on every job.
  • Walkway and pathway projects: Landscapers calculating paver sand for narrow, winding garden paths use square footage inputs to price materials accurately before quoting a client.
  • Polymeric sand re-jointing: Homeowners refreshing old paver joints use the polymeric paver sand calculator to determine exactly how many Quikrete or similar paver sand bags they need, avoiding leftover waste of an expensive product.
  • Commercial hardscaping bids: Hardscape contractors bidding on parking areas, plazas, or pool surrounds use the paver base and sand calculator to generate materials lists that feed directly into project estimates.
  • DIY repair and leveling: When individual pavers sink or shift, the paver leveling sand calculator helps you buy just enough sand to re-level and reset affected sections without over-ordering.

Important Notes & Technical Limitations

This tool is designed for planning and estimation. Keep these points in mind before placing material orders:

  1. Density assumptions are approximate. The calculator uses a standard dry sand density of ~100 lbs per cubic foot. Actual bulk density varies by sand type, moisture content, and supplier. Polymeric paver sand and fine jointing sand may have slightly different densities than coarse concrete sand.
  2. Compaction is not factored in. The base layer sand volume calculated here reflects the loose, uncompacted state. Compacted sand occupies roughly 20–30% less volume. If you're calculating paver base sand that will be mechanically compacted, order 20–25% more material than the raw figure shown.
  3. Irregular shapes need manual splitting. The calculator works on rectangular inputs. L-shapes, curves, and circles must be broken into component rectangles or approximated — a process that adds minor estimation error.
  4. Results are estimates, not guarantees. Always purchase a 10% overage buffer beyond the calculated amount to account for spillage, uneven subgrades, and material variances. This tool is for reference and planning purposes only.

Helpful References & Sources

  • The Interlocking Concrete Pavement Institute (ICPI) — Industry standards for bedding sand specifications, base preparation, and jointing sand guidelines for professional paver installation.
  • ASTM International — Source for ASTM C33 (Standard Specification for Concrete Aggregates), the benchmark specification for paver bedding sand quality.
  • This Old House / Ask This Old House — Practical homeowner-focused guides on paver installation, sand depth recommendations, and step-by-step patio building tutorials.

🙋 Frequently Asked Questions (FAQs)

How much paver sand do I need per square foot?

For a standard 1-inch bedding sand layer, you need approximately 0.083 cubic feet of sand per square foot of paver surface. That works out to roughly 8.3 cubic feet — or about 5 to 6 bags of 50 lb sand — per 100 square feet. Use the paver sand calculator square feet input to get an exact figure for your specific project dimensions.

What is the difference between paver base sand and paver joint sand?

Paver base sand (also called bedding sand or setting sand) is a coarse concrete sand laid in a 1-inch layer directly beneath the pavers to create a smooth, level surface. Paver joint sand — including paver locking sand and polymeric paver sand — is a much finer material swept into the narrow gaps between pavers after installation to lock them in place and prevent weed growth. You'll need to calculate both layers separately; use the paver base sand calculator for the bedding layer and the paver joint sand calculator for the joint-filling quantity.

How do I calculate paver sand for an irregular-shaped patio?

Break your irregular patio into simple rectangular sections, measure the length and width of each rectangle, and calculate paver sand for each section individually. Add all the section results together for your total volume and bag count. For circular or curved areas, multiply the radius squared by 3.14159 to get the area in square feet, then enter that number into the paver sand calculator. This is how professional landscapers approach calculating paver sand for complex layouts.

Is polymeric paver sand worth using, and how much more do I need?

Polymeric paver sand is a jointing sand mixed with binding polymers that harden when activated with water, creating a firm, weed-resistant, insect-deterrent joint. It costs significantly more than standard jointing sand but lasts considerably longer and reduces maintenance. The quantity needed is roughly the same as standard joint sand — use the polymeric paver sand calculator estimates as a direct replacement figure. Most 50 lb bags of polymeric sand (such as Quikrete polymeric sand or similar brands) cover approximately 30–75 sq ft of jointing depending on paver thickness and joint width.

Can I use this calculator for a Quikrete or Sakrete sand project?

Yes. The paver sand calculator is brand-agnostic and works whether you're buying Quikrete paver sand, Sakrete, or any other bagged product. Simply select the 50 lb or 60 lb bag size to match the product you're purchasing, and the calculator will tell you exactly how many bags to buy. The quikrete paver sand calculator workflow is identical — just match the bag weight and the math handles itself.

How deep should my paver sand base be?

For the bedding (setting) sand layer, the ICPI standard recommends exactly 1 inch (25 mm) of screeded, uncompacted coarse concrete sand. The compacted aggregate base beneath it should be 4 inches deep for pedestrian patios and walkways, and 6–8 inches for driveways or areas with vehicle traffic. Enter each layer depth separately into the paver sand base calculator to get accurate volumes for both materials.

What type of sand should I use under pavers?

The industry-standard choice is coarse washed concrete sand meeting ASTM C33 specifications. It compacts well, drains effectively, and resists shifting. Do not use mason sand, play sand, or fine beach sand for the bedding layer — these compact poorly and cause paver instability over time. For jointing, use a purpose-made paver locking sand or polymeric paver sand depending on whether you want a standard or hardening finish.

How accurate is the paver sand bag calculator?

The paver sand bag calculator result is accurate within normal engineering estimation tolerances — typically ±5% on a regular rectangular area. Real-world accuracy depends on the evenness of your subgrade, how precisely you screeding the sand, and the actual density of your specific sand product. For this reason, the tool automatically displays a 10% recommended overage. Always round up to the nearest full bag; returning unused sealed bags is far easier than making a second store trip mid-project.

What is paver leveling sand used for, and is it different from bedding sand?

Paver leveling sand is functionally the same as bedding sand — coarse concrete sand used to create a flat, stable surface beneath pavers. The term "paver leveling sand" is more commonly used in retail and DIY contexts (such as on Home Depot and Lowe's product labels), while "bedding sand" or "setting sand" is the professional industry term. For your paver leveling sand calculator needs, use the same 1-inch depth input as you would for standard bedding sand.

Does the paver sand calculator work for both metric and imperial measurements?

The default inputs on ZoCalculator.com use imperial measurements (feet and inches), which is the standard used by most US home improvement retailers and contractors. If you're working in metric (meters and centimeters), convert your measurements to feet before entering them — 1 meter equals approximately 3.28 feet. A metric-input version and additional unit toggle options are on the roadmap for a future update.


Explore Related Calculators on Zo Calculator