============================================================ */ (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(); } })();
Polymeric Sand Calculator
Instantly calculate bags needed for any paver, patio, or driveway project — any unit, worldwide.
Step 1 — Paved Area Dimensions
Area Length
Area Width
Total Area Override (optional)
Step 2 — Joint Dimensions
Joint Width
Joint Fill Depth
Paver Pattern
Custom Joint Ratio (0.01–0.30 — e.g. 0.12 = 12%)
Step 3 — Bag & Product Settings
Brand / Product
Price per Bag (optional)
Waste / Buffer
Custom Bag Weight
!
Please fill in all required fields with valid positive values.
Results — Your Material Estimate
💰 Estimated Material Cost
Coverage Quick Reference
Joint Width Joint Depth Coverage / 50 lb bag Typical Use
¼ in (6 mm)1 in70–80 ft² (6.5–7.4 m²)Tight-fit pavers
⅜ in (10 mm)1.5 in50–60 ft² (4.6–5.6 m²)Standard brick/paver
½ in (12 mm)2 in35–45 ft² (3.3–4.2 m²)Large format stone
¾ in (19 mm)2 in25–35 ft² (2.3–3.3 m²)Rustic / irregular stone
1 in (25 mm)2.5 in15–25 ft² (1.4–2.3 m²)Wide-joint flagstone
Formula, References & Notes
  • Area: Area (ft²) = Length (ft) × Width (ft)
  • Joint Volume: V (in³) = Area (ft²) × 144 × JointWidth (in) × JointDepth (in) × JointRatio
  • Coverage Factor: CovFactor (in³/lb) = JointVolume / BagWeight — derived from ~48–60 in³/lb for standard joints
  • Bags (exact): Bags = JointVolume (in³) ÷ (BagWeight (lb) × CovFactor)
  • Bags (with buffer): Bags_final = ceil(Bags_exact × (1 + WasteBuffer))
  • Joint ratio represents joint open area as a fraction of total paved surface (10–15% typical)
  • Always leave ¼ in (6 mm) from paver top unfilled — this forms the hardened crust
  • Source: ICPI.org — Interlocking Concrete Pavement Institute
  • Source: Techniseal.com — Official product coverage data
  • Source: DominatorSand.com — Dominator polymeric sand specs
  • Results are estimates for planning & reference. Always verify with your product label before purchasing.

Polymeric Sand Calculator: Find Exact Coverage Instantly

Figuring out how much polymeric sand you need doesn’t have to be a guessing game. The Polymeric Sand Calculator on Zo Calculator gives you an instant, accurate estimate of the bags or pounds of polymeric sand required for your paver project — based on your actual patio, walkway, or driveway dimensions. Whether you’re a DIY homeowner or a landscaping professional, this tool eliminates costly over-ordering and frustrating shortfalls.


What This Calculator Tells You

Enter your project measurements and this tool instantly returns:

  • Total square footage of your paved surface
  • Estimated pounds or bags of polymeric sand needed to fill all joints
  • Coverage area per bag based on joint width and depth
  • Total joint volume in cubic inches or cubic feet
  • Bags required for popular brands like Dominator or Techniseal polymeric sand
  • Cost estimate (optional) based on your local price per bag

How the Calculator Works (The Formula & Logic)

To calculate polymeric sand for pavers, the tool uses the joint volume method. It calculates the total open space between pavers where sand needs to be packed.

Core Formula:

Joint Volume (cu. in.) = Total Paved Area (sq. ft.) × Joint Width (in.) × Joint Depth (in.) × 144 × Joint Ratio

Then:

Bags Required = Joint Volume ÷ Coverage Volume per Bag

  • Joint Ratio represents the percentage of the surface area occupied by joints (typically 0.10 to 0.15 for standard pavers — meaning 10–15% of the surface is open joint space).
  • Coverage per bag varies by brand: most 50 lb bags of polymeric sand cover 30–80 sq. ft. depending on joint size.
  • The polymeric sand calculator for pavers automatically adjusts coverage if you enter a non-standard joint width or depth.

Standard Coverage & Joint Size Reference Chart

Joint WidthJoint DepthCoverage per 50 lb BagRecommended Use
¼ inch1 inch70–80 sq. ft.Tight-fit pavers
⅜ inch1.5 inches50–60 sq. ft.Standard brick/paver
½ inch2 inches35–45 sq. ft.Larger format stone
¾ inch2 inches25–35 sq. ft.Rustic/irregular stone
1 inch2.5 inches15–25 sq. ft.Wide-joint flagstone

Coverage figures are approximate and vary by brand (Dominator, Techniseal, etc.) and product formulation.


Step-by-Step Practical Example

Scenario: You’re installing a 20 ft × 15 ft patio using standard brick pavers with ⅜-inch joints that are 1.5 inches deep.

Step 1 — Calculate Total Square Footage: 20 ft × 15 ft = 300 square feet

Step 2 — Calculate Total Joint Volume: 300 sq. ft. × 0.375 in. (joint width) × 1.5 in. (joint depth) × 144 × 0.12 (joint ratio) = 2,916 cubic inches of joint space

Step 3 — Divide by Bag Coverage: A standard 50 lb bag at ⅜-inch joints covers approximately 55 sq. ft. 300 ÷ 55 = 5.45 → Round up to 6 bags

You need 6 bags of 50 lb polymeric sand for this project. Always buy one extra bag as a buffer — it’s the most common pro tip in the trade.


How to Use Zo Calculator’s Polymeric Sand Tool

Using the polymeric sand coverage calculator on ZoCalculator.com takes under a minute:

  1. Enter the length and width of your paved area in feet (or switch to meters if needed).
  2. Select or type your joint width — the gap between individual pavers (in inches).
  3. Enter the joint depth — how deep the sand needs to fill (typically 1–2.5 inches, leaving ¼ inch from the top for the hardened crust).
  4. Choose your paver pattern — this helps auto-estimate the joint ratio (running bond, herringbone, basket weave, etc.).
  5. Hit Calculate — the tool instantly shows you your polymeric sand calculator square feet result, total joint volume, and the number of 50 lb bags you need.
  6. Optional: Enter a price per bag to get a material cost estimate for your budget.

Practical Applications and Real-World Uses

  • Homeowner patio projects: Accurately calculate polymeric sand for pavers on backyard patios before your single Home Depot run — no second trips needed.
  • Professional landscapers: Quickly generate material lists and quotes using the dominator polymeric sand calculator figures for client proposals.
  • Driveway installations: Account for the larger square footage and deeper joints typical of driveway pavers to ensure structural joint stability.
  • Pool surrounds and walkways: Calculate precise amounts for curved or irregularly shaped surfaces by breaking them into rectangular sections.
  • Retaining wall cap projects: Use the tool for horizontal joint filling between cap stones on garden walls and raised beds.
  • Contractors & estimators: Reduce material waste and protect project margins by getting a reliable bag count before every job.

Important Notes & Technical Limitations

  • Brand variation matters: Coverage rates differ between brands. The Techniseal polymeric sand calculator figures and Dominator polymeric sand calculator figures are based on manufacturer-published averages — always verify on the specific product bag.
  • Irregular shapes need manual splitting: This tool assumes rectangular or square areas. For L-shaped, circular, or free-form patios, split the area into rectangles and add results together.
  • Joint ratio is an estimate: The percentage of joint space vs. paver surface area varies by paver size, shape, and installation pattern. Results are best-estimate guides, not guaranteed quantities.
  • For planning and reference only: This calculator is an educational and estimation tool. Always consult product specifications and a qualified installer for large commercial or load-bearing installations.

Helpful References & Sources

  • ICPI (Interlocking Concrete Pavement Institute): icpi.org — The authoritative trade body for concrete paver standards and installation best practices in North America.
  • Techniseal Official Product Guide: techniseal.com — Manufacturer’s coverage charts and technical data sheets for their polymeric sand product line.
  • Sakrete / Dominator Polymeric Sand: dominator.com — Official coverage calculator reference and product specifications from one of the top-selling brands in the U.S.

🙋 Frequently Asked Questions (FAQs)

How do I calculate how much polymeric sand I need?

To calculate polymeric sand, multiply your total paved area (in square feet) by the joint width and joint depth (both in inches), then divide by the per-bag coverage listed on the product. Most 50 lb bags cover 30–80 square feet depending on joint size. Use a polymeric sand calculator to automate this instantly without doing the math by hand.

What is the coverage of a 50 lb bag of polymeric sand?

A standard 50 lb bag of polymeric sand typically covers between 30 and 80 square feet, depending on the joint width and depth. For ¼-inch joints, coverage can reach up to 80 sq. ft., while wide 1-inch joints may only yield 15–25 sq. ft. per bag. Always check the manufacturer’s label for the exact polymeric sand coverage calculator figures for your specific product.

How do I use the Dominator polymeric sand calculator?

The dominator polymeric sand calculator — either on their website or on a tool like Zo Calculator — requires you to input your project’s square footage, joint width, and joint depth. It then returns the number of bags needed using Dominator’s published per-bag coverage rates. This is the fastest way to estimate materials before heading to a supply store.

Is polymeric sand calculator square feet the right unit to use?

Yes — square feet is the standard input unit for any polymeric sand calculator for pavers, as coverage rates are published per square foot by all major manufacturers. Simply measure your length and width in feet, multiply them together for total area, and plug that number into the calculator. The tool handles the joint volume conversion automatically.

How deep should polymeric sand be filled in paver joints?

Polymeric sand should fill the paver joint to within ¼ inch of the top of the paver surface. This recessed space is critical — it allows the sand’s binding polymers to form a hardened surface crust without cracking or flaking. Most standard joints are 1 to 2 inches deep, so the sand fill depth is typically 0.75 to 1.75 inches.

What’s the difference between regular sand and polymeric sand for pavers?

Regular jointing sand is loose and washes out over time with rain, erodes from foot traffic, and allows weed seeds to take root easily in the joints. Polymeric sand contains synthetic polymer binders that, when activated by water, harden the sand into a semi-rigid, flexible joint that resists washout, weeds, and insect infiltration. For any permanent or high-traffic paver installation, polymeric sand is the professional standard.

Can I use a polymeric sand calculator for irregularly shaped patios?

Yes, but you need to break the irregular shape into multiple rectangles or squares first, calculate each section separately using the polymeric sand coverage calculator, and then add all the results together. Most free-form, L-shaped, or curved patios can be estimated this way with high accuracy. Add 5–10% to your total as a safety buffer for irregular cuts and waste.

How do I calculate polymeric sand for pavers in a herringbone pattern?

A herringbone or diagonal pattern typically creates slightly more joint exposure than a running bond pattern, increasing the joint ratio to about 0.13–0.15 instead of the standard 0.10–0.12. When you use a tool to calculate polymeric sand for pavers in herringbone, select “herringbone” from the pattern dropdown (on ZoCalculator.com) or manually increase your joint ratio estimate slightly. This small adjustment prevents you from running short on material.

Does Techniseal have its own polymeric sand calculator?

Techniseal offers product-specific coverage information on their website at techniseal.com, and the Techniseal polymeric sand calculator approach is based on their published data sheets for each product SKU. However, a general-purpose tool like the one on Zo Calculator lets you compare bag requirements across multiple brands side-by-side using standard joint dimensions, which is handy for price shopping.

What happens if I use too little polymeric sand?

If joints aren’t fully packed with polymeric sand, the unfilled voids become weak points where the hardened crust can crack, flake, and fail prematurely. Incompletely filled joints also allow water to penetrate below the bedding layer, which can destabilize the paver base and cause settling or heaving over time. Always use a polymeric sand calculator to get your quantities right, and tamp and re-sweep the sand a second time after the first compaction pass to ensure full joint saturation.


Explore Related Calculators on Zo Calculator